役に立たない一時変数
次のPythonコードのスニペットで、now変数を考えてみましょう:
now = datetime.datetime.now() root_message.last_view_time = now
今は変える価値のある変数ですか? いいえ。理由は次のとおりです。
•複雑な表現を分解しているわけではありません。
•明示的な追加は行われません。式datetime.datetime.now()は十分明確です。
•一度だけ使用されるため、冗長コードは圧縮されません。
これまでになくても、コードはわかりやすくなりました。
root_message.last_view_time = datetime.datetime.now()
現在のような変数は、通常、コードが編集された後に残る「残り物」です。 変数は、元々複数の場所で使用されていた可能性があります。 あるいは、コーダーが複数回使用することを予期していたかもしれませんが、実際にはそれを必要としませんでした。
中間結果の削除
次に、配列から値を削除するJavaScript関数の例を示します。
var remove_one = function (array, value_to_remove) { var index_to_remove = null; for (var i = 0; i < array.length; i += 1) { if (array[i] === value_to_remove) { index_to_remove = i; break; } } if (index_to_remove !== null) { array.splice(index_to_remove, 1); } };
変数index_to_removeは、中間結果を保持するために使用されます。 このような変数は、取得するとすぐに結果を処理することで、時には排除することができます。
var remove_one = function (array, value_to_remove) { for (var i = 0; i < array.length; i += 1) { if (array[i] === value_to_remove) { array.splice(i, 1); return; } } };
コードを早期に返すことで、index_to_removeを完全になくして単純化しました
コードはかなりです。
一般的に、できるだけ早くタスクを完了することは良い戦略です。
制御フロー変数の削除
場合によっては、このコードパターンがループ内に表示されることがあります。
boolean done = false; while (/* condition */ && !done) { ... if (...) { done = true; continue; } }
完了した変数は、ループ全体の複数の場所でtrueに設定される場合もあります。
このようなコードは、しばしば、ループの途中から脱却すべきではない、暗黙のルールを満たすようにしています。 そのようなルールはありません!
doneのような変数は、「制御フロー変数」と呼ばれるものです。その唯一の目的はプログラムの実行を操作することです。実際のプログラムデータは含まれていません。 我々の経験では、構造化プログラミングをより有効に活用することで、制御フロー変数を削除することができます。
while (/* condition */) { ... if (...) { break; } }
このケースはかなり簡単に修正できましたが、単純なブレークでは十分ではない複数のネストされたループがある場合はどうなりますか? このようなより複雑なケースでは、ソリューションはしばしば、コードを新しい関数(ループ内のコード、またはループ全体のコード)に移動する必要があります。
参考文献:
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
The Art of Readable Code: Simple and Practical Techniques for Writing Better Code (English Edition)
The Art of Readable Code: Simple and Practical Techniques for Writing Better Code Kindle (English Edition)