質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

Q&A

解決済

3回答

11098閲覧

関数名に動詞以外を使うことについて

MasatakaMiyoshi

総合スコア109

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

0グッド

1クリップ

投稿2016/12/31 13:42

独学でプログラミングを勉強している者です.

これまで作ってきた関数名はなるべく動詞になるように統一してきたのですが,関数名の中には,

  • size()
  • range()

等,名詞が使われる場合がしばしばあると思います.同様に,クラスのメソッドの場合でも,

  • user.name() # user.get_name()ではない
  • user.email() # user.get_email()ではない

となる場合があります.

一方で,たいていの関数ではget, make, create, generate, setup, build, compose,...等,動詞が使われることが多いと思います.

これらの使い分けは何なのでしょうか?
なぜ・いつどこで,関数やメソッドに動詞以外を使用することが可能になるのでしょうか?

自分の中では,単にある値を参照して返すだけの関数 (get_◯◯) においては名詞を利用しても良いのだろうか,など色々と思いを巡らせていますが,リーダブルコード等を読んでも名詞句・動詞句の使い分けについて書かれていないのでよく分かりません (例えば,name()とget_name()は何が違ってくるのだろうか?).

ご存じの方,心当たりの有る方,ご教示よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

リーダブルコード最近読みました。

すごく良い本であると思いますが、バイブルとすべきものではなく教科書的に基礎として知っておいたほうが良い内容が書かれています。

応用としてほかのケースもあるので、リーダブルコードはあくまで基本として考えてください。

ところでそのリーダブルコードの3.7ユーザの期待に合わせるでは次のような記述があります。

多くのプログラマは、getで始まるメソッドはメンバの値を返すだけの「軽量アクセサ」であるという規約に慣れ親しんでいる。この規約を守らなければ、誤解を招く可能性がある。

このあと、C++のlistのsizeが実は軽量アクセサではなく、そこそこ重い処理であるという説明があります。
つまり、getSizeと書いてあると同じようにsizeメソッドを扱っています。説明はしていませんが、getがつかなくても軽量アクセサに見える前提というわけです。逆をいうとgetがつかない場合も一般的には軽量アクセサです。

で、sizeはなぜgetがつかないかというと、listにsetSizeメソッドがないのは明白なので、sizeと書いたら配列のサイズが取得できるのが理解できます。(再びリーダブルコードをめくったら2.5名前の長さを決めるにConvertToStringはtoStringでもいいよねって書いてありました。getが不要と考えるのは合理的だと思います。)

nameの場合も、可変なインスタンス変数だったら、getName setNameと定義するべきだと思いますが、コンストラクタ以外で設定できない場合は、nameで十分だと思います。

なので、アクセスの識別がない場合は、軽量アクセサで不変な変数を取得していると想像します。(または、書いた人がそう思ってかまわないと伝えていると想像します。)

投稿2016/12/31 16:12

編集2017/01/03 05:24
iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasatakaMiyoshi

2017/01/05 00:21

iwamoto_takaakiさん,ご回答ありがとうございます. (BAに非常に悩んだのですが,ここは先に回答してくださった方に,というかたちにしました.申し訳ありません) 軽量で不変なアクセサという考え方は非常にしっくりきました. また,括弧書き内の「書いた人がそう思ってかまわないと伝えている」というポイントは非常に重要であるように感じました. 確かに名詞の関数を見たとき,まさか大規模な処理が実行されるだろうとは思わないですね…. 命名規則に悩んだときに,これらのご指摘を思い出して,参考にしたいと思います.
guest

0

解れば良い。という理由で落ち着いている気がしますが。

ライブラリ化するクラス群は、使用方法をできるだけ統一するために、
同じインターフェイスを継承していたりする事も多いです。
要するに、統一性が重要で、名詞、動詞などはそれほど重要ではないと思います。

投稿2016/12/31 14:10

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

リーダブルコード等を読んでも

独学でリーダブルコードをお読みになりましたか。尊敬します。

さて、ここからは個人的な考えなので、
「ふーんそういう考え方もあるのか」
程度に読んでいただけると幸いです。

大抵の場合、同士をつけない関数・メソッド名は、
「固定された値で、変更されない」
というのが鉄則だと思います。

しかし、例にあげていただいたクラスのメソッドの場合、メソッドのオーバーロード(多重定義)が使える言語であれば、以下のようにして名前を書き換える機能を実装することもできると思います。

python

1# ちなみにこのコードは動きません。「同一のメソッド名がある」とエラーが出ると思います。 2class User: 3 self.name = 'anonymouse' 4 self.email = 'john@due.xxx' 5 6 def name(self): 7 return self.name 8 9 def name(self, name): 10 self.name = name 11 # 以下省略

しかし、上のコードがもし動いたとして、以下のようなコードを実行してしまうと、nameプロパティが「(空文字列)」になってしまいます。

python

1tmp_user = new User() 2tmp_user.name('')

「使う側が気をつければいい」
という話になるかもしれませんが、プログラミングはあくまで、
「自分や誰かが楽するためにする作業」
だと私は思うので、このように混乱を招くメソッドを設計するのはよろしく無い気がします。

また、以下のようなケースもあるかもしれません。

python

1class User: 2 self.name = 'anonymouse' 3 self.email = 'john@due.xxx' 4 5 def name(): 6 # DB書き込み処理 7 return self.name

こうしてしまうと、
「このインスタンスのnameを呼び出して画面に描画しよう」
とした時に、不必要にDBへ書き込み処理を行うということが起こって、場合によってはDBサーバーへの高負荷に繋がるかもしれません。

これも、
「使う側が気をつければいい」
という話かもしれませんが、先ほど申した様に、プログラミングはあくまで、
「自分や誰かが楽するためにする作業」
だと私は思うので、このように混乱を招くメソッドを設計するのはよろしく無い気がします。


ちなみに、メソッドで返ってくる値とは別に裏側で他の処理をすることを「副作用」と呼びます


閑話休題

なので、私個人としては、
「この関数・メソッドで呼び出される値は、前の処理で一回設定されたら変更されることはないし、どこにも副作用を与えない」
もしくは、
「この関数・メソッドを呼んだことによって演算が行われても、どこにも副作用を与えない」
とはっきりしていれば、動詞は省いてしまっていいのかなと思います。

参考になれば幸いです。


P.S.
有識者の方々へ、絶対にもっと良い説明があると思うので、どんどん解答を上げてください。

投稿2016/12/31 14:40

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasatakaMiyoshi

2017/01/05 00:16

manzyunさん,詳しく丁寧なご説明ありがとうございます! 皆様ご回答ありがとうございました. manzyunさんやiwamoto_takaakiの「不変な値」「軽量な演算」に非常にしっくりきました. 今後はそのようなシチュエーションで使ってみようと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問