「はじめに言葉ありき」
プログラムでは「カラフルな単語を使え」と言われます。
直観的で理解しやすく命名はプログラムの可読性を飛躍的に高め、命名によってよいクラス設計に導くことがあります。
よく使う英単語を並べておきます。ご参考にどうぞ。
プログラムで使う英単語
「はじめに言葉ありき」と言った古代の碩学は、プログラミングにも精通していたに違いありません。
煌びやかでカラフルな直観的で正しい単語を使うことができれば、コードの可読性は飛躍的に向上します。
設計は、クラスや関数にどういう名前をつけるかに引っ張られることが多いので、カラフルな単語を使っていればよい設計をできる可能性が高まります。決して格好つけるだけではありません。
カラフルな単語を使ってください。
しかし、ここは日本です。英語が日常にないため、よい英単語を使うには英単語を調べねばなりません。このページで眺めて何かいいのがあったら使ってください。
ローマ字はダメなの?
ローマ字のクラス名や変数名はダメでしょうか?
かなりの頻度で馬鹿にする人がいるのでやめた方がよいです。意識高い系オジサンはうざいので、防御しましょう。また、コードレビューでまともな指摘ができない人も名前だけ突っ込みます。
最近、私の職場では、海外と協業することも増えているので、ローマ字は禁止です。
中国に外注して来たコードに意味不明の変数名(中国語をアルファベットで書いたもの)を使われているときを想像してください。読みたくなくなります。
名詞と動詞
英語には名詞と動詞などがあることを思い出しましょう。
クラス名、変数名は主に名詞を使いましょう。関数名、メソッド名には動詞を使いましょう。動詞+目的語でもいいです。
まずはこの原則から出発しましょう。これだけでも、可読性が上がると思います。
クラス名
クラス名は、そのクラスが受け持つオブジェクト、管理するだろうオブジェクトの名前を付けるのが一般的です。なので、そのクラスが何かを考えましょう。
他モジュールにはない煌びやかな名前を付けてください。
デザインパターンを使うなら、パターンそのものの名前を付けるのが一般的です。デザインパターンだということを理解してもらえるし、可読性が高くなります。名づけに悩まなくていいです。
ここで紹介するのは、デザインパターンではないけど、よく使いそうなクラス名です。
制御するもの
あるモジュールの中心的な役割を担うもの。管理する「オブジェクト」がモジュールそのものであるとき、「制御」という名前を付けたくなります。
製品全体を制御するモジュールについても、付けたい名前です。
「制御するもの」に表す単語は以下です。
- Manager
- Controller
- Conductor
- Facade
- Monitor
- Main
Managerは「制御するもの」、Controllerは「管理するもの」です。プログラムで使う場合はほぼ同じ意味になりますのでお好みで。
Conductorは「指揮するもの」です。オーケストラの指揮者という感じのクラスです。Facadeというデザインパターンもほぼ同じ意味になるかと思います。ただし、Facadeは門ですから、中心的な役割でなくても使うことがあります。
Monitorは「監視者」です。モジュール内を監視するものが「制御するもの」になるのは自然なときもあります。
Mainという名前は「主なもの」ですから、そのモジュールのメインのクラスということでつけるんでしょうね。
データに関するもの
データそのもの
データそのものだということを明示する場合もあります。
- Data
- Information
プログラムの中では全てのものがデータなのでこういう名前は無意味だと思うかもしれません。
例えば、共有メモリの管理モジュールにInformationという名前のクラスを作ったことがあります。
他にもグローバルメモリ、データベースのラッパに付ける名前としてはよいと思います。
データの送受信
http通信などを送っているとき、プロセス間通信のとき、単なる関数コールでも、データを送受信している雰囲気があるときは使います。
データを受け取る方の単語です。
- Server
- Receiver
- Input
- Reader
クライアント-サーバモデルを意識しているならServer。データを単に受け取っているだけならReceiverです。IOをしている雰囲気にしたいならInput, Readerですね。
データを送る方の単語です。
- Client
- Transmitter
- Transfer
- Sender
- Messenger
- Output
- Writer
- Vent
送る方はたくさんあります。Serverに対応するのがClientです。httpクライアントのとき使ったことがあります。
Receiverに対応するのが、Transmitter, Transfer, Sender, Messengerです。どれでも大差なさそうですが、Transmitter, Transferの方が固い感じがします。
Inputに対応するのがOutputです。Readerに対応するのがWriterですね。
Ventは何かを吐き出すときです。吐き出した後は成功したかどうかは知らないよ、みたいな雰囲気を感じます。
図形
プログラムコンテストのときは、図形を扱いますね。
領域
領域を表す単語は以下です。
- Area
- Domain
- Range
- Field
Areaは長方形的な形が決まったものを想像します。数学ではdomainが定義域で、rangeは値域みたいなものですが、どちらも領域として扱ってい良い単語です。Fieldも領域であってこれから作業するところという感じです。お好みで。
点
点を意味する単語は以下です。
- Point
- Position
- Element
Pointが普通に使える単語です。Positionは「位置」なので、点という「もの」ではなく位置情報の方が重要なときに使います。集合の一要素といういみでの点はElementです。
変数名
関数内で使う変数
カウンタ
for文のカウンタなどは、意味のある名前はつけない人が多いです。
- i, j, k, l
を使っています。ほぼ、i, jしか使いません。3つ以上使おうとしているということはネストが3段階なので関数を分けることを考えた方がよさそうです。
イテレータの場合は、
- it, itr
のどちらかを使います。
匿名変数
カウンタではないけど匿名の変数を使いたくなるときがあります。短い関数内であれば、意味のない変数もありとして使っています。
- a, b, c
- x, y, z
- p, q, r
処理前、処理後
何かのリストに、処理を施すとき、
remainder(残り)にいったんコピーして、result(結果)に一個ずつ入れていく、ということをやることがあります。
ということで、
- remainder
- result
を使います。
メンバ変数でも使いそうな変数
メンバ変数としてつかってもよいし、ローカル変数で使ってもおかしくないものを集めてみました。
最大最小
最大、最小は
- maximum
- minimum
です。
- max
- min
で使うことが多いです。何かの最大数を表すときなどはmaxXXXXとして使うこともあります。
長さ
長さを表す単語です。
- height
- width
- distance
heightは高さ(縦)、widthは広さ(横)です。distanceは2点間の距離を表すときに使います。
列
列を表す単語は、
- sequence
です。数列でも、点の列でも使います。seqと使うことが多いと思います。
STLの型から、vectorからvec, v、listからlis, l、queueからque, qなどを使う事もあります。
ファイルの識別子
ファイルをopenするともらえるものは、Windowsではファイルハンドラといい、Linuxではファイルディスクリプタと呼びます。
- file_handler, handler
- file_descriptor, fd
出自がLinuxの人はWindowsに行ってもfdを使うことがあります。その逆もよくあります。生ぬるい目で見守ってあげてください。
関数名
関数名は基本的に動詞あるいは動詞+目的語を使いましょう。名詞の関数名はなるべく避けた方がよいと思います。
実行する
単に「実行する」という関数はpublic関数によく使います。
例えば、Receiverというクラスがあるとき、Receiverにreceiveと命じると同語反復している気分になるから、Receiverには実行せよと命じたいです。※趣味によります。Receiverがreceiveしても何も気にしない人もいます。
Receiver receiver; receiver.receive();// receiverにreceiveせよと言っている
と書くのと、以下のようにするのがどちらが好きかというだけですが、
Receiver receiver; receiver.execute();// receiverにexecuteせよと言っている
ということで、私は以下のような動詞を使います。
- execute
- compute
- evaluate
- calculate
- determine
executeがまさに「実行する」です。あまり考えずにexecute()を使います。execute以外はprivate関数でもよく使います。
計算するのが、compute, evaluate, calculateです。単純計算がcompute、不等式や確率計算のときはevaluate、複雑な計算はcalculateというニュアンスの違いはありますが、ほとんど同じ意味です。全てcalculateでもいいと思います。
determineは決定するです。何かの判断をするときに使います。
状態を聞く
状態を聞くとき、isXXXX()やhasXXXX()を使います。
isは状態、hasが持っているかどうかを聞く語です。
- isActive
- isValid
- isConnected
- hasSession
- hasKey
「聞くな、命じよ」の原則からいくと、状態を聞くのはあまりないかもしれません。
プログラムの技術に成熟するとおそらく使う機会がほとんどなくなりますが、いくつかのオブジェクトを参照して判断する場合などに使う可能性があります。
isもhasもbool型を返すようにして、if文の中に入れるようにするのが慣例です。
bool isActive(SomeClass& c);// bool型 // 使い方 if (isActive(c)){ // cがactiveだったら }
isの後に否定的な言葉は使わない方がいいです。バグの元です。
if (isDisconnected()){// connectのときfalseなので混乱するかも } if (isConnected()){//こっちの方が混乱しない }
作る、変形する
データを作り上げるとか、変形する、という仕事もよくすると思います。
作る単語です。
- make
- create
- build
- construct
- generate
普通の「作る」はmakeまたはcreateです。部品を組み合わせて構造物をつくる雰囲気ならbuild, constructです。generateは乱数発生のように何かを生み出す感じです。
変形する単語です。
- change
- transform
- translate
普通に変えるならchange、ものの形を変える、変換するのがtransform、翻訳する、例えば復号するのがtranslateです。
消す、壊す
作るの対義語で消す、壊す語です。
- remove
- delete
- clear
- purge
- destroy
普通に消すのがremove, deleteです。きれいにお掃除する感じならclear。完全に消し去るのがpurge。createの対義語のように使うなら破壊するdestroyを使います。
探す
探す単語は以下です。
- find
- search
- detect
find, searchが普通に探すときです。detectは「検出する」という雰囲気です。
送受信
クラス名も送受信があったように関数名でも送受信関連があります。
まず接続に関して
- connect
- disconnect
送る方の単語です。
- send
- transfer
- transmit
- post
- push
- upload
- write
「送る」の一般的な単語はsend, transfer, transmitです。postはメールサーバみたいなものへの投函するイメージです。pushはメッセージキューなどに入れる雰囲気です。uploadはファイルを送信する、writeはファイルを書く感じです。
受け取る方の単語です。
- receive
- get
- fetch
- obtain
- pop
- download
- read
受け取る方は大体送る方と対応しています。
「受け取る」の一般的な単語はreceiveです。そして「得る」を意味するのがget, fetch, obtainです。popはpushと対になります。同様にdownloadはuploadと、readはwriteと対になる言葉です。
開始、終了
開始、終了も良く使いますね。
- start, finish
- begin, end
- open, close
- initialize, terminate
- create, destroy
それぞれ対になっている語を使います。
start, finishとbegin, endが普通の開始、終了です。
open, closeはファイルの雰囲気です。initialize, terminateは初期化です。create, destroyは作るのと破壊するのです。
トレース
製品コードではトレースが命です。かなり気を使って入れていきます。
- trace
- report
- log
- dump
- debug
- warn
- error
- perform
普通にトレース出力はtrace, report, logなどの関数名です。
そのクラスの持っている情報を一気に出すときはdumpです。
トレースのレベルは分かれていることが多いのでdebug, warn(警告), error(エラー)で分けることもあります。
performは性能トレースを出すときに使います。性能がシビアな要件のときは、あらかじめ性能トレースをばら撒いておいてどこがネックかをすぐに調査できるようにしておきます。
まとめ
プログラムでよく使う英単語を紹介しました。煌びやかでカラフルな単語を使うように心がけてください。単語の使い方で可読性が抜群に上がり、よいクラス設計を導きます。
コメント