見出し画像

[#45] 名付け親にはプログラマを

初出: MacPower 2004年 4月号

ものに名前を付ける、という行為がある。普段の生活ではあまり行うことではないかもしれないが、世のなかのものにはたいてい名前があり、それは誰かによって命名されている。次のプロジェクトの名前、生まれてくる子供の名前、拾ってきたペットの名前、ホームページの名前 - などなど。

我々プログラマも、ものづくりに関わっているということもあり、名前には意外と敏感である。例えば、自分でソフトを作って発表する場合、ソフトの名前の付け方次第で、そのプログラムの将来もけっこう決まってしまうものだ。自分が気に入った名前だと愛着もわきドキュメントもちゃんと書き、アップデートも頻繁に行ったりする。結果として末永く使ってもらえるものに成長していくことが多い。逆に名前をいい加減に付けちゃうと……、そのソフトの行く末はもう決まったようなものである。

そういう大きな意味での名前とは別に、ブログラマが毎日付けている名前がある。それがプログラムのなかに出てくる関数やクラスなどの名前だ。プログラミングとは決められた仕事を何かしらのプログラム言語を使って記述していくことであり、その作業一つ一つが関数ということになる。クラスとはオブジェクト指向の用語で、プログラムのなかで扱う対象物を表すモノである。つまりある仕事を工程別に細かく分けてみるとすると、仕事がプログラムに相当し、関数は細かい工程に相当する。クラスは仕事で扱う商品であったり、会社という組織であったり、ともかく名詞で表されるモノ=クラス、と考えてもらいたい。そうした関数とクラスがたくさん集まり一つのプログラムになるのである。

通常、プログラムのなかで関数やクラスを定義するには、それに名前を付けなければならない。どんな些細な役割のモノでも名前を付けてあげないとプログラム言語のなかでは使えないのだ。ここが一般的な仕事との一番の違いだろう。普通の仕事の場合には、「こないだのアレ、またやってさ、彼に投げておいて」って感じで物事が進んでいくことがあるだろう。しかしプログラム言語では、こないだっていつよ?アレって何?やるってどう?彼ってだれ?ホントに投げちしゃっていいの?!ってなことになる。

正確には、「先月の末日に行われた会議の結果を、前回と同様にグラフ化する作業を実行して、営業一課の上原さんにメールで送信してくれ」となる。鬱陶しくてしょうがないが、曖昧さを許さないプログラミング言語の特徴なので仕方がない。細かいことでもいちいち名前を付けないといけないのだ。で、文中の「グラフ化する作業」や「メールで「送信」というのがいわば関数の名前ということになる。「営業一課」とか「上原さん」、「グラフ」、「メール」などがクラスの名前となるだろう。

一般的な名前と同じように、プログラム中で使う名前も、付け方次第でその運命が決まるということがある。意味不明の名前の関数は、使うときにいちいち中身を調べなくてはならず、だんだん使われなくなる。行う内容を的確に表していない名前の関数だと、混乱して将来バグを生み出してしまう。関数といえども、ちゃんと適切な名前を付けてあげないといけないのだ。

一番大事なことは、あたりまえだが、他人が見てわかる名前にする、ということだ。中身のソースコードをいちいち追っていかなくても、その関数が行うことが一目でわかる名前を付けることが好ましい。他人とは、何度も言うようだが明日の自分も含まれる。一週間後、同じソースコードを見て内容がばっと理解できないような名前は付けてはいけない、ということだ。適切な名前の付いた関数ならば、コメントで内容を説明する必要性も少なくなる。コメントは本当に必要な内容だけにとどめられる。コメントが最小限で済むソースコードを目指すなら、名前の付け方から見直していく必要があるのだ。

とはいえ、我々日本人には英語というハンデがある。現在のところ、プログラム言語で使える名前はアルファベットのみという制限がある[*1]。なので、関数の名前もアルファベットで表記しなければいけない。ここでローマ字と英語という選択肢があるのだが、ローマ字を読むことにはあまり慣れていない。さらにプログラム中では好き勝手に空白を入れることはできないので、読みにくさは、さらに上がるわけである。

プログラマはある程度は英語ができないと厳しい、という話を聞いたことがあるだろうか。一つにはドキュメントの問題がある。新しい技術のドキュメントの多くは翻訳されていない。なので、最新情報を得るには英語を読む能力があったほうがいいというものだ。

しかし、それよりも大事なのが書く能力なのではないか?プログラム中で適切な名前を付けるためには、英語の語彙がある程度ないと厳しい。いつも同じ単語しか使わないと名前のバリエーションが貧弱になる。同じ意味でも違う言い回しができる場合には、それを使い分けることによって、全体の命名規則に幅ができる。トータルで英語力が必要ということなのだ。

いつも悔しいと思うことがある。ちょっと馴染みのない単語が関数の名前に使われている場合、なかなか機能自体が理解できないのだ。例えば、CocoaのAPIの説明のなかにdesignated initializer [*2] というのがある。指示された、とか任命された、という意味なんだが、意味は何かわかっても、なんかピンとこなかった。でもある時、野球の指名打者のDHが「Designated Hitter」の略だということがわかったときに、す〜っと理解できたのだ。あ、そうか、そうだったのか……。この感覚を説明するのも難しいんだけど(笑)。ま、やはり単語の意味を体感できているのといないのとでは、理解にも差が出てくるのだ。プログラマを目指しているならば、まずは英語を身につけましょう。

バスケ(http://saryo.org/basuke/)
NIFTY-Serve時代からのボクのプログラマの師である藤本さんが「叫ぶCプログラマ」という本を出しました。あー、プログラマとして言いたいことが書いてあるぜ!という本です。MacPowerでオレのこんなコラムを読んでくれる人には(笑)、ぜひお勧めです。詳細は、http://www.ne.jp/asahi/b/monkeybusiness/

[*1] アルファベットのみという制限がある - この制限がなくなることはあまりなさそうだし、またなくなったところで本当に便利かは微妙なところだ。オレは英語オンリーがましだと思う。
[*2] designated initializer - 初期化メソッドのなかで、一番重要で根本的な初期化を行うメソッド。継承クラスからはこれを呼ばないといけない。

この記事が気に入ったらサポートをしてみませんか?