検索
連載

名前がないものは見えない――名前重要問題解決力を高めるコツはプログラミングの原則・思考にあり(6)(2/3 ページ)

本連載では、さまざまなプログラミングの原則・思考の中から、特に問題解決力を高めるのに役立つものをピックアップ。プログラマーは、その思考法をビジネスに応用し、そうではない人はプログラマーと一緒に働く際に思い出してほしい。「ジョシュアツリーの法則」「バベルの塔」に見るように、名前や共通言語は重要だ。今回はプログラミングにおける「メンタルマッピング回避」「ループバックチェック」などから「命名」の重要性を確認しよう。

Share
Tweet
LINE
Hatena

名前重要

 英語  Naming is important.

 What 〜コードで命名は最重要課題

 プログラミングにおいて、「命名」を最重要課題として認識し、慎重に取り組むようにしましょう。

 「名前を付ける行為」、そして、それを経て生まれた「名前そのもの」、両方に重要な価値があります。

  • 名前を付ける行為

 適切な名前を付けられたということは、その要素が正しく理解されて、正しく設計されているということです。逆に、ふさわしい名前が付けられないということは、その要素が果たすべき役割について、プログラマ自身が十分理解できていないということです。

 適切な名前を付けることができたら、その設計の大部分が完成したと言っても過言ではありません。

  • 名前そのもの

 名前は、コードを通じて、プログラマ同士がコミュニケーションするための最大の場となります。

 コードを書いた人と読む人が同時にその場にいて、「リアルタイムの会話」ができることは稀です。たいていは「コードを通じての会話」となるので、名前が適切でないと、コード上の会話は成り立ちません。

 このリアルタイムでないコミュニケーションを円滑にするため、名前には最大限の配慮がなされるべきです。

 Why 〜コードを読む人への「UI」

 名前は、コードを読む人へのユーザーインタフェースです。各要素に対して適切に名前の付けられているコードは、その意図するところが伝わり、「何を」「どのように」やっているか明確に理解できます。読むとただちに意味がわかる、よいユーザーインタフェースです。

 例えば、関数の命名で考えてみます。

 適切に命名された、わかりやすい名前の関数は、その責務を名前で通知した上で、内部処理の詳細を隠蔽してくれます。その結果、以下のメリットが生まれます。

  • コードを読んでいる時、関数名を見ただけで、その先の処理の概要が把握できるので、適宜読み飛ばすことができます。
  • コードを書いている時、その関数を使用する場面においては、名前に導かれ、目的や使用方法がすぐに理解できるので、呼び出すのが簡単です。書きあがったコードは、よい名前のおかげで説明的になっており、読みやすくなっています。

 逆に、わかりにくい名前の関数があると、そのコード上での作業は、大きな負荷がかかります。具体的には、以下のような負荷が考えられます。

  • コードを読んでいる時、関数名を見ただけで処理内容がわからなければ、それを理解するために、関数の内部を解析しなければならなくなります。つまり、「深く」読むことを強いられるのです。関数の階層が浅ければそれほど問題にはなりませんが、階層が深くなると、プログラマには大きな負担になります。
  • コードを書いている時、使用したい関数の名前から、諸々の判断が下せない場合、やはりその内部を解析する必要が出てきます。何とか使用できても、書きあがったコードは、呼び出している関数名が悪いために、支離滅裂で読みにくくなります。

 コードを読み書きしている時、プログラマは、常に脳への過負荷と戦っています。プログラマがコードに対峙している時、「どう動いているのか」という詳細で頭がいっぱいになってしまったら、考えがまとまらず、先に進めなくなります。

 プログラマは、コードを読みたいから読んでいるのではありません。コードを読んで、よく理解した上で、修正したり、機能追加したりするのが目的です。名前が悪いと、読むことにすべてのリソースが奪われ、取り組むべき本来の作業を妨げられ、課題にたどり着かなくなってしまいます。

 名前は、こだわると結構な負担となります。適切な名前を考えるのは高度な思考能力を必要としますし、時間もかかります。逆に、適当に付けても動きますし、そうすれば時間の節約になります。

 しかし、不適切な命名は、コードに負債を抱えることと同じです。その後、コードが生き続ける限りずっと、コードを読む人、コードを使う人すべてに、マイナスの影響を与え続けるのです。

 How 〜コードはまず名前を決める

 プログラミングは、まず、名前から入りましょう。コードに現れる様々な要素に、意図が正確に伝わるような名前を付けるようにします。

 その際、コードを書いていながらも、常に、「使う側」「読む側」の視点に立って命名してください。具体的には、以下の点に注意します。

  • 名前には、より多くの情報を詰め込むようにします。名前を「短いコメント」だと考えると、伝えるべき情報が含まれやすくなります。また、複数候補を挙げて、そこから選ぶようにすると、よりよい名前になります。
  • 名前は、誤解されることのないよう気を付けます。命名の後、「他の意味と間違えられることはないだろうか?」と何度も自問自答することです。誤解を少なくするために、各プログラミング言語の慣例を知り、それにならうことも必要です。
  • 名前は、「効果」と「目的」を説明します。「手段」には言及しません。そうすることで、コードを読む人、使う人は、詳細を理解する手間を省くことができます。
  • 名前を、自分自身でチェックしたい場合、処理を書く前にそのテストを書くようにします。そうすることで、コードの使用者側の視点で考えられるようになります。
  • 名前は、発音可能なものにします。現実の会話で使用しやすく、コードを読む時でも、発音できた方が脳に負担がかかりません。
  • 名前は、検索可能なものにします。例えば、英数字の1文字の名前は、コード全体で無限にヒットして、コードの解析に手間がかかりすぎます。

 発展 〜メンタルマッピング回避

 ある情報から、記憶の中のあるべき姿のイメージに変換することを、メンタルマッピングと言います。

 コードを読む人が名前を見て、心の中でその人の既知の名前に変換しなければならない、つまりメンタルマッピングしなければならないようなことは、極力避けなければなりません。これは、コードの流れを追うことに集中したいプログラマの脳に対して、非常に負荷をかけ、集中を乱します。

 メンタルマッピングは、「規約」や「問題領域」から外れた用語を使用した場合に発生します。独自の名前を使用すると、それはそのままでは解釈できず、標準的な名前にメンタルマッピングしなければなりません。よって、可能な限り、標準に基づいた用語で命名します。独自の名前を考えるより、標準に従う方が、共通認識を利用できるので、書く方も読む方も楽になります。

 また、メンタルマッピングは、(ループカウンタ以外で)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.

ページトップに戻る