Skip to content

Instantly share code, notes, and snippets.

@tkawachi
Created February 24, 2015 04:35
Show Gist options
  • Save tkawachi/cee048d842c4f5e18f5d to your computer and use it in GitHub Desktop.
Save tkawachi/cee048d842c4f5e18f5d to your computer and use it in GitHub Desktop.
行間の見えない依存は少ないほうが良い。
1: var a = f()
2: var b = g()
3: var c = h()
f(), g(), h() が副作用を含むとすれば、行間に依存関係がある可能性がある。例えば g() は f() を読んだあとでないと動かないなどの例があげられる。ファイルの open(), close() などを思い浮かべると、依存関係(open() してからでないと close() できない)が想像しやすい。
行数で言えば 1 -> 2, 1 -> 3, 2 -> 3 の依存を疑わなければならない。行を入れ替えると挙動が変わるおそれがある。
上の例で、f(),g(),h()が副作用を含まないとすれば、行間の依存はない。
行間の依存がなければ、行の順番を入れ替えるのは自由だ。
----
可能性を考えなければならない依存関係の個数は行数が増えると指数的に増える。
100行あるプログラムを想像しよう。全ての行で副作用があるかもしれないと仮定すれば、依存関係が存在する可能性がある行の組み合わせは C(100, 2) = 4950 個ある。
仕様変更やリファクタリングで書き換えが発生したときに、多数の依存関係を気にしなければいけない。
----
副作用のない処理だけをしていても、行間で参照がある場合には依存関係がある。
1: var a = f()
2: var b = g(a)
のとき 1行目で定義された a が 2行目で参照されているので、1 -> 2 の依存がある。
これはコンパイラに理解できる依存関係だ。行を入れ替えたらコンパイルエラーになる。
コンパイルエラーになれば、悩まされることもない。
----
* なるべく副作用のない関数を書く/使う
* 副作用のある一連の処理はなるべく短く
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment