C# code refactoring with Scope Functions

6b37e5c21ba723dacede78124b25d5a8?s=47 Masaya Yashiro
September 26, 2018

C# code refactoring with Scope Functions

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

6b37e5c21ba723dacede78124b25d5a8?s=128

Masaya Yashiro

September 26, 2018
Tweet

Transcript

  1. 2.

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

    趣味でさわってる • 最近気になる言語: Rust • 緩募: 継続するダイエット
  2. 11.
  3. 13.

    Also public static T Also<T>(this T self, Action<T> action) {

    action(self); return self; } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  4. 14.

    Also public static T Also<T>(this T self, Action<T> action) {

    action(self); return self; } 自分自身を引数に取る Actionに自分 自身を渡す
  5. 15.

    Also public static T Also<T>(this T self, Action<T> action) {

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

    Let

  7. 17.
  8. 18.

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

    action) { return action(self); } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  9. 19.

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

    action) { return action(self); } 自分自身をFuncに渡し、Funcの戻り 値がLetの戻り値となる。
  10. 23.

    Alsoを使わない void Start() { Transform t1 = GetComponent<Transform>(); Quaternion q1

    = new Quaternion(); q1.x = 0; q1.y = 0; q1.x = 0; t1.rotation = q1; }
  11. 24.

    Alsoを使う void Start() { Transform t2 = GetComponent<Transform>().Also((it) => {

    it.rotation = new Quaternion().Also((that) => { that.x = 0; that.y = 0; that.z = 0; }); }); }
  12. 37.

    Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } ジェネリクスのExtensionなので、どの Objectからも呼び出せる
  13. 38.

    Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } TをthisとしてActionを呼び出す
  14. 39.

    Apply(実現できたら) public static T Apply<T>(this T self, Action action) {

    self.action(); return self; } 自分自身を返す
  15. 40.

    Applyを使えたら void Start() { Transform t2 = GetComponent<Transform>().Apply(() => {

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