何についての記事か
システム開発における命名の話。
具体的な名称やコードは、実際の状況とは異なる形で例示しています。
重要なのはその詳細ではないので、そこについてはご容赦ください。
先日私は、あるプロダクトで次のように命名した。
class FooBar {
}
ひどい名前でしょう。
何故このような選択をしたのか、その経緯を説明します。
背景
元々このクラスは別の名称でした。
仮に支払いを表すPayment
とでもしておきましょう。そしてシステムの支払い機能で使用されていました。
class Payment {
}
FooBarよりはちゃんとした名前ですね。
「支払い機能以外でも使用されている」という点に目をつぶれば。
このPayment
クラスはシステムの様々な機能で利用されていたのです。
会員登録でもPayment
、お問い合わせでもPayment
。
とても適切な名称ではありません。
そして先日、支払い機能を改修するタイミングで、支払い機能ではこのPayment
クラスは使用しないようになりました。
君の名は
いよいよ肝心の支払い機能でPayment
クラスを使用しないことになり、私はこの名称を変更する機会だと考えました。
そして考えます。適切な名称は何なのか。
君の名は・・・
名前は・・・
わからん。
そもそも何故こうした状況になっているのかというと、単に「コードを流用したいため」にバラまかれたのは想像に難くありません。
つまり正しさはすでに失われたので「適切な名称は存在しない」と結論付けました。
命名する
とはいえPayment
は明らかに適さないので、何か別の名前を付ける必要があります。
こういう時にCommon
やUtil
が浮かびそうですが、私はそれを避けました。これらの当たり障りのない名称は「とりあえずこれで良い」という悪い流れを生みます。
また意味のないものに、さも意味ありげな名前を付け、命名した気になるのを避けたかったのです。
そうして悩んだ結果、最終的にFooBar
クラスと命名することを選択しました。
(残念ながらこれを正しい形にするタイミングは今ではない、という判断も含めて)
まとめ
FooBar
という命名が正しかったのかはさておき、重要と考えるのは「良いも悪いも正しく伝える必要があり、それを誤魔化すべきではない」という点です。
私は設計で妥協したり誤魔化したりした結果がどうなるか、実際に見てきましたし今も見ています。
それを踏まえて、今回は「適切な名前がない」ことを示すような命名を選択しました。
"この責任を果たすことは「戦い」に足を踏み入れることを意味する。"
"保護すべきソフトウェアに対する責任がある。それがあなたの役割であり、義務である。それが、あなたが雇われている大きな理由だ。"1
-- Robert C. Martin(ボブおじさん)
余談ですが、良くないのは名称だけ、なんてことはなく、この何倍も大変なレガシーコードとの戦いがありました。
全くもって不毛な戦いでしかなかったので、何かの役に立てば幸いです。
ー完ー
-
『Clean Architecture』 アーキテクチャの戦い ↩