Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

リーダブルコードから学んだプログラミングにおける命名原則

転職をして5月から新しい職場で働き始めました。オフィスの本棚には色々な本が置いてるわけですが、実はいままで読んだことなかったリーダブルコードを借りて読んでみました。Clean CodeとCode Complete(上巻のみ)を読んだことがあるので目新しい情報はなかったですが、そういえばこんなことも書いてあったなぁ。みたいなすっかり忘れていた項目も多かったので自分用のリファレンスマニュアルも兼ねて、久々のブログポストにしようと思います。

リーダブルコードは15章に分けて構成されていますが、本ポストではいわゆる「命名」について書かれている2章と3章で、もっとも重要だと感じた内容を3つにまとめました。

明確な単語を選ぶ

1つめは明確な単語を選ぶ、違う言い方をすると役割が伝わりやすい名前をつけることです。本書では「2.1 明確な単語を選ぶ」のほか「2.2 tmpやretvalなどの汎用的な名前を避ける」、「2.3 抽象的な名前よりも具体的な名前を使う」など複数のチャプターに分けられ、詳細な具体例が提示されています。それらに書かれているのは関数の動作や変数の役割を、より簡潔で正確に表すことができる言葉選びをする必要があるということです。

本書ではgetが例に挙げられています。getはプログラミングをしていれば頻繁に目にしますが、できる限り使うべきではありません。なぜなら、getは「値を取得する」こと以上の情報が得られないからです。getの代わりにdownloadを使用することでどこかのサーバーからダウンロードしてくるのだということが明確にわかるようになりますし、selectを使用することで複数の対象の中から取得するということが伝わりやすくなります。

このような単語のボキャブラリーを探す際に便利なThesaurusというサイトが紹介されていました。名前を考える際にチェックしてみてください。

名前に情報を追加する

2つ目は明確な名前をつけた上でより詳細な情報を追加することです。本書では単位を名前に含めることが例として挙げられています。たとえば、描画する図形の高さを保持する変数にheightとだけ名付けるのではなく、heightPixelのように単位を含めた変数名にすることで何を入れるべきなのかがひと目でわかるようになります。

他にも単位ではなく属性を追加するという方法もあります。パスワードを保持してる変数に対して、十分に安全な複雑さを持っている場合はsecurePasswordとしたり、逆に単純で短い場合にはinsecurePasswordと名前をつけることでどんな意図で使われる変数なのかがより詳細に伝わるようになります。ただこの例でいえば、セキュリティの担保するための重要な処理の周辺など、追加した情報が重要な役割を果たす場合でなければ不要な情報になってしまい、余計にわかりにくくしてしまうので注意してください。

不要な単語は投げ捨てる

3つ目は不要な単語は投げ捨てる、つまり意図を伝えるために不要な単語を取り除くことです。前項と対立するようにも感じますが、役割をわかりやすくするという目的は同じです。本書ではconvertToStringをtoStringに変えるという例が挙げられていました。toStringだけでも文字列に変換するという動作が十分に伝わるためconvertは不要だという考え方です。

他に例を挙げるとするならuserDataやuserInfoと名付けられている変数はほとんどの場合でuserで十分です。オブジェクト指向を意識したプログラミングが行われていれば、オブジェクトが何らかのデータを持っていることはあきらかです。そのため単にuserという変数であってもユーザのデータであることはひと目でわかります。

まとめ

非常に短い内容になりましたが、本当に重要なことはシンプルなものです。本ポストにわかりやすい具体的なプラクティスは含まれていませんが、日々この3つを意識してコードを書くことで命名の能力が養われていくはずです。是非、みなさんも試してみてください。