クラス名編をつくりました
あるメソッドを定義しようとするとき、そのメソッドを使う人達が名前からどんなことをするか理解できるようにするには、メソッドの内容に応じて適切な情報量の命名が求められます。
この記事では、メソッド名に用いることでどのような情報が提供できるかを見ていきたいと思います。
真偽値を返すメソッド
場所 |
単語 |
意味 |
例 |
Prefix |
is |
(オブジェクトが)期待する状態になっているかどうか |
isChecked |
Prefix |
can |
(オブジェクトが)期待する動作をできるかどうか |
canRemove |
Prefix |
should |
(呼び出し側が)ある命令を実行したほうがよいかどうか |
shouldMigrate |
Prefix |
has |
(オブジェクトが)期待するデータ・プロパティを持っているかどうか |
hasObservers |
Prefix |
needs |
(呼び出し側が)ある命令を実行する必要があるかどうか |
needsMigrate |
必要に応じてしか実行されない処理をするメソッド
場所 |
単語 |
意味 |
例 |
Suffix |
IfNeeded |
必要なら実行し、必要なければ何もしない |
drawIfNeeded |
Prefix |
might |
同上 |
mightCreate |
Prefix |
try |
実行を試み、失敗した場合は例外を飛ばすか、エラーコードを返す |
tryCreate |
Suffix |
OrDefault |
実行を試み、失敗した場合は既定値を返す |
getOrDefault |
Suffix |
OrElse |
実行を試み、失敗した場合は引数で指定した値を返す |
getOrElse |
Prefix |
force |
強制的に実行を試みる。エラーは例外ないし返り値で表す |
forceCreate , forceStop
|
非同期処理に関連するメソッド
場所 |
単語 |
意味 |
例 |
Prefix |
blocking |
スレッドをブロックするメソッド |
blockingGetUser |
Suffix |
InBackground |
バックグラウンドスレッドで実行されるメソッド |
doInBackground |
Suffix |
Async |
非同期メソッド |
sendAsync |
Suffix |
Sync |
(対応する非同期メソッドが存在する)同期メソッド |
sendSync |
Prefix or Stem |
schedule |
ジョブやタスクをキューに積む |
schedule , scheduleJob
|
Prefix or Stem |
post |
同上 |
postJob |
Prefix or Stem |
execute |
非同期処理を実行する |
execute , executeTask
|
Prefix or Stem |
start |
同上 |
start , startJob
|
Prefix or Stem |
cancel |
非同期処理の実行を止める |
cancel , cancelJob
|
Prefix or Stem |
stop |
同上 |
stop , stopJob
|
コールバックメソッド
場所 |
単語 |
意味 |
例 |
Prefix |
on |
何かが起こった時に実行される |
onCompleted |
Prefix |
before |
何かが起こる前に実行される |
beforeUpdate |
Prefix |
pre |
同上 |
preUpdate |
Prefix |
will |
同上 |
willUpdate |
Prefix |
after |
何かが起こったあとに実行される |
afterUpdate |
Prefix |
post |
同上 |
postUpdate |
Prefix |
did |
同上 |
didUpdate |
Prefix |
should |
何かを起こしてもいいか確認するとき実行される |
shouldUpdate |
コレクションの操作に関するメソッド
単語 |
意味 |
例 |
contains |
指定したものと同じオブジェクトを持っているかどうか |
contains |
add |
追加する |
addJob |
append |
同上 |
appendJob |
insert |
n番目に追加する |
insertJob |
put |
キーに対応する要素を追加する |
putJob |
remove |
要素を削除する |
removeJob |
enqueue |
行列末尾に追加する |
enqueueJob |
dequeue |
行列先頭を取り出して取り除く |
dequeueJob |
push |
スタックの先頭に追加する |
pushJob |
pop |
スタックの先頭を取り出して取り除く |
popJob |
peek |
スタックの先頭を取り出す(スタックからは取り除かない) |
peekJob |
find |
条件にあうものを探す |
findById |
状態に関するメソッド
単語 |
意味 |
例 |
ensure |
期待する状態かどうかをチェックし、そうでない場合は例外を投げるかエラーコードを返す |
ensureCapacity |
validate |
正しい状態かどうかをチェックし、そうでない場合は例外を投げるかエラーコードを返す |
validateInputs |
オブジェクトのライフサイクルを扱うメソッド
単語 |
意味 |
例 |
initialize |
初期化。遅延初期化のメソッドとしても。 |
initialize |
abandon |
デストラクタの代替 |
abandon |
destroy |
同上 |
destroy |
dispose |
同上 |
dispose |
データに関するメソッド
単語 |
意味 |
例 |
create |
新しく作る |
createAccount |
new |
新しく作る |
newAccount |
from |
既存のものから新しく作る、あるいは別のデータから新しく作る |
fromConfig |
to |
変換する |
toString |
update |
既存のものを書き換える |
updateAccount |
load |
読み込む |
loadAccount |
fetch |
(リモートから)読み込む |
fetchAccount |
delete |
削除する |
deleteAccount |
remove |
削除する |
removeAccount |
save |
保存する |
saveAccount |
store |
保存する |
storeAccount |
commit |
保存する |
commitChange |
apply |
保存・適用する |
applyChange |
clear |
データを消す、あるいは初期状態に戻す |
clearAll |
reset |
データを消す、あるいは初期状態に戻す |
resetAll |
他にもあれば追記していきますし、編集リクエスト、コメント等いただければどんどんください!
コメント
@7of92
@aokomoriuta4
@7of9
1
@uasi- http://docs.ruby-lang.org/en/2.2.0/Gem.html#method-c-ensure_gem_subdirectories
- http://elixir-lang.org/docs/v1.0/elixir/Code.html#ensure_loaded/1
6
@7of90
@makito
6
@KeithYokoma0
@ka2151
@faithandbrave@github0
@narumi_0
@uasi(編集済み)
9
@7of9Object moved http://ejje.weblio.jp
0
@ytyng0
@alalwww
- JavaのライブラリGuavaのPreconditionsでは事前条件のアサーション用のメソッドに
- Predicate の
-
- 主にデータ操作系、こういうのどうでしょうか。
- 先頭要素
- 末尾要素
- 次
- 前
- 受け入れる
- 提供/供給する
- 計算する
3
@syuilo
3
@7of90
@komorihi(編集済み)
1
@7of9
0
@7of9(編集済み)
2
@today0
@tektek0
@7of9(編集済み) 0
@tektek0
@nyoro_712(編集済み)
3
状態に関するメソッドで ensure が記載されていますが、 assert も同じ意味で使われていると思います。
@7of9 assertだと例外を投げるかexitするかほぼ確実に強制終了に近いことしそうなので、ensureみたいにエラーコードを返すこともありそうな名前と同列に扱うべきではないと思いますよ
@aokomoriuta なるほどです。
http://www.codeproject.com/Articles/1863/Design-by-Contract-Framework
にCheck.Ensure()の実装例がありますが、このように、assert()でなく例外で使う、という方法もあるということですね。
勉強になりました。ありがとうございます。
ensure は「期待する状態かどうかをチェックし、そうでない場合はその状態にする」関数にも使われますね(ディレクトリが存在しなければ作成する、とか)
@uasi ありがとうございます。勉強になりました。
rubyやelixirはやっていませんが、こういう使い方というのは参考になります。
@KeithYokoma さん、Twitterが公開している文書 http://twitter.github.io/effectivescala/index-ja.html にある、副作用有無とか冗長なものは避けるとかそんなアドバイスがあると素敵かもしれませんね
以下、引用
@makito さん、ありがとうございます!
適切な量の情報を伝えるという点では、単語の意味の側面以外にもいろいろありそうですね!ここでは単語の意味に注目してみましたが、それらも含めてまた更新してみようとおもいます。
私がよく使うのに、
「検索して取得する」の retrieve
コレクション等から「特定の値を抽出する」の pluck
があります。ご参考まで。
https://twitter.com/codic_project
こちらのTwitterアカウントも見ておくといいですね。よく参考にさせてもらっています。
キューやスタックの「次に処理する要素を取り出す(取り除く操作を含まない)」というメソッドには、C++では
top
という名前を使いますね。peek
は馴染みがなかったです。似たような用途だと、Javaの乱数ライブラリやイテレータでは、
next
という名前も使いますね。キューやスタックには少々適切ではないと思いますが、シーケンシャルなコレクションだとC++では
front
/back
という名前が使われます。検索は、
find
に加えてsearch
もあるといいですね。depthFirstSearch
/breadthFirstSearch
とかがよく使われる例です。参考までに、私は状態に関するメソッドでPrefixにCheckも使うことが多いです。
@narumi888
check は何をどうチェックして何を返すのか曖昧になるので自分は避けるようにしています。他人のコードで見かけたら、何を実行するか予想がつかないので警戒しつつドキュメントやソースを読みます。
たとえば Ruby 2.2.3 に添付されている RDoc モジュールには check の名前を持つパブリックメソッドがいくつかありますが、挙動はバラバラです:
(これらは
rdoc
コマンドの実装詳細であり自分が直接呼び出すことはないとは思いますが……)自分ならそれぞれ
find_modeline
,reject_missing_files
,ensure_generator_unspecified
にするかなと。単純に期待する状態か否を見て
bool
を返すメソッドなら、名前はis_*
,can_*
, またはexists
のような動詞にしたほうが分かりやすいと思います。validate_*
やverify_*
という名前なら、期待する状態でない場合に詳細なエラー報告を返しそうだと予想できますし、ensure_*
なら期待する状態に修正してくれるか例外を投げそうだと分かりますね。@ka215
pluckは以下を見て解釈すると「コレクションなどから特定の値を抽出する。その時、コレクションからは削除する」という使い方になりそうですね。
コレクションから取り出して、コレクションには残したままにしたい場合には他の用語がよさそうに思います。
とても有用な情報です。勉強になりました。
Apple の cocoa のガイドラインです。
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF
こちらでも、単純なプロパティへのゲッターには get は不要となってますね。
ただし、(引数を元に計算などして) indirectly な値を取得する場合のみ、get〜 をつけましょう、とあり、これもわかりやすくて良いと思います。
check〜 のメソッド名は、私も避けるべきと思います。出てきたら、普段の数倍緊張して読みますね。
from
と近い感じでof
とかよく使います。クラスが単一の値を表したものの場合はXxx.valueOf
とかも。何かの後に続けて行うメソッドの接頭辞や接尾辞に
then
もよく見ます。また、~と一緒に的な意味や、インスタンスに付加情報を足した新たなインスタンスを生成するメソッドに
withXxx
、~のために的な説明や、from
/of
と似たような用途でforXxx
なんかも使いそうです。check
は曖昧になるので避けるってのは私も同意見です。他にも似たようなのにtest
、judge
とかも危ない名前かなという感じがします。特に、業務的なチェック処理なんかでbool値を返す
check~
は(とてもよく見かけますが)、殆どが期待値かどうかを調べるメソッドなのでisValid
/isInvalid
やvalidate
などを使うのが適切かなって思ってます。ただし、結果がおおよそ予測できそうな単純な処理や、抽象化された機能では、これらの名前を使うのもありかなとは思います。
e.g.
check
で始まる名前を使ってます。test
メソッドなど。get
/set
は、個人的には冗長なので好みじゃないですが、JavaBeans のように仕組みとして利用されてたりする場合もあるので、冗長とわかっててもあえてget
/set
で揃えちゃう事もあるかも。(IDEの補完の一覧で同じ接頭辞で並ぶのでプロパティと判断し易いっていうメリットもいくらかはありそう・・・かも?)あと細かいとこちょこちょこ。
push
、pop
、peek
があるならpoll
もあってよさそうかも。head
またはfirst
tail
またはlast
next
prev
またはprevious
accept
provide
またはsupply
calc
、calculate
、compute
メソッドというかクラスのメンバに属さないようなただの独立した関数だと
is~
などの接頭辞は個人的になんか付けにくいですね。戻り値を代入する変数名と被ってしまうので。@syuiloさん
そうですね。
var isHoge = isHoge(piyo);
を回避するため自分はvar bfHoge = isHoge(piyo);
(bf: bool flag)などする場合もありますが、しっくりきてないですね。isHoge(piyo)
は、"piyo"が"Hoge"という状態にあるかどうかを判断するのだから、その戻り値を格納する変数は "Hogeという状態" を表す名前にするとよいと思います。
というか、「そのフラグをif文に突っ込んで、英文として意味が通じますか?」という問いを立てれば、
if (isHoge)
とかif (hoge_flag)
みたいな事にはならないと思いますが…。「状態」という考えから
hogeMode
というのはなるほどと思いました。反面、数ヵ月後のソースリーディングで以下のコードを見た時、「処理2はどういうモードなのだろうか?」という疑問を持つ可能性もあると感じました。
「hogeかどうか」を見る場合にhogeという変数名にする。
ただし、「trueかどうか」の場合に破綻する。var true = isTrue();
ただの感想です。
実用的で美しくて大変感動しました。
素敵な記事をありがとうございます。
toやforってどうしてますか。
自分はキャッシュやDBに保存するときなんかは~ToCacheみたいに書いてるんですが、
ForCacheとか書いている人もいて英語的にどうなんだろうと。。。。
@0xCAT さん
Delphi/C++ BuilderではSaveToFile(), LoadFromFile()を僕はよく使います。
Cache に 保存の場合は、SaveToCache() ( SaveToDB() )だと意図が分かりやすいと思います。
githubで検索すると
- saveToCache() : 15万件
- saveForCache() : 0件
forCacheの場合は「Cache用に」という意図なのでしょう。
関連 http://stackoverflow.com/questions/15197600/bind-image-and-save-for-cache-folder
"Cache用"の意図での「SaveForCache()」はアリ、だと思います。
なるほど!やはり保存場所を明確にしたい場合はTo一択なんですね
ありがとうございます
@syuilo @7of9 @kameon
ちょっと反則的かもしれませんが、「piyoがhogeという状態である」をそのまま
piyoIsHoge
とするのはいかがでしょう。isHoge()
関数が引数を取らない時はstateIsHoge
にするとか。「名前に『is』が入ってるからbool値だな」(変数ならbool値が入っている、関数ならbool値が返ってくる)と判断し、頭に名詞を付けることで「これは変数だな」と判断できるのではないかと思います。