命名はソフトウェア開発において、全開発者が毎日行う重要な作業です。モジュール名、クラス名、変数名など様々な種類の命名を考えなければいけません。
私はテックリードとして働いているので、チームメンバーが命名に苦戦している場面を良く目にします。命名に関するプラクティスはたくさんあるのですが、まだ紹介されているのを私は見たことがないプラクティスを紹介したいと思います。と、書くとイノベーティブなプラクティスを書くように思われるかもしれませんが、すみません、そんなことはありません。恐らくある程度経験を積んだ開発者はみんなやっていることかと思います。
そのプラクティスは「検算」です。
なぜ検算が必要かというと、命名が上手くいっていない方の多くが、実態からのみ命名をしてしまっているからです。検算というのは、この逆向きを確認することを言っています。つまり「命名から実態を引けるか」という確認です。私のプラクティスは端的に書くと、「実態→命名」をして「実態→命名」をすると上手くいくことが多いです、ということです。これでわかる方は以降の説明は不要かと思いますが、流石に言葉足らずかと思うので、もう少し説明させてください。
具体例で見てみましょう
こういうときに良い例を挙げるのは、かなり難しいのですが、頑張って考えてみます。 例えばブログサービスを開発していて、記事を非公開にする処理を書いているとしましょう。非公開時には記事のステータスを変更して、ユーザーにそれを通知する必要があるとします。
class Post: def XXX(self): # このメソッドの命名をしたい。 # 状態の更新 self.is_published = false # ユーザー通知 # notify_users(self.author)
ここで、この XXX
というメソッド名を命名するとしましょう。ここで良くやりがちな間違いが update_and_notify
という命名をしてしまうことです。「そんなことしないよ」と思った方、確かにこの例は簡単過ぎるので、バカバカしいと感じるかもしれないのですが、詳しく分析してみると、広い意味では同じことをしているコードを見たり書いてしまった経験があるはずです。それでは詳しく見てみましょう。
実は update_and_notify
という命名はある意味では正しいのです。なぜなら、このメソッドには update
と notify
という処理が含まれているからです。「実態 → 名前」という方向においては正しいのです。そして、実際にこういう命名をしてしまう方が多くいます。
しかし、この命名は良くないものです。なぜなら「名前から実態を引くこと」ができないからです。update_and_notify
というメソッド名からこの実際の処理を推測できる人がいるでしょうか。「名前から実態を引くこと」を考えると、命名は、多くの方が最初に思いついたかもしれませんが、unpublish
や make_private
のような名前にするべきだと思います。検算を行うことで、このような update_and_notify
という悪い命名を防ぐことができます。
検算がもたらす効用
検算がもたらす効用についてもう少し考えてみます。「名前から実態を予測できる」命名に注意を払うことは、書籍 "A Philosophy of Software Design" において言及されている認知負荷を抑制する上で非常に重要です。この本では、ソフトウェアの複雑性を高める要因の一つとして認知負荷が挙げられています。認知負荷は、ソフトウェアを理解、使用、開発する際に必要な精神的労力のことを指し、この負荷が高いと生産性が低下します。
良い命名は、この認知負荷を大幅に減らすことができます。もしよかったら検算を使ってみてください。