ぽざうねっと

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  396  : 記事  0  : コメント  1030  : トラックバック  66

ニュース

さて、今年の秋は何を漬けようか

書庫

日記カテゴリ

Accessory

Community

Private

public static bool CheckTextByteLength(string text, int maxLength) {
    bool retFlag = true;
    Encoding sjis = Encoding.GetEncoding("Shift_JIS");
    if (maxLength < sjis.GetByteCount(text)) {
        retFlag = false;
    }
    return retFlag;
}
実際に現在の現場で使われているよくあるメソッドです。
たった数行のソースなれど、私は非常に読みづらいソースだと思います。
bool 値だからたった二種類の値しか返さないのですが、ぱっとみてどのときに true かわかりにくくないですか?
しかもこのメソッドは、特定の条件ならば false を返すという意味に重きがおかれています。
bool を返すメソッドにおいて、利用者が一番知りたいのは true になる条件ではないでしょうか?
public static bool CheckTextByteLength(string text, int maxLength) {
    Encoding sjis = Encoding.GetEncoding("Shift_JIS");
    return sjis.GetByteCount(text) <= maxLength;
}
この場合、これで十分なわけです。
bool 値を返すメソッドの場合、「○○のとき true, そうじゃないとき false」というような記述よりも、「○○かどうかを返す」という記述をしたほうがよりわかりやすいと思います。
もちろん、そんな単純なロジックのメソッドばかりじゃないでしょう。
そんな場合でも、同一メソッド内で if 文などで使用しない限り、変数に格納するのではなく return true; と直接書いて欲しい。
メソッドが長くなればなるほど、「結局どんなときに true になんのよ?」ってのが把握しづらくなる。
ま、私のどたまが悪いからといわれたらどうしようもないですが。
投稿日時 : 2007年4月25日 8:34

コメント

# re: 真偽値を返すメソッドにおいて 2007/04/25 9:34 R・田中一郎
はげどう(平仮名で書くと変)

基本的に長くなればなるほど、読みにくさもバグを含む可能性も高くなるわけです。
唯一、長くするための理由として「わかりやすさのため」というものがあります。

前者コードは、長いのにわかりにくいから駄目です。


# re: 真偽値を返すメソッドにおいて 2007/04/25 9:35 επιστημη
僕ならいっそshift_jisでの長さを返す ByteLength(string) だけにしちゃって、呼び側で

if ( ByteLength(なにか) >= 許容長 ) ...

ってやるかも。そーすりゃ真偽は明らかだし。


# re: 真偽値を返すメソッドにおいて 2007/04/25 9:41 シャノン
俺ならメソッド名を「IsTextLongerThan」とかにする(英語的に正しいかどうかはご愛敬)。
「bool 値を返すメソッドの名前にCheckをつける」ってのは俺の中ではご法度の一つ。
短ければいいのか長ければいいのかがメソッド名から分からない。

# re: 真偽値を返すメソッドにおいて 2007/04/25 11:10 とっちゃん
おいらだったら... uint GetLengthSJIS( string ) かなw
段取りは、えぴさんとおなじw


# re: 真偽値を返すメソッドにおいて 2007/04/25 12:26 かずくん
ちょっと違う話になってしまうけど、真偽値の扱いを理解していないという点で、勘弁して。

むかし、こんなのをどこかで見た
void Hoge(bool b) {
if (b = true) {
uge.Flag = true;
}
else {
uge.Flag = false:
}
}

いろんなところで、突込みどころ満載。

# re: 真偽値を返すメソッドにおいて 2007/04/25 12:59 シャノン
> いろんなところで、突込みどころ満載。

一番のツッコミどころは、uge.Flag は決して false にならないというところか。

# re: 真偽値を返すメソッドにおいて 2007/04/25 13:02 ひろえむ
私なら英語であれば
bool IsTextExceedMaxLength(string targetValue, int length)
日本語であれば
bool テキストは最大桁数を超過している(string 比較対象文字列, int 長さ)
とかにするかなぁ。

理由はシャノンさんと同様で名が体を表していないから(^^;

"Checkうんちゃら"だったり"うんちゃらCheck"とかって命名をよく見かけますが、その名前から何型が戻ってくるのかわからないし、おまけに何をチェックしているのかも抽象的すぎてわからなかったりするんですよね(^^;

たとえば今回の場合、maxLengthという引き数名を見れば最大桁数を比較するんだろうなとわかるんでしょうが、実際コーディングされる際には

if(CheckTextByteLength(strValue, 8)) {
処理();
}

となっていたら、何をチェックしているのかわからなくなる気がします(^^;
長さをチェックしていることはわかるんですが、長いのか短いのかオーバーしているのか、範囲チェックしているのか・・・。

なので、戻ってくる値とチェックしている内容を明確に表現していないと可読性を落とすことになりそうな気がします(^^;

# re: 真偽値を返すメソッドにおいて 2007/04/25 13:25 通りすがってない
なんかいつもわんくまさん達の意見と違うんですが、私はこう思います。
・ Check~ は何かをチェックする。
・ チェックしてダメなら false、よければ true を返す。
・ 引数に maxLength とあるので、桁数はこれを超えてはいけない。
合わせると、桁数をチェックして長ければ false になると...

正当化しようと必須なんですが、白状すると、私は例に挙げられたようなコードを書いてますww
(if で判定するか return 式; とするかは、また別の要因が働きますが)
もちろんポリシーを持ってそうしてます(これが一番やっかい?w)

> 一番のツッコミどころは、uge.Flag は決して false にならないというところか。
C# だと2個所でコンパイルエラーになりますw

(名前が微妙にころころ変わってすみません...)


# re: 真偽値を返すメソッドにおいて 2007/04/25 13:28 通りすがってない
誤:必須 正:必至
※注意:訂正する目的で間違ってるんじゃないです...

# re: 真偽値を返すメソッドにおいて 2007/04/25 13:33 通りすがってない
> C# だと2個所でコンパイルエラーになりますw
またまたすみません。間違っていました。これは見なかったことに...

# re: 真偽値を返すメソッドにおいて 2007/04/25 14:01 シャノン
> ・ チェックしてダメなら false、よければ true を返す。

個人的には、これが暗黙知なのが、最大のダメポイントですね。

# re: 真偽値を返すメソッドにおいて 2007/04/25 14:29 通りすがってない
そうなんでしょうね...
私のコメントでは正当化するための必死さが全然伝えられていませんでした。
この点を補足しようといろいろ文章を考えたのですが、「暗黙知なのが、最大のダメポイント」の壁を超えることはできませんでした。
私には援軍は来ないでしょうか...
ただこれだけは言わせてください。訂正した誤字が間違ってたorz...


# re: 真偽値を返すメソッドにおいて 2007/04/25 14:40 シャノン
> 私には援軍は来ないでしょうか...

あ、お気を害されましたら申し訳ないです。

ちょっと援護。
今回は前提が「真偽値を返す場合」ですが、例えば取り得る結果が3値ある場合は、「Is~」にはできません。
そういう場合の命名は…Check?
3パターンのどれなのかをメソッドではなく呼び出し側に判断させる方がベターでしょうかね?

# re: 真偽値を返すメソッドにおいて 2007/04/25 14:57 通りすがってない
> ちょっと援護。
言ってみるものですね~
書かれた場面では Get~ にして呼び出し側で判定すると思います。
けど援護になっていないと感じるのは私だけ~w

# re: 真偽値を返すメソッドにおいて 2007/04/25 15:06 ひろえむ
>回は前提が「真偽値を返す場合」ですが、例えば取り得る結果が3値ある場合は、「Is~」にはできません。
>そういう場合の命名は…Check?

んー、そういう場合はモノにもよりますが、Enumで定義しておいて、Get~でとってくるかなー(^^;;;

たとえば、データが真偽か値なしかを判定するのに
enum ResultType {
None,
TrueValue,
FalseValue
}


ResultType GetResult()

てな感じでしょうか(^^;

そうやっていくと、Checkという単語を使う場面てプロパティくらいしかないのかなぁと思うんですよね。"なんとかチェック"をしたいときにTrueに設定するとか。
CheckFileExist
とかね(^^;

# re: 真偽値を返すメソッドにおいて 2007/04/25 15:08 ひろえむ
あ、かぶっちゃった(^^;

# re: 真偽値を返すメソッドにおいて 2007/04/25 15:15 R・田中一郎
>ただこれだけは言わせてください。訂正した誤字が間違ってたorz...

面白すぎる・・・

# re: 真偽値を返すメソッドにおいて 2007/04/25 18:00 επιστημη
Is~と命名できるのは戻り値がboolだからであって。
二通りの戻り値、'みかん'と'りんご'のどっちかが得られるものに対し
Isみかん() とはせんだろー、と。
# これはむしろ 'みかん' か 'ほかのなにか' かを判断するbool関数。

そうなると結局判断は呼び側に任すわけで、
> if ( ByteLength(なにか) >= 許容長 ) ...
と同じコト。

# 脱線ギミです。すんません。


# re: 真偽値を返すメソッドにおいて 2007/04/25 18:04 シャノン
> 二通りの戻り値、'みかん'と'りんご'のどっちかが得られるものに対し
> Isみかん() とはせんだろー、と。

そうですね。
「アプリケーションを終了するには [OK] をクリックしてください。アプリケーションをデバッグするには、[キャンセル] をクリックしてください。」
なんて、糞くらえの典型例ですw


# re: 真偽値を返すメソッドにおいて 2007/04/25 20:40 ひろえむ
ん?

>Is~と命名できるのは戻り値がboolだからであって。
>二通りの戻り値、'みかん'と'りんご'のどっちかが得られるものに対し
>Isみかん() とはせんだろー、と。

ん? なんか問題がすり替わっていませんか?

みかんかどうか判断する必要があるのであればIsみかん()でいいですし
2通りの戻り値を取得したい(という役割)のであれば、そういった命名(たとえばGetくだもの()とか)が必要だと思います。

この2つの問題を一緒にしている理由がわかりません。

># これはむしろ 'みかん' か 'ほかのなにか' かを判断するbool関数。

なので、これが理解できません(^^;
ここから

>そうなると結局判断は呼び側に任すわけで、
>> if ( ByteLength(なにか) >= 許容長 ) ...
>と同じコト。

これになぜつながるんですか?(^^;
私があほぅなだけ?(^^;;;

# re: 真偽値を返すメソッドにおいて 2007/04/25 21:06 THREE-ONE
も、盛り上がってる(汗)
しかもほとんどがメソッド名の話題だ。
私が個人的に作るなら、えぴさんと同じやり方にしますねー。
メソッド名に SJIS を含めるかどうかは、アプリケーションの環境しだいかなぁ。
でも、Check のつくメソッドは許容します。
ドキュメントコメントがちゃんと書いてあるというという前提でですが。


# re: 真偽値を返すメソッドにおいて 2007/04/25 21:47 επιστημη
あ、いや、boolを返すものだけ特別にIs~にしなくてもいいよなー、とふと思ったわけでして。
うまく処理できたか否かを返すのに IsOK() なんてのはよくやるけども、
これだって GetResult() でいいような(たぶんやんないけど)。
戻り値の型が "たまたま" boolなだけなんだから。


# re: 真偽値を返すメソッドにおいて 2007/04/25 23:13 ひろえむ
あ、なるほど。 わかりました(^^)

ただ、私の場合、何を評価しているのか、なんで評価しているのかをできるだけ表現する手段としてメソッド化して表現するってことが結構多いです。

もちろん、そのままの条件を表現することで理解しやすいのであればそれでやりますが、コメントがついていないと読みにくいケース(表現しきれないケース)が多い気がするんですよね(^^;

コメントは最低限にしたいほうなので(^^;;;

# re: 真偽値を返すメソッドにおいて 2007/04/26 8:33 ひろえむ
あ、肝心な主のメッセージを(^^;;
>でも、Check のつくメソッドは許容します。
>ドキュメントコメントがちゃんと書いてあるというという前提でですが。

いや、Checkを名詞的に使っているメソッド名ならありなのかもしれませんが、"ほげほげCheck"や"Checkほげほげ"って見た目からしておかしくないですか?

少なくともBool値が帰ってくるように読めない気がするんですよね。
なので、問い合わせしているんだったら問い合わせしているらしい命名が重要だと思うんです。 

なので、"Isうんたら"であったり"Canうんたら"であったり、"Getなにがし"のような何かを問い合わせたり取得したりという感じのメソッド名をつけるなぁって思うんですよ。

なので、私は何が何でもCheckをつけないっていうワケではないですね(^^;
たとえば、GetなにがしCheckResult()というあらかじめそのチェックそのものが名前として存在している場合はありかな(^^;

# re: 真偽値を返すメソッドにおいて 2007/04/27 0:32 THREE-ONE
状況によりけりだと思うんですよねー。
私はCheckほげほげは使いませんが、Validateほげほげはよく使います。
”検証する”、”確認する”という行動と検証結果が重要で、どんな検証しているか?なんてのは隠蔽されてていい状況ってないですか?
たとえば、画面クラスがビジネスクラスの検証メソッド呼び出すときとか。
仕様はロジッククラス内で閉じていればいいと思うので、”ほげほげを検証する”というメソッドで十分じゃないかなーと思うときはあります。
さすがに、今回のような低層で利用されるメソッドには個人的には使わないですが。

Post Feedback

タイトル
名前
Url:
コメント: