Skip to content
名付け
マイコン老年の今時のプログラム技術
2020-07-03

Lombokを使うとき、変数numOfPieを外から読むにはgetNumOfPie()を呼び出すことになる。getXXXという名前は固定の形式でツール側で自動生成される。多量のメンバー変数があるとき、書くのも面倒だしソースもむやみに長くなって見通しが悪くなるので助かるのだが、一方で「今まで自分で決めていた変数や関数の名前を、仕組みの側に一方的に決められる」というのもレガシープログラマにとってはつまずいてしまうところだ。

近代のフレームワークは名付けをいろいろ強制する。時期としてJavaのLombok, JPA(findByXXXAndXXX...()),Spring, PHPフレームワークのCakePHPあたり以降のフレームワークには多かれ少なかれあるんじゃないだろうか。知ってる範囲/覚えている範囲で

  • Lombok: getter setterを書かずに済む data→getData(),setData()
  • JPA: 関数を書かなくてもDBのモデルだけから解析して findByData() と書けばDataの検索関数が呼べる(頻繁に利用されているかどうかは知らない。少なくとも案件で使うことになったことはある)
  • CakePHP モデルの名付けで英単語の複数形で書くとリストとして処理され、単数形で書くと単一と見なされるとか。詳細は忘れた。

不便そうに見えてこれは非常に便利な機能である。設計フェーズならまだしもコーディングしているときにいちいち名前を考えるのは実は面倒である。一時的な変数は a とか i とか 使って、後になってなんだっけと思ったりする。取り出すならgetXXX(),設定するならsetXXX()と決め事をしてあればそこを悩まずに済む。

余談だが名前は英文的に長く付けることが多くなった(キャメルケースかスネークケースかは処理系の慣例次第)。もちろんそういう長い変数名/関数名を使えるようになったのはハードがリッチになったことも大きい。若い頃に使ったアセンブラ,FORTRAN,BASIC,初期のプリプロセッサ型C(Introl Cとかも)なども長さは8文字までとか今ではまったく考えられない制約があった(そこでハンガリアン記法なども使っていたな)。

昭和プログラマからすると、このフレームワーク側の名付けの強制については、そういう強制があるということを頭の隅に置いておかないと「この関数/変数はどこにあるのだ」「自分で付けた名前のメソッドがなぜか呼び出されない」「なぜか原因不明のコンパイルエラーが出る。変数名を変えただけで起きたり直ったりする」など理不尽な理由で悩み続けることになる(CakePHPとかも結構悩んだ)。

名付けが強制される(ツールやフレームワーク側で合成される)ということは、一つ書いた名前 がいろんなところで合成されて使い回されるということだ。例えば あるクラスのメンバーに cupOfTea という名前のメンバー変数を作れば、それは getCupOfTeaとかsetCupOfTea とか findByCupOfTea とかソース全体に波及していく。つまり最初の名前に直感的にわかりにくい/区別しにくい名前を付けると、それが後々まで響いてしまう。変数名にうかつにfindNameとか付けてしまうとgetFindNameとなったり、a1,a2 とつけたらfindByA1()となったり、後で悩みまくることになる。今はリファクタリング機能があるIDEが多いので後で直すことも出来ないではないが、仕様書で仕切る多メンバープロジェクトでは一度付けた名前を軽々と直すことも出来ない。公開APIなどもだ(最近のオープンソース系のプロジェクトでは、メジャーバージョンアップのたびにまずいところを根っこから直すところも多いので、そういうところはdeprecatedとか付けて名付けを直すことあるのだろう。直された側は悩むのだが)。

今時の設計者にはソフト開発向けの名付けのセンスがいるのかもしれない(慣れだとは思うが)。ただシステムが巨大になれば名付けも含めて膨れ上がって矛盾し出すのは仕方がないことだ。破綻を遅らせるようなうまい名付けセンスが望まれるとともに、名付けが破綻するくらいに使われ続けたシステムならばそれはそれで大往生とも思える。

最初の名付けの後々の影響が大きいため、近年のプログラムでは誤字(typo)は非常に気を遣うようになっている。上記の名付けロジックでつまらないバグになったり、長く続くプロジェクトで初期の誤字でニヤニヤされたり。IDEの補完入力でもtypoがあるとうまく働かなかったりする。結果、IDEはスペルチェッカーが入っているものがほとんどになってしまった。

スペルチェッカーというとワープロの専売機能(スペルチェッカーライブラリのアプリ組み込み案件とかもやったな)だったのに、ソフト開発に英語のスペルチェッカーが必須になってしまったのは昭和のプログラマには笑い話にも思えてしまう。