Contents
適切な名前を選ぶ
よい名前を選ぶことが重要なのは、プログラマがプログラムの意味を読み取る手がかりになるためである。
問題領域の概念をそのまま表現する名前がメソッド名やクラス名に使われていれば、 メソッドやクラスの仕様を調べなくても、 単に単語の意味を思い出すだけでそのプログラムが何を行うか理解できたことになる。
また、プログラムを書くときも、問題について考えるときに使った単語をそのままプログラムに書き込めることになる。
そして、良い名前には使用されるときの語順も重要である。 メソッド呼び出しで obj.meth と記述する時の meth に良い名前と、 関数として fun(obj) と記述する時の fun に良い名前は (たとえ機能が似ていたとしても) 異なる。
手間の節約
- マニュアルをひいて意味を確認することを減らせる
思考の節約
- プログラムを理解するのに、メソッド名などの単語の意味をそのまま受け取ればよく、いちいち翻訳しなくてよい
- プログラムを書く時に、文章で表現したやりたいことの中の単語を使ってプログラムを記述できる
例
例: Ruby と OCaml の型変換
Ruby で整数 i を文字列に変換するには、i.to_s と記述する。
OCaml で整数 i を文字列に変換するには、string_of_int i と記述する。
i to string も string of integer i も英語として解釈できる語順になっている。 このため、プログラマは英語の感覚でプログラムを読んだり書いたりできる。
この語順はメソッド呼び出しや関数呼び出しの記述の順番に依存しており、 もし i.string_to_int や to_s i というように逆であったなら英語の感覚とはならない。
例: Kernel#in?
Ruby において、以下のような定義による Kernel#in? が提案されることがある。
- [ruby-core:23543]
module Kernel
def in?(other)
other.include?(self)
end
end
このメソッドは以下のように使う。
5.in?(0..10) # (0..10).include?(5) と同じ 5.in?([0,1,2,3]) # [0,1,2,3].include?(5) と同じ
other 引数は include? メソッドを持っていればどんなオブジェクトでもかまわないが、 具体的には Enumerable オブジェクト (Array, Range, Set など) が想定されている。
このメソッドは、include? メソッドのレシーバと引数を逆にしたものであるから、 新しい機能を提供するものではない。
また、あるオブジェクトが Enumerable オブジェクトに含まれるかどうかを検査するメソッドは、 後者の内部構造をアクセスするため、機能的にいえば後者に属する、つまり Enumerable#include? のほうが自然である。
にもかかわらず Kernel#in? が提案されるのは、英語に似た形でプログラムを記述できるためである。
これは、英語で思考しているプログラマにとっては、以下の効果がある。
- プログラムを記述するにあたって、思考をプログラムに翻訳する手間が減る
- プログラムを読解するにあたって、プログラムを思考に翻訳する手間が減る
なお現時点 (2009年5月) においては、Kernel#in? の提案は受け入れられていない。
例: Source Code Obfuscator
Source Code Obfuscator とは、ソースコードの難読化を行う、つまり理解しにくく変換するツールである。 これが行う代表的な変換に変数名を意味のない名前に変えてしまうというものがある。
逆にいえば、これは変数名に良い名前を使うことが理解のしやすさにつながることを意味する。
関連するパターン
よく使うものを簡単に使えるようにする
名前が概念をよく表しているかどうかとは独立に、 その概念を使用することを推奨するかしないかという点には検討が必要である。
もし、概念をよく表していても、よく使う他の概念を表す名前よりも短くて、誤用が多くなるのであれば、 全体としてその名前は不適切かもしれない。