トップページ⇒tech
1001コメント266KB

クラス名・変数名に迷ったら書き込むスレ。Part20

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2011/07/29(金) 21:32:01.00
クラス名、変数名のつけ方に悩んだら書き込むスレです。

命名規則や設計の善し悪しについて議論するのは基本的に禁止。

前スレ
クラス名・変数名に迷ったら書き込むスレ。Part19
http://hibari.2ch.net/test/read.cgi/tech/1293201229/
0850デフォルトの名無しさん2012/01/14(土) 13:14:16.59
>>847
LeftTop はダメで TopLeft が良いという根拠は何?
0851デフォルトの名無しさん2012/01/14(土) 13:47:05.60
日本語では、ふつうは上右といわずに右上というのと同じようなもんだろ。
0852デフォルトの名無しさん2012/01/14(土) 14:10:33.15
Google.com in English でググってヒット数を調べたら

LeftTop : TopLeft = 1 : 3

1:3 程度の差ならどちらでも良いと思うぞ
どちらを使っても、まともな精神の持ち主なら誰が見ても正しく解釈してくれる

たとえ LeftTop を使ってても、プロジェクト内のソースコードの
全ての LeftTop を TopLeft に置換しなきゃならんほどでもない

こんな些細な違いよりも、略記する方がよほど解釈に影響を与えると思うが
0853デフォルトの名無しさん2012/01/14(土) 14:14:07.49
と思ったが、ググった結果を改めて見てみると、

"Left Top" の結果は "left, top" でヒットしてるのが多いな

まぁ、拘るほどでもない些細な違いだとは思うが
0854デフォルトの名無しさん2012/01/14(土) 14:17:26.27
MSの命名に従うのが最善
0855デフォルトの名無しさん2012/01/14(土) 14:23:35.03
>>850
>>まさに>>851
0856デフォルトの名無しさん2012/01/14(土) 14:39:22.78
>>747=>>852か?
0857デフォルトの名無しさん2012/01/14(土) 17:28:16.07
せめてGoogleCodeSearchにしろよと。
意外に英語ネイティブの人のはひっかからんが。
0858デフォルトの名無しさん2012/01/14(土) 17:58:39.93
>>853
ふふ
0859デフォルトの名無しさん2012/01/14(土) 18:00:03.80
きもちのわるい笑いは、自分の心の中に閉じ込めておいてください
0860デフォルトの名無しさん2012/01/14(土) 18:30:25.17
ひひひ
0861デフォルトの名無しさん2012/01/14(土) 21:19:45.48
づづづw
0862デフォルトの名無しさん2012/01/14(土) 22:21:03.43
>>824-825
ありがとうございます。 
0863デフォルトの名無しさん2012/01/15(日) 12:23:26.71
簡易情報だけをもつオブジェクトに対してインスタンスメソッドを呼び出すことで
詳細情報をデータベースから読み込み、オブジェクトの詳細情報が取得/変更できる状態にしたいと思っています。
そのメソッド名は何がいいですか?
0864デフォルトの名無しさん2012/01/15(日) 13:44:41.12
>>863
GetDetailとかではまずい理由があるなら先に言った方がいいと思う
08658632012/01/15(日) 13:51:53.88
Get〜だと返り値で情報が返ってきそうに見えると思います。
そうではなく、あくまで内部で情報を取得して
オブジェクトの外からその結果を取得できる状態にするメソッドなので。
それと情報を取得するタイミングを意識したいので、Get〜の初回呼び出しで勝手に読み込む
ような形にはしたくありません。
0866デフォルトの名無しさん2012/01/15(日) 13:56:31.22
なるほど。

FetchDetail
LoadDetail
RetrieveDetail
PrepareDetail

こんなとこ?
0867デフォルトの名無しさん2012/01/15(日) 13:58:01.19
updateDetailedInformation
setDetailedInformationAvailable
loadDatabase
0868デフォルトの名無しさん2012/01/15(日) 13:59:52.14
>>865
LoadDetailは?
0869デフォルトの名無しさん2012/01/15(日) 14:01:49.79
setEditable
0870デフォルトの名無しさん2012/01/15(日) 14:04:24.92
enableDetail
0871デフォルトの名無しさん2012/01/15(日) 14:05:37.40
detailを名詞的に使うならdetailsがいいと思うけど
0872デフォルトの名無しさん2012/01/15(日) 14:51:08.45
詳細情報の取得/変更ができる状態にする
詳細情報の変更ができるようにする
詳細情報の変更の準備をする

PrepareChangeDetails
PrepareModifyDetails
0873デフォルトの名無しさん2012/01/15(日) 14:54:10.94
ん?できるようにするメソッドがあれば、逆のメソッドも必要だよな?

BeginChangeDetails
EndChangeDetails
0874デフォルトの名無しさん2012/01/15(日) 15:06:13.06
普通はいらないでしょw
人間も一緒だけど、最初にサマリーだけ読みたいのは、全情報を読むのには時間がかかるから。

一旦全情報を読んでからそれを忘れることにしても、ちょっとメモリーの節約になる以外に
メリットがあると思えないが
0875デフォルトの名無しさん2012/01/15(日) 15:06:18.32
ExpireDetails
0876デフォルトの名無しさん2012/01/15(日) 15:07:51.99
>>874
いらないものを時々捨ててくれるようになってないおかげで長時間使うとひどい目にあうアプリがたくさん。
OSが本気で捨てないからという理由がある場合もあるけどね
0877デフォルトの名無しさん2012/01/15(日) 15:12:15.94
>>874
普通は要るよ
0878デフォルトの名無しさん2012/01/15(日) 15:13:58.75
loadDetails
unloadDetails
0879デフォルトの名無しさん2012/01/15(日) 15:15:08.17
>>877
そんな実装見た事ありませんが....
0880デフォルトの名無しさん2012/01/15(日) 15:19:19.13
リソースを確保して用済みになったら解放する
当たり前の事
0881デフォルトの名無しさん2012/01/15(日) 15:21:01.87
それはDisposeパターンでしょ。
>>893が言うような内容とは全然違う。
0882デフォルトの名無しさん2012/01/15(日) 15:21:43.70
不要と思うけど>>873に訂正
0883デフォルトの名無しさん2012/01/15(日) 15:26:15.47
違わない
0884デフォルトの名無しさん2012/01/15(日) 15:27:17.83
ところでDisposeパターンって何?
0885デフォルトの名無しさん2012/01/15(日) 15:27:38.07
loadDatabase

いらんとおもうけど
unloadDatabase

でFA
0886デフォルトの名無しさん2012/01/15(日) 15:44:39.81
それだとデータベース自体を使用可能にするように受け取れる。
0887デフォルトの名無しさん2012/01/15(日) 15:47:06.95
>>885
データベース以外から読むように変えたらメソッド名も変えないといけないのかぁ。
0888デフォルトの名無しさん2012/01/15(日) 17:38:05.92
>>871
えー  そんなこと言うんなら enableTheDetail だろ

それよか enableDetail(ry って思っとけばいい
0889デフォルトの名無しさん2012/01/15(日) 17:51:12.62
対象がデータアクセスできる状態にすることを指すカッコイイ英語の呼び方がありそうな気がするんだが出てこないので悶々としているw
0890デフォルトの名無しさん2012/01/15(日) 17:54:50.69
setPermission
0891デフォルトの名無しさん2012/01/15(日) 17:55:09.25
それかもしかして unlock ?
0892デフォルトの名無しさん2012/01/15(日) 18:02:50.78
・・・そのメソッドが呼ばれたのであれば、データベースからそのインスタンスにデータが読み込まれるんだよな?
そこに視点を置けば

LoadDetails
LoadDetailsFromDatabase
LoadDetailsFromDB

かな

かな
0893デフォルトの名無しさん2012/01/15(日) 18:53:43.35
メソッド名は慣例上、小文字から始めたい
0894デフォルトの名無しさん2012/01/15(日) 20:37:52.40
class Base {
virtual ~Base(void) {}
virtual char const * GetName() const = 0;
};

class Hoge : public Base {
public:
static char const * GetName_() { return "Hoge"; }
char const * GetName() const { return GetName_(); }
};

名前かぶっちゃったんだけどどうしよう
両方共publicにしたいからアンダースコアとかで誤魔化したくない
0895デフォルトの名無しさん2012/01/15(日) 20:56:12.17
EnsureDetails
0896デフォルトの名無しさん2012/01/15(日) 21:03:42.26
>>894
その情報だけでは、スレの趣旨に反するが、設計が悪いとしか言えない


そもそもクラスメソッドの GetName_ とインスタンスメソッドの GetName は、
それぞれどういう役目なの?
0897デフォルトの名無しさん2012/01/15(日) 22:39:55.63
GetStaticName
GetDynamicName
0898デフォルトの名無しさん2012/01/15(日) 22:44:23.99
しぃしゃぁぷは、メソッド名の最初大文字なのか。。。。。。。。。。
0899デフォルトの名無しさん2012/01/15(日) 22:44:30.00
>>894
既に突っ込まれてるとおり質問が無茶振り過ぎ
0900デフォルトの名無しさん2012/01/15(日) 22:55:42.59
>>898
最近はCでもキャメルが多いでしょ。
Win32なんて昔からそうだけど。
ヤクザさんは胃の中の蛙だなw
0901デフォルトの名無しさん2012/01/15(日) 23:14:02.95
>>899
おまえ職場や学校で疎外感感じるだろ?
0902デフォルトの名無しさん2012/01/15(日) 23:16:21.91
>>901
おまえ.isBaka() == TRUE
0903デフォルトの名無しさん2012/01/15(日) 23:26:40.60
>>902
言われた本人が無視してるんだからスルーしようよ。
頼むよ...
0904デフォルトの名無しさん2012/01/15(日) 23:32:27.64
>>900
パスカルの間違い?
0905デフォルトの名無しさん2012/01/15(日) 23:41:49.09
>>904
その通りだねすまんです。
0906デフォルトの名無しさん2012/01/15(日) 23:58:08.16
>>905
>>901-903がつっこまなかったあたりにいろいろ考えざるを得ないねw
0907デフォルトの名無しさん2012/01/15(日) 23:59:06.05
>>906
あなたって凄いのね!!!!!!!!!!!!!!!!!
0908デフォルトの名無しさん2012/01/16(月) 07:54:26.24
>>894
俺はそういうばあいはHoge.GetName()とHoge::GetStaticName()にする
0909デフォルトの名無しさん2012/01/16(月) 10:25:25.96
_あんだーばー
~にょろ
|たてぼう
.てん
,こんま
0910デフォルトの名無しさん2012/01/16(月) 11:06:43.25
_ アンダースコア
~ チルダ
| セパレート
. ドット
, カンマ
0911デフォルトの名無しさん2012/01/16(月) 11:57:19.36
_ アンダースコア
~ チルダ
| オア
. ドット
, てん
0912デフォルトの名無しさん2012/01/16(月) 12:39:08.54
_ アンダーヘア
~ チンコ
| もっとチンコ
. 玉
, 毛玉
0913デフォルトの名無しさん2012/01/16(月) 15:52:13.19
>>912
息子が帰宅後、自分の部屋に直行
こんなレスを書いていたとは・・・
0914デフォルトの名無しさん2012/01/16(月) 17:59:32.58
チンコだけに
0915デフォルトの名無しさん2012/01/16(月) 19:22:09.93
決学彩雲国差異
0916デフォルトの名無しさん2012/01/16(月) 21:18:09.76
ディレクトリを一段だけ探すのを find()、
再帰的に辿って探すのを find_recursively() という名前にしています。
しかしよく使うのは find_recursively() のほうで、find()のほうはほとんど使いません。
そのため、よくつかう方のfind_recursively()をもっと短い名前にしたいと思います。
どんな名前がいいでしょうか。
find_recursively()をfind()にして、find()をもっと別の名前にするのが吉?
0917デフォルトの名無しさん2012/01/16(月) 21:34:38.14
現状を変えないのが吉

0918デフォルトの名無しさん2012/01/16(月) 21:53:21.02
>>916
指定するディレクトリ内に指定する名前が存在するかどうかを検査する方をexistsにするとか。

そもそも「一段だけ探す」って日本語は変だ。
「あるかないか調べる」でしょ。だからexists。
0919デフォルトの名無しさん2012/01/16(月) 21:55:27.06
find <--> findRec
find <--> findR

findAt <--> find
0920デフォルトの名無しさん2012/01/17(火) 14:50:05.09
>>918
>1
0921デフォルトの名無しさん2012/01/17(火) 21:10:01.90
>>916
find_recursivelyをfindにして、findをfind_no_recursively。
個人的にはfind(bool recursive)。

ついでに質問。
countとspanという名前のプロパティを持つクラスで、引数xを取るメソッドが繰り返し呼び出される。
メソッドは x と count + span を比較し、x の方が大きければ count へ x を代入し、trueを返す。
そうでなければfalseを返す。
という振る舞いをするクラスなんだが、なんて名前にしたものかと。
0922デフォルトの名無しさん2012/01/17(火) 21:35:05.29
>>921
日本語でおk
0923デフォルトの名無しさん2012/01/17(火) 21:43:30.69
>>921
だから質問が無茶振りだって....

っていうか、それって(x - count)の絶対値とspanを比較しなくて大丈夫なの?
電子回路のシュミットトリガー的というか、大昔のTVゲームのグラディウスのオプション的な
挙動が目的だと想像するんだけど。
0924デフォルトの名無しさん2012/01/17(火) 22:03:58.59
なんで挙動で命名しようとするのか
用途で命名するべきでは
0925デフォルトの名無しさん2012/01/17(火) 22:06:22.72
Add(x)でいいんだよ
細かい内容は隠蔽されてるから良いんじゃねーか
しきい値超えた時だけたされようがたされまいがぜんぜん違う値がたされようが
そんなことはクラス利用者にとってはどうでもいいんだよ
0926デフォルトの名無しさん2012/01/17(火) 22:06:46.45
>>921
それのメソッドはクラス内だけの計算の為に使われる非公開メソッドではなく、
そのクラスを利用する側に対して公開するものなのだろう

であれば、メソッド名はそのクラス自身が持つ役割と無関係ではあり得ない
そのクラスの役割は何だろう?

それともう一つ
そのメソッドはクラスが持つ状態を変化させるものでろあう
そして、引数によって無条件に変化させるのではなく、
count + span と比較することによってある種の制約を課している
つまり状態変化とその制約

この事もメソッドの命名に影響を与える
メソッドを利用するプログラマには、メソッド名から
状態が変化する事を読み取ってほしいのか、
制約がある事を読み取ってほしいのか、両方なのか
状態変化の内容も読み取れるようにしたいのか
どのような制約があるのかも取れるようにしたいのか
などなど

どのような情報をメソッド名から読み取ってほしいのだろう?

全ての情報をメソッド名に盛り込むと返って分かりにくくなるから、
もっとも重要な情報を簡潔にしてメソッド名に、
あとの情報はコメントやドキュメントに回す必要がある
0927デフォルトの名無しさん2012/01/17(火) 22:10:16.00
>>925
乱暴すぎ
そんなことがクラス利用者にとってどうでもいいかどうかは、場合による

今はどのような「場合」なのかを質問者が明確に説明していないのが問題
0928デフォルトの名無しさん2012/01/17(火) 22:14:57.56
じゃあTryAdd(x)でいいだろ
利用者はxを足すことを考えてるがその結果がどうなるかはクラスによる
「しきい値以上なら足す」なんて馬鹿正直にめんどくさいメソッド付けちまったら変更に弱すぎる
しきい値以上でなかったら半分足す仕様に変えたいなーって上司がぼやいたら関数名と利用者すべて書き換えるつもりか?
処理の詳細を匂わせるメソッド名じゃカプセル化の意味が無いんだよ
0929デフォルトの名無しさん2012/01/17(火) 22:20:35.28
むしろ何やるのか想像も付かないようなカッコいい名前つければいんじゃね?
0930デフォルトの名無しさん2012/01/17(火) 22:22:36.82
eternalShiningGaraxianAdd()
0931デフォルトの名無しさん2012/01/17(火) 22:26:16.46
それのどの辺りがカッコいいのか、ちょっと自慢気に解説してくれないか
0932デフォルトの名無しさん2012/01/17(火) 22:26:51.88
なにびびってAddとかつけてんの
0933デフォルトの名無しさん2012/01/17(火) 22:29:04.25
車田正美が見開きページで必殺技を叫んでいる体で
0934デフォルトの名無しさん2012/01/17(火) 22:29:58.07
まあ、そもそも質問者のレスを読むと、聞きたいのはクラス名のように読めるんだけどさ。
もっともあの文章が質問者の意図を正確に表現したものかどうか怪しいけどw

どのスレでもそうだけど、質問者は書き込みボタンを早漏気味にクリックする前に
よくてめえの文章を推敲して欲しいもんだよね。
09359212012/01/17(火) 22:41:50.76
あー、もっと具体的に書くべきだったか。
具体的に書くと、16ミリ秒単位で回ってるスレッド内でキー入力をチェックしてる
んだが、不用意にキー入力判定が連続入力されないようにしたい、と。
一度キー入力を受け付けたら100ミリ秒(前回の例でのspan)経つまでは
入力を拒否(falseを返す)、それ以上経っていたら入力を許容(trueを返す)。
countは入力を受け付けた時間を記録しているだけで、countもspanも
別に名前にこだわりはない。固定してるように読めるね。すまん。

で、当初はKeyCheckerって名前にしようと思っていたんだが、他に16ミリ秒毎に
実施する必要がない処理がいくつかあるので、汎用的に
「前回受け付けてから一定期間が経過しているかどうか」を表すクラスにして
あっちこっちで使い回そう、と思ったわけですわ。
で、そのクラス名をなんにしたもんか、と。中途半端に処理内容を書く
んじゃなくてどういう目的のクラスなのかを書くべきだったね。すまん。

というわけで、内部的に値を足し込むことが目的じゃないのでAdd(x)やTryAdd(x)は
ちょっとアレな感じ。すまんねわざわざ書いてもらったのに。
0936デフォルトの名無しさん2012/01/17(火) 22:55:06.34
それだったらInputでもなんでもわかりやすい名前にしたほうがいい
入力クラスを利用する側からすれば入力クラスが実際には内部的に少し待ってるなんてことを意識したくないはずだ
0937デフォルトの名無しさん2012/01/17(火) 22:57:11.46
TimeoutCheckerとかかなあ。
でも、これって普通はクラスにするまでもないような気もするけどねえ....
0938デフォルトの名無しさん2012/01/17(火) 23:04:15.83
CheckElapsedTime()
09399212012/01/17(火) 23:19:26.83
TimeoutCheckerか!なるほどそれでいきます。
なんとなく目覚まし時計的なイメージでAlarmにしてたんだけど
警報的な意味合いが感じられてイマイチだよなぁ、と思ってて。
他の人もどうもありがとう。助かりました。
0940デフォルトの名無しさん2012/01/17(火) 23:22:47.87
何にでも名前をつけたい病
0941デフォルトの名無しさん2012/01/17(火) 23:33:07.14
>>939
自分で提案しといてあれだけど、この名前にはちょっと疑問がないわけでもないんだよね。
というのは、使い方としてはたぶん、

void start(int countDown)
みたいなメソッドを呼んでカウントダウンを開始することになると思うんだが、

(1) このメソッドを呼ぶ前
(2) このメソッドを読んでから指定時間経過後

たぶん欲しいのは、この二つのどちらかの場合trueを返すメソッドな訳だよね?

仮にこれをクラス名に引きずられてIsTimoutとかしちゃうと、上の(1)の場合にも
trueを返すのが不自然に感じられるような気がしないでもない。

まあ気にしなきゃ済む問題かもしれんが。
0942デフォルトの名無しさん2012/01/17(火) 23:40:41.31
>>1
命名規則についてはどこで議論しろというんだ
0943デフォルトの名無しさん2012/01/17(火) 23:47:58.74
まずはここでどうぞ
その後の流れ次第ではスレ立てしてもいいよ
http://toro.2ch.net/test/read.cgi/tech/1326081866/
09449212012/01/18(水) 00:36:46.11
>>941
isTimeoutが最初に呼ばれる時は初期値0と比較して、カウントダウンではなく
カウントアップで経過確認してるのでまぁいいかなと。
疑似コード的に書くと以下のような感じ。

void main() {
 TimeoutChecker keyChecker(100), fpsChecker(1000), ...;

 while (true) {
  time = timeGetTime();
  ...;
  if (keyChecker.isTimeout(time)) ...;
  if (fpsChecker.isTimeout(time)) ...;
  ...;
 }
}

とまぁ、FPSみたいにせいぜい1秒単位で処理すればいいものや、
パフォーマンスが悪いときに動的に一部の処理の実行頻度を落としたり、
ということをやろうとするとクラス化してまとめておいた方が
管理しやすいよね、というだけの話です。
0945デフォルトの名無しさん2012/01/18(水) 02:21:45.77
>>928
なんでAddAdd言ってるのかわからないんだけど、
メソッドの処理としては、countにxを代入するかしないか、だよな。
0946デフォルトの名無しさん2012/01/18(水) 02:23:36.00
>>935
6フレに1回しか入力できないとかシンクロ連射涙目じゃん
0947デフォルトの名無しさん2012/01/18(水) 10:04:05.00
設計が間違ってると名前付も上手くいかないことが多い
いい名前が思い浮かばなかったらまずはコードを見直すことから始めよう
今回のケースはまさにそれです
0948デフォルトの名無しさん2012/01/18(水) 14:16:35.33
理念としては同意するんだがな。
0949デフォルトの名無しさん2012/01/18(水) 15:47:31.05
>>947
しみじみ同意。
俺もその境地にたどり着いた。
0950デフォルトの名無しさん2012/01/18(水) 15:54:12.01
そりゃ単に機械的に書き下せない未知のコードパターンに嵌まり込んで
抜け出せず思考停止状態に成ってるだけだわ
レス数が950を超えています。1000を超えると書き込みができなくなります。