通常、各式に最も外側の操作として最大で1つの副作用が含まれている場合、コードはより明確になります。
どういう意味ですか?
これは、各式が一度に1つのタスクを実行する必要があることを意味します。
次の2つの宣言を検討してください。
int a = 10;
int b = 20;
ここでのタスクは、これら2つを追加して1int
ずつ増やすb
ことです。これを行うには2つの方法があります。
int c = a + b++;
と
int c = a + b;
b++;
JLSは後者を好み、推奨しています。
これが意味することは次のとおりです。
int x = someFunction(a, b);
someFunction(a, b)
副作用がない場合、つまり何も変わらない場合は、より明確になります。むしろ、上記の唯一の変更は、への割り当てx
です。
別の例は、プレフィックス/ポストフィックスインクリメンターの使用です。
int x = a + b;
よりも明確です
int x = (a++) + (++b);
にのみx
割り当てられているため。2番目の例a
でb
は、とは同じステートメントで変更されています。
副作用を制限することで、コードの機能についてより簡単に推論したり、ステートメントの呼び出しを並べ替えたりすることができます。たとえば、以下のように並列化することもできます。メソッドに副作用がない場合は、呼び出すことができます。メソッドa()
、b()
およびc()
任意の順序で、および/または並列に引数を表します。
int res = f(a(), b(), c());
式の副作用は、ほとんどの場合、式の評価中の変数への割り当てです。
コードに注意してください:
int x = 5, y = 7;
while ((z = x-- + --y) > 0 ) {
console.out("What is 'z' now? " + z);
console.out("How many times will this be printed?");
}
状態の評価には3つの副作用があります。
x
y
z
ねじれているようですね。