はじめに
- 「リーダブルコード」が目に入ったのでなんとなく読み直した。だいぶ前に読んだきりだったが、理解されるコードを書こう、というコンセプトは今でも古くならないし改めて勉強になった。
- "13章 短いコードを書く" において、多分守備範囲じゃないから詳しく書いていないんだろうなという部分があって、わりと間違いやすいところなのでもうちょっと詳しく書いてあると嬉しいのになーと思ったのでつづきを書いてみる。
"13章 短いコードを書く" の内容
- 汎用的なユーティリティコードを作り、重複コードを削除することによって、コードを短くして理解しやすくする。
- いっていることは本当にその通り。
- それではその汎用的なユーティリティコードはどうやって作るのか?
共通汎用コードというアンチパターン
- 重複するコードを何も考えずにひとつの "汎用ユーティリティライブラリ" に詰め込んでいくと、あとあとでまずいことになることが多い。
例1) 誰も使わない汎用コード
- 汎用ユーティリティライブラリ「GenericUtils」にはプロジェクトで重複して記述された汎用的なコードが詰まっている。
- しかしながらライブラリ名から何をするコードなのかが推測しづらく、詳細なドキュメントや派手な宣伝もないため、書いた人以外誰も使い方や使いどころを知らない。
- 「GenericUtils」を使えば 1 行で終わる処理もあったが、誰もそんなことは知らなかったので毎回毎回汎用的な処理が再実装されている。
例2) 膨らみ続ける汎用コード
- 汎用ユーティリティライブラリ「CompanyNameUtility」社内のプロジェクトを横断して汎用的に再利用できそうなコードをまとめた汎用ユーティリティライブラリだ。これは当社の叡智の詰まった誇るべきライブラリなので、全てのプロジェクトで利用することが義務付けられている。
- 実際便利なコードもそこここにありはするするしそのまま使うぶんには問題ないのだが、個々のプロジェクト向けにちょっとカスタマイズしたいとなった場合に、あまりにも広く使われているため変更する際の影響範囲が計りしれず、変更をためらわれてしまう。
- そのため個々のプロジェクトに合わせたほとんど同じロジックのコードが雪だるま式に増えていってしまい、もう誰も管理できない状態になっている。
汎用コードはドメイン特化コード
- 汎用コードとはただ重複したコードのことではなく特定のドメイン(分野・領域)に特化したコードのこと。
- 例えば「リストの操作で頻出するコード」だったり「座標計算のための複雑なコード」だったりというもののことであり、ライブラリ化する場合はそのドメインごとに分割することで管理しやすく再利用されやすいコードになる。
ドメインに特化していないけど重複するコードはどうするか
- 特定のドメインのコードであると仕分けられない場合、まずはそのコードが複数のことを同時にやろうとしていないかどうかを考えてみて、本当にそうであった場合は分割してみる。
- それでもやっぱり特定のドメインのコードであると判別できない場合は、汎用的に使われることはおそらく無いので、プロジェクト固有のユーティリティとしてまとめて管理するのはそこまで悪いアイディアでは無い。
"ユーティリティ" にはもっといい名前があるかもしれない
- 説明する上で都合がいいとはいえ本当は「ユーティリティ」という名前よりももっといい名前があるかもしれないので一度考えて見たほうがいい。
- 「ユーティリティ」だと「なんか便利なもの」以上の意味がないしなんでも入れられるので深く考えずにただの「共通コードのゴミ溜め」になってしまうことがある。
- ちゃんと考えれば「特定のテーブルをオブジェクトとして扱った時に共通して利用されるコード」だったり「データを HTML に変換する時によく現れがちなコード」だったりに分けられるかもしれない。
- それぞれのドメインごとに適切にまとめていくことで、より理解しやすいコードがかけるようになる。