- PR -

if〜elseの書き方

投稿者投稿内容
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2005-12-18 16:25
最近人のコードを修正することが多くなって、いろいろ人によって癖があるんだなぁと思う今日この頃です。

件のif〜elseの書き方なのですが。
関数の最後にif文がある場合の皆さんのご意見を聞きたいと思い投稿しました。

1.条件が成り立たなかったことを明確に書きたい派?
コード:
  if (条件){
    [処理]
    return true;
  }else{
    [else処理]
    return false;
  }
  return false; //冗長なのに書く人がいるんですよね。
}



2.条件が成り立たなかった場合しか処理は下に流れないじゃん派
コード:
  if (条件){
    [処理]
    return true;
  }
  [else処理]
  return false;
}



私の場合は後者なんですが、コードのメンテナンス性とうを考えた場合どちらが有利なのでしょう?
elseに書きたい気持ちもわからなくも無いんですけどね...
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-18 17:06
引用:

未記入さんの書き込み (2005-12-18 16:25) より:

件のif〜elseの書き方なのですが。
関数の最後にif文がある場合の皆さんのご意見を聞きたいと思い投稿しました。

1.条件が成り立たなかったことを明確に書きたい派?
コード:
  if (条件){
    [処理]
    return true;
  }else{
    [else処理]
    return false;
  }
  return false; //冗長なのに書く人がいるんですよね。
}



2.条件が成り立たなかった場合しか処理は下に流れないじゃん派
コード:
  if (条件){
    [処理]
    return true;
  }
  [else処理]
  return false;
}





僕は「3.条件が成り立つ場合しか下に流れないじゃん」派です
理由は、次のようにメソッドの続行が不可能な例外パターンは、必ずしも一つじゃないことが多いからです。

コード:

  if (いけない条件A){
      後始末処理A();
      return false;
  }

  if (いけない条件B){
      後始末処理B();
      return false;
  }

  本来の処理();
  return true;
}


囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-18 17:12
こんにちは。

その前のコードがどうなっているかによるんですかねぇ。

コード:
  if (条件1){
    [処理]
    return true;
  }

  ・・処理・・

  if (条件2){
    [処理]
    return true;
  }

  if (条件3){
    [処理]
    return true;
  }

  return false;
}


else if ももちろん組み合わせる時あり。

コード:
  処理…

  // 最後に
  if (条件){
    [処理]
    return true;
  }else{
    [else処理]
    return false;
  }
}


こうかな。1.の「冗長なのに書く人がいるんですよね。」の部分は絶対なしですね。
到達できないコードはなし。

_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-18 17:26
引用:

R・田中一郎さんの書き込み (2005-12-18 17:06) より:

僕は「3.条件が成り立つ場合しか下に流れないじゃん」派です
理由は、次のようにメソッドの続行が不可能な例外パターンは、必ずしも一つじゃないことが多いからです。


いわゆる、ガード句ですね。

前提条件によってガード句を使うべきかどうかは変わります。
メソッドに対して単一の条件分岐であれば、ガード句は使いませんが、
複数ある場合はガード句を使うことになるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2005-12-18 17:34
引用:

R・田中一郎さんの書き込み (2005-12-18 17:06) より:
僕は「3.条件が成り立つ場合しか下に流れないじゃん」派です
理由は、次のようにメソッドの続行が不可能な例外パターンは、必ずしも一つじゃないことが多いからです。


パラメタチェックなどの処理の場合は大抵このパターンなりますね、見落としていました。

引用:

囚人さんの書き込み (2005-12-18 17:12) より:
else if ももちろん組み合わせる時あり。
コード:

処理…

// 最後に
if (条件){
[処理]
return true;
}else{
[else処理]
return false;
}
}


こうかな。1.の「冗長なのに書く人がいるんですよね。」の部分は絶対なしですね。
到達できないコードはなし。


冗長なコードは書かない。<やっぱりそうですよね?
統一感が出て綺麗といっている人がいるんですよ。
他にもswitchのcaseは必ず breakで終わらせるとか...(^ ^;
コード:

switch(expr.){
case 1:
[処理];
return value;
break; // <<ここが冗長
〜省略〜
default:
[処理];
break; // <<ここが冗長
}


ってな具合ですね。


少し、質問の意図がずれて伝わってしまったようなので、質問文を少し変えます。
【条件にマッチしなかった場合の処理時にelseを使いますか?】が聞きたかったことです。



[ メッセージ編集済み 編集者: 未記入 編集日時 2005-12-18 17:37 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-18 17:48
引用:

未記入さんの書き込み (2005-12-18 17:34) より:

統一感が出て綺麗といっている人がいるんですよ。
他にもswitchのcaseは必ず breakで終わらせるとか...(^ ^;


「統一感が出て綺麗」という理由ならば大反対ですね。
仕様変更があった場合のフォール スルー回避のために用意するのであれば別です。
フォール スルーは可読性を損なうため、使用するべきではないからです。
(C# でフォール スルーが出来ない理由のひとつでしょう)

引用:

少し、質問の意図がずれて伝わってしまったようなので、質問文を少し変えます。
【条件にマッチしなかった場合の処理時にelseを使いますか?】が聞きたかったことです。


「真または偽での処理後に return で制御を返す場合」という前提条件をつけないと、
答えが変わってくると思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-19 14:59
引用:


じゃんぬねっとさんの書き込み (2005-12-18 17:26) より:

いわゆる、ガード句ですね。

前提条件によってガード句を使うべきかどうかは変わります。
メソッドに対して単一の条件分岐であれば、ガード句は使いませんが、
複数ある場合はガード句を使うことになるでしょう。



ガード句と言うんですね。知りませんでした。

単一の場合って、どんな場合でしょうか?

コード:

private function 明日は雨が降る() as boolean
    if (not いつもより蛙がたくさん鳴いている()) then
        return (false)
    end if
    return (true)
end function



こういう場合ですか?
その場合は、

コード:

private function 明日は雨が降る() as boolean
    return (いつもより蛙がたくさん鳴いている())
end function



こう書いたほうがわかりやすいですね。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-12-19 15:24
java だと、以下の記述はエラーになりますね。
return の後は何も記述できません。


引用:

未記入さんの書き込み (2005-12-18 17:34) より:

他にもswitchのcaseは必ず breakで終わらせるとか...(^ ^;
コード:
switch(expr.){
case 1:
  [処理];
  return value;
  break; // <<ここが冗長
  〜省略〜
default:
  [処理];
  break; // <<ここが冗長
}


ってな具合ですね。


スキルアップ/キャリアアップ(JOB@IT)