C++の条件評価であるif文とswitch文を説明します。
C++に関しては最後はストラウストラップの本を読むことになりますので、買っておいて損はありません。
if文とswitch文
条件評価はif文とswitch文の2通りあります。
Jeff Bayのオブジェクト指向の考え方によると、1メソッドで1つのif文、switch文です。
深くインデントするのは設計を間違っている、または、改善の可能性があることを心に刻みましょう。
特に、switch文は、else ifをいくつか重ねたような文なので、使用自体を自粛した方がよいかもしれません。
>>> 【オブジェクト指向の考え方】オブジェクト指向は滅びたのか、定着したのか
if文、switch文の使用方法を説明します。
bool型を返す関数、式が条件
if文の中に入るものはbool型にしましょう。まずは、比較演算子を説明します。
※実は0が偽でそれ以外が真となるC言語の仕様により、bool型でなくてもif文の条件式に書いてもいいんですが、混乱するのでやめた方がよいと思います。
比較演算子
bool型を返す式としては比較演算子が最も基本的です。
x == y // 等しい x != y // 等しくない x < y // より小さい x > y // より大きい x <= y // 以下 x >= y // 以上
評価順序は覚えなくていい..と思います
どの演算子が先に評価されるとか順番が決まっていますが、覚えなくていいと思います。カッコ()をたくさんつけましょう。評価順番を正しく知っていてもカッコ()を付けた方がいいです。
例えば、以下の式はどちらの積りでしょうか?
x && y == 0 // 意図が分からない
(x && y) == 0 x && (y == 0)
どちらかが正しいんですが、調べる必要も覚える必要もありません。カッコ()をつけてください。
正しい意図であればカッコ()を付けなくていい、という考え方は賛同できません。どちらが正しいかを正しく把握しても、誤解を防ぐためにカッコ()はつけた方が良いと思います。
※評価順序を覚えて、積極的にカッコ()をつけない、という方もいらっしゃいます。筆者個人の見解です。
bool型の関数
何かを判断する関数ならbool型で作りましょう。
bool isActive(); //activeならtrue、そうでないならfalseを返す
if文
if文の文法
if文の使い方は以下が基本です。
if (条件式){ //何かやる } else { // 他の何かをやる }
elseは省略可能です。また、elseの後にifを付けて再び判定するのもありです。
つまり、以下のような文を書くことが可能です。
if (条件式){ // 何かやる } if (条件式1){ // 何かやる } else if (条件式2){ // 何かをやる } else if (条件式3){ // 何かをやる } else { // 最後に何かをやる } if (条件式1){ // 何かやる } else if (条件式2){ // 何かをやる } else if (条件式3){ // 何かをやる }
else if を何度も重ねるのは見にくいのと、Jeff Bayのオブジェクト指向の精神に反するのでなるべくやめましょう。
※また、中カッコ{}は省略可能ではあるんですが、省略することなんか考えない方がよいです。バグを生み出す可能性はなるべく刈り取りましょう。個人の見解です。
3項演算子?:はいらない..と思います
3項演算子?:がif文の代わりとなります。
以下の式では、条件式1がtrueなら条件式2がfalseなら条件式3が実行されます。
条件式1 ? 条件式2 : 条件式3
以下のif文と同じです。
if (条件式1){ 条件式2 } else { 条件式3 }
例えば、以下のように負なら0、正なら1になる有名なヘビサイド関数です。
int heaviside(int x){ return (x < 0) ? 0 : 1; }
3つの式を1行に書くわけですから情報量が多いです。それぞれが長くなると非常に見にくいので、1行で書けないならif文で書いた方がよいと思います。
例えば上記のヘビサイド関数は以下でいいのはないでしょうか?
int heaviside(int x){ if (x<0){ return 0; } return 1; }
個人的には3項演算子は禁止してif文だけにしてほしいです。
※積極的に3項演算子を使う人はいます。筆者個人の見解です。
swithch文
switch文の文法
switch文の使い方は以下です。
switch (式) { case 定数式1 : // 何かやる case 定数式2 : // 何かやる default : // 最後に何かやる }
注意があります。case文が終わって次のケースに行くならbreak;をつけないといけません。
以下のように覚えた方がよいです。
switch (式) { case 定数式1 : // 何かやる break; case 定数式2 : // 何かやる break; default : // 最後に何かやる break; //この最後のbreakは不要だがいつも付ける癖をつけた方がよい }
breakを書かないと次のようにcase文の2つともが実行されてしまいます。
switch (式) { case 定数式1 : // 何かやる // breakを忘れると、次の行が実行されます case 定数式2 : // 何かやる break; default : // 最後に何かやる }
この言語仕様は、個人的にいやですね。breakを忘れるとバグですからね。
「breakしないでいいときだけnobreakとする」の方が分かりやすいと思いますが、決まりなので仕方がありません。breakを忘れないようにしてください。
なるべくswith文を書かないのがよい…と思います
switch文を書こうとしたとき、いったん冷静になってswich文以外の選択肢がないか考えてみましょう。
数行のswitch文ならいざしらず、数十行、数百行のswitch文は異常と思ったほうが良いです。
デザインパターンのState, Factory, Commandあたりを使うとswitch文がなくなって洗練されたコードになります。というか、洗練させましょう。
巨大なswitch文のコードがあると、技術力のなさがヒシヒシと伝わってきます。なるべく排除できるように研鑽を積むことをおすすめします。
※これは、、個人的見解ではなくみんなの共通認識に近いと信じたい
まとめ
if文、swith文を説明しました。
コメント