TL;DR: 変数や関数を追加するときは、周りにある他の変数や関数の名前を修正すべきでないか検討せよ
いきなりですが問題です。あるソフトウェアモジュールに以下の三つの関数があります。
- show
- showWithSlideAnimation
- showWithoutAnimation
画面をスライドさせながら出現させるにはどの関数を使用すれば良いでせうか? 関数の名前だけを見て答へてください。
はい、その通り。showWithSlideAnimation が正解です。
では、画面をアニメーションなしで出現させたい場合はどの関数が良いでせうか?
はい、showWithoutAnimation が正解ですね。
今度は、画面を回転させながら出現させたいとします。適する関数はあるでせうか?
ブーーーッ! 残念、正解は「どの関数も適さないので新しく関数を実装する必要がある」でした。
これで最後です。画面をフェードイン効果で出現させたい場合はどの関数がよいでせう?
なんと、今度は show が正解でした!
理不尽な問題だと感じましたか? もし、フェードイン効果を持つ関数が show ではなく showWithFadeAnimation などと命名してあれば、きっと誰もが全問正解できたでせう。実際のところこの様な分かりにくい名前の関数群 (あるいは変数群) は長い間メンテナンスされてきた歴史あるコードの中にしばしば登場します。バージョン管理システムの履歴を辿ると、例へば以下の様な経緯が露呈します。
- 始めは、画面の表示の仕方について仕様書に厳密な指示がなかった。とにかく画面を表示させることだけ指示されたので、表示処理を行ふ関数を一つ作った。このとき関数を単純に show と命名した。
- 実装を完了し動作させてみたところ、画面の出現の仕方が味気ないとの意見が聞かれた。仕様が変更され、画面が出現する際にフェードイン効果を適用することとなった。これに伴って show 関数の内部実装もフェードイン効果を適用するコードに変更された。
- 数箇月後、客から新しい画面を追加して欲しいとの要望が来た。しかし新しい画面の表示にはフェードイン効果ではなくスライドアニメーションを使用して欲しいとのこと。show 関数を流用することができないので、新しく showWithSlideAnimation 関数が追加された。
- さらにその後、別な画面を追加して欲しいとの要望。今度はアニメーションなしで表示する様にとのこと。show 関数も showWithSlideAnimation 関数も流用できないので、新たに showWithoutAnimation 関数が作られた。
単に仕様書の内容を実装する観点では、上記の各項目ごとになされてきた関数の追加・変更の仕方はごく自然に見えます。ところが、最終的な全体の結果を見てみると、show 関数だけが他の二つの関数と異なって分かりにくい名前を持つ様になってしまいました。どうしてでせうか。
そもそもの誤りは、showWithSlideAnimation 関数を追加した時に show 関数を改名しなかったことです。show と showWithSlideAnimation の二関数は、(実装された挙動が対照的であるにも拘らず) 明らかに命名が対照的ではありません。この時点で、 show 関数は showWithFadeAnimation などと改名されるべきでした。
この様な名前の非対称性の問題は、コーディングやコードレビューにおいてしばしば見逃されます。コーダーもレビューアーも新しく追加する機能だけに気を取られて、新しいものと既存のものを併せたコード全体の整合性に目を向けないからです。
この問題を機械的に解決する方法は、私には思ひ浮かびません。コーダーやレビューアーが都度気を付けるしかないでせう。
まとめ:
- 関数の中にローカル変数を追加するとき、他の変数の名前を再検討せよ
- モジュール (クラス、インターフェース、etc.) の中に関数 (メソッド) を追加するとき、他の関数の名前を再検討せよ
- モジュールを追加するとき、同じ名前空間にある他のモジュールの名前を再検討せよ