英語 Naming is important.
プログラミングにおいて、「命名」を最重要課題として認識し、慎重に取り組むようにしましょう。
「名前を付ける行為」、そして、それを経て生まれた「名前そのもの」、両方に重要な価値があります。
適切な名前を付けられたということは、その要素が正しく理解されて、正しく設計されているということです。逆に、ふさわしい名前が付けられないということは、その要素が果たすべき役割について、プログラマ自身が十分理解できていないということです。
適切な名前を付けることができたら、その設計の大部分が完成したと言っても過言ではありません。
名前は、コードを通じて、プログラマ同士がコミュニケーションするための最大の場となります。
コードを書いた人と読む人が同時にその場にいて、「リアルタイムの会話」ができることは稀です。たいていは「コードを通じての会話」となるので、名前が適切でないと、コード上の会話は成り立ちません。
このリアルタイムでないコミュニケーションを円滑にするため、名前には最大限の配慮がなされるべきです。
名前は、コードを読む人へのユーザーインタフェースです。各要素に対して適切に名前の付けられているコードは、その意図するところが伝わり、「何を」「どのように」やっているか明確に理解できます。読むとただちに意味がわかる、よいユーザーインタフェースです。
例えば、関数の命名で考えてみます。
適切に命名された、わかりやすい名前の関数は、その責務を名前で通知した上で、内部処理の詳細を隠蔽してくれます。その結果、以下のメリットが生まれます。
逆に、わかりにくい名前の関数があると、そのコード上での作業は、大きな負荷がかかります。具体的には、以下のような負荷が考えられます。
コードを読み書きしている時、プログラマは、常に脳への過負荷と戦っています。プログラマがコードに対峙している時、「どう動いているのか」という詳細で頭がいっぱいになってしまったら、考えがまとまらず、先に進めなくなります。
プログラマは、コードを読みたいから読んでいるのではありません。コードを読んで、よく理解した上で、修正したり、機能追加したりするのが目的です。名前が悪いと、読むことにすべてのリソースが奪われ、取り組むべき本来の作業を妨げられ、課題にたどり着かなくなってしまいます。
名前は、こだわると結構な負担となります。適切な名前を考えるのは高度な思考能力を必要としますし、時間もかかります。逆に、適当に付けても動きますし、そうすれば時間の節約になります。
しかし、不適切な命名は、コードに負債を抱えることと同じです。その後、コードが生き続ける限りずっと、コードを読む人、コードを使う人すべてに、マイナスの影響を与え続けるのです。
プログラミングは、まず、名前から入りましょう。コードに現れる様々な要素に、意図が正確に伝わるような名前を付けるようにします。
その際、コードを書いていながらも、常に、「使う側」「読む側」の視点に立って命名してください。具体的には、以下の点に注意します。
ある情報から、記憶の中のあるべき姿のイメージに変換することを、メンタルマッピングと言います。
コードを読む人が名前を見て、心の中でその人の既知の名前に変換しなければならない、つまりメンタルマッピングしなければならないようなことは、極力避けなければなりません。これは、コードの流れを追うことに集中したいプログラマの脳に対して、非常に負荷をかけ、集中を乱します。
メンタルマッピングは、「規約」や「問題領域」から外れた用語を使用した場合に発生します。独自の名前を使用すると、それはそのままでは解釈できず、標準的な名前にメンタルマッピングしなければなりません。よって、可能な限り、標準に基づいた用語で命名します。独自の名前を考えるより、標準に従う方が、共通認識を利用できるので、書く方も読む方も楽になります。
また、メンタルマッピングは、(ループカウンタ以外で)1文字の変数名を使う時も発生します。1文字の変数名は、単なるプレースホルダでしかありません。コードを読む人が、あるべき名前にメンタルマッピングしなければなりません。
プログラマは、ユーザーに対して価値を提供するために自らの能力を使います。命名に関して、知識をひけらかすなど、無用な独自色を出すことはありません。他の人が理解可能な命名をし、理解しやすいコードを書きましょう。
命名について、「名前可逆性」という考え方があります。これは、「名前は、その元となった内容の説明文を復元できなければならない」という命名指針のことです。
この条件を満たすために、「ループバックチェック」を行います。内容の説明文から名前を考えたら、今度は逆に名前から推測できる説明文を考えるようにするのです。説明→名前→説明の順で、1周回って元に戻る(ループバックする)ように説明が一致すればよい名前で、一致しなければ要注意となります。
例を挙げて考えてみましょう。『音声を使ってソフトウェアを操作する機能』という説明文から、名前を考えてみます。
音声を認識して、それで「操作する」という部分が伝わりません。よって、「音声でデータを入力する機能」と受け取られかねません。
「音声」と「操作」の関係が伝わりません。よって、「音声によって操作する機能」ではなく、「音声を操作する機能」と受け取られかねません。
説明文にある単語をそのまま使えば良い、というわけでもないのです。
コントロールという単語には「コピーコントロール」のような使い方もあります。よって、「音声によって操作する機能」ではなく、「音声を制限する機能」と受け取られかねません。
「音声を操作する」「音声に対して操作をする」という誤解がほぼなくなります。
ただし、この名前でも、「命令」が、「入力音声」ではなく、「出力音声」にかかる、と解釈されてしまう可能性はあります。
出典書籍
『まつもとゆきひろコードの世界.スーパー・プログラマになる14の思考法』まつもとゆきひろ, 日経BP社(2009)
関連書籍
『プログラマが知るべき97のこと』和田卓人他, オライリー・ジャパン(2010)
『ネーミングの掟と極意』開米瑞浩, 翔泳社(2007)
『リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック』Dustin Boswell他, オライリー・ジャパン(2012)
『Code Craft 〜エクセレントなコードを書くための実践的技法〜』Pete Goodliffe, 毎日コミュニケーションズ(2007)
『Clean Code アジャイルソフトウェア達人の技』Robert C. Martin, アスキー・メディアワークス(2009)
Copyright © ITmedia, Inc. All Rights Reserved.