プログラム全般についての質問です。

下の関数を見てください。

public boolean isEditMode(int param){

  ~なんらかの処理~

  if (param > 80){
    return true;
  }

  return false;
}

戻り値がbool型の関数です。
何の処理をするものかは無視してください。

この関数、最終行でfalseを返しています。
これはやめろと注意されたことがあります。
(最後行ではtrueを返すよう作れということ)

自分もそう思う、という人がいたら理由を教えてください。
別にfalseでもいい、という方も、理由を教えてください。
言語は問いません。
どれくらいの人がどういった理由でそうしているか知りたいです。
よろしくお願いします。
ちなみに私は、そのときから最後はtrueを返すように作っています。

回答の条件
  • 1人2回まで
  • 登録:2007/01/27 19:22:36
  • 終了:2007/02/01 11:32:49

ベストアンサー

id:taisin0212 No.4

タイシン@我孫子回答回数165ベストアンサー獲得回数142007/01/27 20:02:34

ポイント14pt

私も[true]派です。


メンテナンスをするうえでの可読性を考えると、

基本となる戻り値は[true]であるべきと考えます。

id:cg_121

>メンテナンスをするうえでの可読性

これを意識するべきですよね。

2007/01/27 21:14:13

その他の回答(12件)

id:Tskk No.1

Tskk回答回数60ベストアンサー獲得回数02007/01/27 19:35:19

ポイント14pt

返り値のtrue/falseが中立的な意味ならどちらでも良いと思います。

例えば偶数・奇数の判定、文字の種類の判定などです。

正常/異常を表すのでしたら、異常値はif文の中に、正常値は一番最後にしたくなります。

id:cg_121

戻り値の意味による、ということですか。

2007/01/27 20:49:21
id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542007/01/27 19:45:45

ポイント14pt

私の場合は、正常に終了(何をもって正常とするかはその関数に何が求められているかによる)する場合が、関数の最後というふうにしています。

途中でreturnする場合はイレギュラーといった感じです。

が主にreturn文を複数書くというのはいやなので

bool flag = param > 80;
if (flag) {
 ...
}
return flag;

のようにして書くことが多いです。

id:cg_121

一般的には、関数が途中で終わる書き方は、よくないとされてますよね。

2007/01/27 20:56:00
id:garyo No.3

garyo回答回数1782ベストアンサー獲得回数962007/01/27 19:51:58

ポイント14pt

普通に条件が複数ある場合は最後にTrueになるのでは。

条件A,B、Cが成立していないといけない時はこうすると思います。

if(!A){

return false;

}else if(!B){

return false;

}else if(!C){

return false;

}

return true


誤判定で最後を通るのを恐れるので実際は、戻り値に最初にfalseを設定しておいて、条件が成立した時だけtrueを入れるように書きます。

これは「間違ってtrueを返すより、間違ってfalseを返す方が害が少ない」という考えからです。

boolean ret;

ret = false;

if(A && B && C){

ret = true;

}

return ret;

id:cg_121

間違いが起きる可能性が少ない、とうことですね。

2007/01/27 20:58:19
id:taisin0212 No.4

タイシン@我孫子回答回数165ベストアンサー獲得回数142007/01/27 20:02:34ここでベストアンサー

ポイント14pt

私も[true]派です。


メンテナンスをするうえでの可読性を考えると、

基本となる戻り値は[true]であるべきと考えます。

id:cg_121

>メンテナンスをするうえでの可読性

これを意識するべきですよね。

2007/01/27 21:14:13
id:yocchan731 No.5

yocchan731回答回数119ベストアンサー獲得回数142007/01/27 20:11:47

ポイント14pt

最後はtrue派です.断固trueでもないですが・・・

isEditMode(param)を英語っぽく書くならば,

Is param EditMode?です.

いうならば,「paramはEditModeですよね?」と尋ねています.

これは「paramがEditModeであること」を期待しています.

つまり,trueを期待しています.

期待しているということは,標準の動作がtrueであるということです.

なので,最後はtureを書いておきたいということでしょう.

id:cg_121

関数名からfalseが期待されると、最後はfalseでよい、ということになりますね。そういう関数を作ってよいと思うかどうか、というのもありますね。

蛇足ですが、関数名からは

「paramがEditModeであるならtrueを返す」ことを期待しているとわかりますが、

「paramがEditModeであること」を期待しているかはわからないと思います。

2007/01/27 21:35:58
id:Z9M9Z No.6

Z9M9Z回答回数343ベストアンサー獲得回数112007/01/27 21:17:12

ポイント14pt

まずAやってみて、うまくいけばおしまい。

ダメならBやってみて、うまくいけばおしまい。

それでダメならCやってみて、うまくいけばいいけど、

どれでもダメならダメって返す。

というプログラムは、A,B,Cがサブルーチンや関数なら、ありだと思うし、そう記述していいと思いますけど。

でも、例のように単なる変数比較みたいな条件節なら、最後をtrueにするようにまとめると思います。

id:cg_121

処理内容による。場合によってはfalseで返すのもあり、ということですね。

その理由ですが、なぜA,B,Cがサブルーチンや関数なら、ありなのでしょうか?

例のisEditMode関数が、関数内で他の関数やサブルーチンを呼び出しているかいないかが関係するということでしょうか?

2007/01/27 23:50:39
id:matsOS No.7

matsOS回答回数34ベストアンサー獲得回数22007/01/27 22:11:43

ポイント14pt

true派です。


関数に論理式を含め、戻り値をbool型で返すと言うことは、

「正しく処理を行って、正しく終了してるよね」

と言うことを確かめたいわけです。


「正しく終了したら、FALSE(偽)が返ってくる」

というのは気持ち悪いので、trueが返ってくる方が意味的にスッキリです。

ローカルルールかも。


(正しいか否かは、設計者の期待通りか否かということです。”期待に沿わないこと=FALSE(偽)”が返ってきて欲しいなんてことは無いんではないかと)

id:cg_121

ふむふむ、なんかプロっぽいですね。

逆にいうと、最後にreturn true;とあれば

>正しく処理を行って、正しく終了してるよね

という作りなのがわかりますよね。

2007/01/27 23:36:37
id:Bookmarker No.8

しおり回答回数191ベストアンサー獲得回数342007/01/27 23:07:56

ポイント14pt

私はどっちでも良いと思います。

というか、どっちかに固定するという考え方に賛成できません。

自然に条件を書いていって最後に真になれば真を返せば良いし、偽になれば偽を返せば良いと思います。

ちなみに、私自身はどっちでもない場合(比較式とか)が多いんですけどね。

id:cg_121

>どっちかに固定するという考え方に賛成できません。

ストレートな意見、ありがとうございます。

2007/01/27 23:49:34
id:flashrod No.9

flashrod回答回数31ベストアンサー獲得回数32007/01/27 23:59:51

ポイント14pt

こんなのはどっちでもいいものです。既に出た「最後はtrue」の回答を見ても全く同意できませんでした。関数名や値の意味でどうこうするものでもありません。戻す値の頻度で違えるものでもありません。

間違いを防ぐのは書き方で防ぐものではありません。プログラムの品質はテストで保証するものです。書き方を強要すると先に出たように妙なフラグが出てきたりしてそのほうが良くないです。書き方を工夫するよりは設計を工夫したほうが良いです。

途中で抜けるのが異常か正常かとうこととも関係ありません。関数の途中で抜けるのが良くないというのも根拠はありません。これは関数という概念が無い言語(昔のBASICやアセンブラなど)でサブルーチンの途中から抜けたり途中に飛び込んだりすることが可能な言語では「入り口一つ出口一つの原則」はありましたが、モダンな言語ではそんな心配をする必要は全くありません。

メンテナンスの可読性は重要ですが、値によって読みやすさが変わることはありません。名前付け規約として「負論理な名前は良くない」というのがあってこの場合 isNotEditMode() などとした場合、falseが編集モードなのかどうなのか瞬時には判別できないということはありますが、関数の途中か最後かというのとは何の関係もありません。

id:cg_121

どちらでもいい派。というかfalseにしないようにするなどという考えは意味が無いし、むしろ有害だ、といったところでしょうか。

2007/01/28 01:12:18
id:hidep1971 No.10

hidep1971回答回数68ベストアンサー獲得回数22007/01/28 00:41:11

ポイント14pt

私はプログラムを組む場合の考え方的には「false」派です。

逆に電気回路を組んだり、シーケンサーでラダーソフトを組んだりする場合は「true」派ですね。非常停止回路を組むときとかを考えるとは、やはり「全ての条件をクリアした時、初めて正常を返す」ようにしておかないと、人命をおびやかすことにもなりかねないからです。

例えば、上記の非常停止回路をハードで組んでいて、何かの拍子で非常事態にその非常停止回路が機能しなかった時(電線が断線していた等)、最悪の場合、機械が暴走して命を落とすこともあります。(実例もたくさんあります)

だから、こういう回路を組む場合、必ずB接点(最後に通るのは「true」信号)で回路を組みます。

話を戻して、プログラミングではその逆です。

最後に「false」を返すようにしておけば、いろんな条件式を経て、全ての正常条件をクリアした時、「異常」を返すので条件の入れ忘れ等があっても、最悪の事態は免れるからです。

逆だったらどうなるでしょう?

全ての異常条件を全てクリアたら正常を返すようなプログラムの仕方だと、その返り値が機械を動かす条件だった場合、異常条件を入れ忘れて、万が一その異常条件が成立してしまった場合、異常なのに、機械が動いてしまうことにもなりかねないからです。

id:cg_121

false派です、という方のご意見、貴重です。ありがとうございます。

2007/01/28 01:12:30
id:pyopyopyo No.11

pyopyopyo回答回数357ベストアンサー獲得回数882007/01/28 18:01:38

ポイント14pt

最後に true を返すか false を返すかは,

状況に応じて柔軟に変えたほうが良いと思います.


そもそも今回のコードだと,関数最後で

  return (param > 80);

と書く方が,見た目も,ロジックもはっきりして良いと思います.


最後で return false するようなルールに従っても

 if (param > 80)
    return true;
 return false;

最後で return true するようなルールに従っても,

 if (param < 80)
    return false;
 return true;

どちらも正直大差ありません.

id:cg_121

決めないほうがよい。そのほうが柔軟でよい。ということですね。

true派、false派、決めないほうがよい派、場合による派。。。。どちらかに決めてない人過半数。私の回りの人たちに聞いても、たぶん同じになったかな。そんな感じです。

ここでちょっと、質問を訂正します。

例の関数を以下のように訂正します。

public boolean 関数名(int param){

  ~なんらかの処理~

  return false;

}

まだまだ回答受付しています。同じような内容でもけっこうです。よろしくお願いします。

2007/01/28 20:23:29
id:kn1967 No.12

kn1967回答回数2915ベストアンサー獲得回数3012007/01/28 23:53:14

ポイント14pt

キモは『ダメだった場合に何を返すようにしておくのか?』なので、どのような値を期待しているのかによってtrueの場合もあればfalseの場合もありますね。


少し話はそれますが私は違ったルーチンの組み方をします。

『条件にあえば true を返させる』と仮定しますと、そのルーチンの冒頭で初期値としてfalseをセットしてから、条件に合えば true に変更といった処理に進み、最後の最後にセットされている値をreturnするという組み方にすることが多いです。


この方法はtrue/false2値の場合に限らず、いろいろな場面で使っています。

id:cg_121

肝が「ダメだった場合に何を返すようにしておくか?」なのはなぜででしょうか。

ロジックの間違いを犯さないため?可読性?なんのために「ダメだった場合に何を返すようにしておくか」を決めるのでしょう。

2007/01/29 15:20:11
id:hidetoz No.13

ひでと回答回数88ベストアンサー獲得回数82007/01/29 14:06:15

ポイント14pt

関数の意味合いによると思います。

「この関数の正常系は?」というのを一年後の自分に理解させるような書き方をするのが、一番無難かと思います。


個人的にはkn1967さんと同じく、最初にfalseセット、チェックしてtrueに変更。最後に変数をreturnが好きです。

「変数を返す」時点で変数に意味があることがわかり、変数でgrep掛けて一覧を出し、変数の前後行を調べれば何やってるか大体把握できます。

id:cg_121

>一年後の自分に理解させるような

というところに共感します。

一年後の自分、ソースを覚えてない自分は、他人とおなじですよね。

2007/01/29 15:27:46
  • id:cg_121
    質問者です。回答ありがとうございました。
    大体こんなふうですかね。

    trueに限らない・限定しない 1, 2, 6, 8, 9, 11, 12, 13
    true派 3, 4, 5, 7
    false派 10

    trueに限らない・限定しないという人が一番多いですね。
    理由は、決めるとそのせいで余計な処理が増える、コードがスッキリしない
    といったところでしょうか。

    私的には、taisin0212さんの回答はズバリ賞、ストライクでした。
    みんなこうだったらな~、と勝手に思っています。
    ズバリ賞はないので、いるか賞にしちゃいます。
    あとはhidep1971さんの回答も、立派、というか明確でいいなと思いました。
    なんかイヤ、とかいうより、ここはハッキリした理由をもつべきかなと思います。
  • id:garyo
    3 回答者:garyo 私
    10 回答者:hidep1971さん
    12 回答者:kn1967さん
    13 回答者:hidetozさん

    みんな、「間違えてtrueを返す」のを避けるよう書いているのが興味深かったですね。
  • id:pyopyopyo
    trueに限らない・限定しない派です。

    ふと思ったのですが
    bool isEditMode(int param);
    だけじゃなくて
    bool isDisplayMode(int param);
    のようなメソッドも同時に定義されている場合は、
    true派、false派はどうなるのかなぁと思いました。
  • id:cg_121
    同時にisDisplayNodeのほうもtrueでかえすのは同様だと思いますね。
    単純にそれぞれの関数がtrueで返すのがわかりやすいかと。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません