7232
@KeithYokoma

うまくメソッド名を付けるための参考情報

この記事は最終更新日から5年以上が経過しています。

クラス名編をつくりました

あるメソッドを定義しようとするとき、そのメソッドを使う人達が名前からどんなことをするか理解できるようにするには、メソッドの内容に応じて適切な情報量の命名が求められます。

この記事では、メソッド名に用いることでどのような情報が提供できるかを見ていきたいと思います。

真偽値を返すメソッド

場所 単語 意味
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

他にもあれば追記していきますし、編集リクエスト、コメント等いただければどんどんください!

7232
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
KeithYokoma
Android, Java, Perl, Scala, Play Framework, CoffeeScript, Smalltalk, JavaFX, Groovy, AWS, Docker
この記事は以下の記事からリンクされています
rana_kualuQiitaのいろいろランキング2020からリンク
alt_yamamoto良いコードの書き方からリンク
過去の26件を表示する

コメント

状態に関するメソッドで ensure が記載されていますが、 assert も同じ意味で使われていると思います。

2

@7of9 assertだと例外を投げるかexitするかほぼ確実に強制終了に近いことしそうなので、ensureみたいにエラーコードを返すこともありそうな名前と同列に扱うべきではないと思いますよ

4

@aokomoriuta なるほどです。

http://www.codeproject.com/Articles/1863/Design-by-Contract-Framework
にCheck.Ensure()の実装例がありますが、このように、assert()でなく例外で使う、という方法もあるということですね。

 public static void Ensure(bool assertion, string message)
    {
      if (UseExceptions)
      {
        if (!assertion) throw new PostconditionException(message);
      }
      else
      {
        Trace.Assert(assertion, "Postcondition: " + message);
      }
    }

勉強になりました。ありがとうございます。

1

ensure は「期待する状態かどうかをチェックし、そうでない場合はその状態にする」関数にも使われますね(ディレクトリが存在しなければ作成する、とか)

6

@uasi ありがとうございます。勉強になりました。
rubyやelixirはやっていませんが、こういう使い方というのは参考になります。

0

@KeithYokoma さん、Twitterが公開している文書 http://twitter.github.io/effectivescala/index-ja.html にある、副作用有無とか冗長なものは避けるとかそんなアドバイスがあると素敵かもしれませんね :wink:

以下、引用

副作用を起こす操作は能動態で命名する
user.setActive() ではなく user.activate() とする。
値を返すメソッドは説明的に命名する
src.defined ではなく src.isDefined とする。
ゲッター (getter) の名前の先頭に get を付けない
以前のルールと同様にこれは冗長だ。site.getCount ではなく site.count とする。
パッケージ名やオブジェクト名で既にカプセル化されている名前を繰り返さない
object User {
  def getUser(id: Int): Option[User]
}
ではなく
object User {
  def get(id: Int): Option[User]
}
とする。User.getUser は冗長だし、User.get よりも多くの情報を与えない。
6

@makito さん、ありがとうございます!

適切な量の情報を伝えるという点では、単語の意味の側面以外にもいろいろありそうですね!ここでは単語の意味に注目してみましたが、それらも含めてまた更新してみようとおもいます。

0

私がよく使うのに、

「検索して取得する」の retrieve
コレクション等から「特定の値を抽出する」の pluck

があります。ご参考まで。

1

https://twitter.com/codic_project
こちらのTwitterアカウントも見ておくといいですね。よく参考にさせてもらっています。

キューやスタックの「次に処理する要素を取り出す(取り除く操作を含まない)」というメソッドには、C++ではtopという名前を使いますね。peekは馴染みがなかったです。
似たような用途だと、Javaの乱数ライブラリやイテレータでは、nextという名前も使いますね。
キューやスタックには少々適切ではないと思いますが、シーケンシャルなコレクションだとC++ではfront/backという名前が使われます。

検索は、findに加えてsearchもあるといいですね。depthFirstSearch/breadthFirstSearchとかがよく使われる例です。

【IT英語】findとsearchの違い / find は「探し出す」とも訳されるように、「探す」行為が完了し何かが見つかることにフォーカスがあります。反対に、serachには完了するニュアンスはなく「探してみる」感じに近くなります。(140文字だとこれが限界...)
https://twitter.com/codic_project/status/317055943881936896

0

参考までに、私は状態に関するメソッドでPrefixにCheckも使うことが多いです。

0
(編集済み)

@narumi888

check は何をどうチェックして何を返すのか曖昧になるので自分は避けるようにしています。他人のコードで見かけたら、何を実行するか予想がつかないので警戒しつつドキュメントやソースを読みます。

たとえば Ruby 2.2.3 に添付されている RDoc モジュールには check の名前を持つパブリックメソッドがいくつかありますが、挙動はバラバラです:

RDoc::Parser#check_modeline(file_name)
    ファイル内の modeline を検索して一致する文字列または nil を返す

RDoc::Options#check_files
    配列 @files 内の各ファイルパスをチェックし、存在しなければ配列から取り除く
    存在するが読み書きできない状態なら、取り除かずに warn でエラーメッセージを出す

RDoc::Options#check_generator
    コマンドライン引数 --generator が1回以上与えられていたら例外を投げる

(これらは rdoc コマンドの実装詳細であり自分が直接呼び出すことはないとは思いますが……)

自分ならそれぞれ find_modeline, reject_missing_files, ensure_generator_unspecified にするかなと。

単純に期待する状態か否を見て bool を返すメソッドなら、名前は is_*, can_*, または exists のような動詞にしたほうが分かりやすいと思います。

validate_*verify_* という名前なら、期待する状態でない場合に詳細なエラー報告を返しそうだと予想できますし、 ensure_* なら期待する状態に修正してくれるか例外を投げそうだと分かりますね。

9

@ka215

pluckは以下を見て解釈すると「コレクションなどから特定の値を抽出する。その時、コレクションからは削除する」という使い方になりそうですね。

コレクションから取り出して、コレクションには残したままにしたい場合には他の用語がよさそうに思います。

0

とても有用な情報です。勉強になりました。

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〜 のメソッド名は、私も避けるべきと思います。出てきたら、普段の数倍緊張して読みますね。

0

from と近い感じで of とかよく使います。クラスが単一の値を表したものの場合は Xxx.valueOf とかも。

何かの後に続けて行うメソッドの接頭辞や接尾辞に thenもよく見ます。

また、~と一緒に的な意味や、インスタンスに付加情報を足した新たなインスタンスを生成するメソッドに withXxx、~のために的な説明や、from/ofと似たような用途で forXxx なんかも使いそうです。

check は曖昧になるので避けるってのは私も同意見です。他にも似たようなのに testjudge とかも危ない名前かなという感じがします。
特に、業務的なチェック処理なんかでbool値を返す check~ は(とてもよく見かけますが)、殆どが期待値かどうかを調べるメソッドなので isValid/isInvalidvalidate などを使うのが適切かなって思ってます。

ただし、結果がおおよそ予測できそうな単純な処理や、抽象化された機能では、これらの名前を使うのもありかなとは思います。

e.g.

  • JavaのライブラリGuavaのPreconditionsでは事前条件のアサーション用のメソッドにcheckで始まる名前を使ってます。
  • Predicate の test メソッドなど。

get/set は、個人的には冗長なので好みじゃないですが、JavaBeans のように仕組みとして利用されてたりする場合もあるので、冗長とわかっててもあえて get / set で揃えちゃう事もあるかも。(IDEの補完の一覧で同じ接頭辞で並ぶのでプロパティと判断し易いっていうメリットもいくらかはありそう・・・かも?)

あと細かいとこちょこちょこ。

  • pushpoppeek があるなら poll もあってよさそうかも。
  • 主にデータ操作系、こういうのどうでしょうか。
    • 先頭要素 head または first
    • 末尾要素 tail または last
    • next
    • prev または previous
    • 受け入れる accept
    • 提供/供給する provide または supply
    • 計算する calccalculatecompute
3

メソッドというかクラスのメンバに属さないようなただの独立した関数だとis~などの接頭辞は個人的になんか付けにくいですね。戻り値を代入する変数名と被ってしまうので。

// ok
var isHoge = piyo.isHoge();

// NG
var isHoge = isHoge(piyo);
3

@syuiloさん

そうですね。var isHoge = isHoge(piyo);を回避するため自分はvar bfHoge = isHoge(piyo);(bf: bool flag)などする場合もありますが、しっくりきてないですね。

0
(編集済み)

isHoge(piyo)は、"piyo"が"Hoge"という状態にあるかどうかを判断するのだから、
その戻り値を格納する変数は "Hogeという状態" を表す名前にするとよいと思います。

var hogeMode = isHoge(piyo)
if (hogeMode){
    ....
}

というか、「そのフラグをif文に突っ込んで、英文として意味が通じますか?」という問いを立てれば、
if (isHoge) とか if (hoge_flag) みたいな事にはならないと思いますが…。

1

「状態」という考えからhogeModeというのはなるほどと思いました。

反面、数ヵ月後のソースリーディングで以下のコードを見た時、「処理2はどういうモードなのだろうか?」という疑問を持つ可能性もあると感じました。

if (hogeMode) {
   // 処理1
} else {
   // 処理2
}
0
(編集済み)
var hoge = isHoge(piyo);

// 複数行にわたる記述

if (hoge) {
   // 処理1
} else {
   // 処理2
}

「hogeかどうか」を見る場合にhogeという変数名にする。
ただし、「trueかどうか」の場合に破綻する。var true = isTrue();

2

ただの感想です。
実用的で美しくて大変感動しました。
素敵な記事をありがとうございます。

0

toやforってどうしてますか。
自分はキャッシュやDBに保存するときなんかは~ToCacheみたいに書いてるんですが、
ForCacheとか書いている人もいて英語的にどうなんだろうと。。。。

0
(編集済み)

@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

And i want that when i bind it it will save the image to my disk for cache issues

"Cache用"の意図での「SaveForCache()」はアリ、だと思います。

0

なるほど!やはり保存場所を明確にしたい場合はTo一択なんですね
ありがとうございます

0
(編集済み)

@syuilo @7of9 @kameon
ちょっと反則的かもしれませんが、「piyoがhogeという状態である」をそのままpiyoIsHogeとするのはいかがでしょう。

var piyoIsHoge = isHoge(piyo);
if (piyoIsHoge) {
    // piyoがhogeである時の処理
} else {
    // それ以外の時の処理
}

isHoge()関数が引数を取らない時はstateIsHogeにするとか。

var stateIsHoge = isHoge();
var stateIsPiyo = isPiyo();
if (stateIsHoge) {
    // hogeである時の処理
} elseif (stateIsPiyo) {
    // piyoである時の処理
} else {
    // それ以外の時の処理
}

「名前に『is』が入ってるからbool値だな」(変数ならbool値が入っている、関数ならbool値が返ってくる)と判断し、頭に名詞を付けることで「これは変数だな」と判断できるのではないかと思います。

3
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
Java開発者のためのAzure入門
~
新人プログラマ応援 - みんなで新人を育てよう!
~