Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

C# code refactoring with Scope Functions

Masaya Yashiro
September 26, 2018

C# code refactoring with Scope Functions

Kotlin で標準実装されているScope FunctionのうちのいくつかをC#(Unity) 向けに移植した話。

Masaya Yashiro

September 26, 2018
Tweet

More Decks by Masaya Yashiro

Other Decks in Technology

Transcript

  1. 誰 • Twitter: @yashims85 • 会社: モバイルファクトリー@ 五反田 • Unity:

    趣味でさわってる • 最近気になる言語: Rust • 緩募: 継続するダイエット
  2. Also public static T Also<T>(this T self, Action<T> action) {

    action(self); return self; } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  3. Also public static T Also<T>(this T self, Action<T> action) {

    action(self); return self; } 自分自身を引数に取る Actionに自分 自身を渡す
  4. Also public static T Also<T>(this T self, Action<T> action) {

    action(self); return self; } 戻り値として自分を返す。
  5. Let

  6. Let public static R Let<T, R>(this T self, Func<T, R>

    action) { return action(self); } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  7. Let public static R Let<T, R>(this T self, Func<T, R>

    action) { return action(self); } 自分自身をFuncに渡し、Funcの戻り 値がLetの戻り値となる。
  8. Alsoを使わない void Start() { Transform t1 = GetComponent<Transform>(); Quaternion q1

    = new Quaternion(); q1.x = 0; q1.y = 0; q1.x = 0; t1.rotation = q1; }
  9. Alsoを使う void Start() { Transform t2 = GetComponent<Transform>().Also((it) => {

    it.rotation = new Quaternion().Also((that) => { that.x = 0; that.y = 0; that.z = 0; }); }); }
  10. Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  11. Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } TをthisとしてActionを呼び出す
  12. Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } 自分自身を返す
  13. Applyを使えたら void Start() { Transform t2 = GetComponent<Transform>().Apply(() => {

    this.rotation = new Quaternion().Apply(() => { x = 0; y = 0; z = 0; }); }); } this以外の事について言及する余地 が無くなる