この記事は過去ブログからの移転記事です
はじめに
ZERO BUGSを購入して読んでみたところ、構造 vs リアルコードという章があり興味深かったので抜粋して少し考えてみる。
2種類のコード
この章の中で著者はコードを構造コードとリアルコードの二つに分類している。
自分が書いているコードがどちらに当たるのかを考えてみることで、本来の目的を見失わずに済むかもしれない。
構造コードとは
構造コードとは、ものをつなぎ合わせるためのコード。
処理を共通化を行うコードや、デザインパターンなどがそれにあたり、繰り返し出現する構造を抽出して柔軟性を高めたい場合などに記述される。
著者は1行の構造コードは2つの異なる場所で必要とされた場合にのみ描かれるべきだと言う。
リアルコードとは
リアルコードとは、実際に何かを行うコード。
ファイルを開いたり、画面に何かを描画したり、月までの距離を計算したりするのがリアルコード。
構造コードに対比させるならば、1行のリアルコードは目的の達成に必要とされた場合にのみ書かれるべきだと思う。
高品質のコードを目指すために
高品質なコードを目指すためには、構造コードを可能な限り減らすことが必要となる。
コードの良さを表す関数gの最適化問題
以下の式ではrはリアルコード、sは構造コード、fは必要とされる柔軟性、そしてtはタスクを完了させるために必要なコードを表す。
g(r, s) = r - s
s >= f
r == t
ここでの目的は、gを最大化させることである。
rに対しsが大きすぎるならば、それだけgも小さくなってしまう。
必要な柔軟性だけを担保し、タスクに対してコードを書いていくと良いことがわかる。
構造コードを書くべき時
著者は、後方互換性が必要な局面において3か所以上で参照されることがわかっている場合には、構造コードを書くべきだとしている。
これはKISSやYAGNIにも共通する考え方である。
後々のことを考えて、というのは構造コードを追加する理由にはならないということだ。
「初めて何かを行うときは、ただやるのみだ。2回目に何か似たようなことを行うとき重複に気付いてたじろぎ、それでも同ようにやるだろう。似たようなことを行うのが3回目なら、リファクタリングしよう。」
同じコードを3回書いた時、これらを共通化できないか、するならばどんな構造コードが必要かを問いかけるようにすると良いだろう。
まとめ
無意味な構造コードを書きがちな自分にとっては良い戒めであり、すっと理解できた。
設計や構造をあれこれするよりも、言語のAPIを上手く利用したり、品質の良いライブラリを活用することで、1行のリアルコードが為すタスクを最大にすることを考える必要がある。
著者は2種類に分けるのは教えるのに便利だからであり、どちらのカテゴリにも当てはまらないものがある。だから原理を一度理解したならば、その先へ進んで欲しいと言う。
しばらくは、この2つの分類でコードを考えてみようと思う。