リーダブルコード

C#リーダブルコード #16_if文の中括弧の省略はしない

今回は「if文の中括弧の省略はしない」という話をしていきます。

1.1   BAD:if文に中括弧を書かない

C#では,if文の中身が1行の場合は中確固{}を書かなくてもコンパイルエラーにならないので,次のようif文を書くことができます。

private void ifの中括弧の省略はしない(Product product)
{
    //BAD:if文に中括弧を書かない
    if (product.Price > 100)
        Console.WriteLine($"処理...{product.Price}");
}

このように記述しても,すぐに何かの問題が起きるわけではありませんが,今後の改修作業を想定すると,やめておいた方がよいコードといえます。要するに,バグや機能追加などでコードを修正する際に次のような問題が発生する可能性があります。

改修時に起きうる問題

このif文はPriceと比較していますが,その結果がTrueの場合の処理を1行追加した例が次の①のようになります。

//BAD:if文に中括弧を書かない バグの元になる
if (product.Price > 100)
    Console.WriteLine($"処理...{product.Price}");
    Console.WriteLine($"処理...{product.ProductName}");//①

何が問題かはお分かりだと思います。①の部分はPriceとの比較に関係なく,常に通ってしまうロジックになっています。

実際のインデントは次のようになる

private void ifの中括弧の省略はしない(Product product)
{
    //BAD:if文に中括弧を書かない バグの元になる
    if (product.Price > 100)
        Console.WriteLine($"処理...{product.Price}");
    Console.WriteLine($"処理...{product.ProductName}");//①
}

実際にインデントを合わせるとこのようになります。中確固{}が無いため,①の部分はif文の外側と判断されます。こういったバグを埋め込まないためにも,if文は中身が1行しかなくても中確固{}を書くということが推奨されています。

改行無しの1行で書く場合も同じ

改行無しの1行で書く場合も同じです。修正がはいらなければ問題が混入されることはないでしょうが,前述の通り,非推奨です。

//BAD:if文に中括弧を書かない
if (product.Price > 100) Console.WriteLine($"処理...{product.Price}");

1.1   GOOD:1行でも中括弧を書く

前述の通り,if文は中身が1行でも素直に中確固{}を書くというのを推奨します。

//GOOD:1行でも中括弧を書く
if (product.Price > 100)
{
    Console.WriteLine($"処理...{product.Price}");
}

マイクロソフトのソース解析ツールのStyleCop.Analyzersでも,if文を中確固なしで書くと警告が出ます。ですのでStyleCop.Analyzersなどのコード解析ツールなどを使用して,機械的にこういったコードレビューを行うようにした方が,人間が指摘することに比べて,精神的にもいいと思います。あまりこういったケースを人間同士で指摘しあうと,険悪なムードになったりもしますので,ツールでチェックできることはツールにやらせるということがおすすめです。

1.1   コードのまとめ

//GOOD:ifの中括弧の省略はしない
private void ifの中括弧の省略はしない(Product product)
{
    //BAD:if文に中括弧を書かない
    if (product.Price > 100)
        Console.WriteLine($"処理...{product.Price}");


    //BAD:if文に中括弧を書かない バグの元になる
    if (product.Price > 100)
        Console.WriteLine($"処理...{product.Price}");
    Console.WriteLine($"処理...{product.ProductName}");//ここは常に通る

    //BAD:if文に中括弧を書かない
    if (product.Price > 100) Console.WriteLine($"処理...{product.Price}");

    //GOOD:1行でも中括弧を書く
    if (product.Price > 100)
    {
        Console.WriteLine($"処理...{product.Price}");
    }
}
リーダブルコードC#

#01_はじめに

#02_プロジェクトの作成
#03_右に長いコードを書かない_隣のとなりまでしか訪ねない
#04_隣のとなりまで_右スクロールより縦スクロールの方がいい
#05_IFとELSEがある時は肯定系をIF否定形をELSEにする
#06_比較する時は変数を左_定数を右にする
#07_複数の比較を1回のif文でやらない
#08_booの比較でTrueやFalseを書かない
#09_否定の否定はしない
#10_型チェックはasを使う
#11_メソッドはできるだけ早く抜ける_返却する値を無駄に変数に入れない
#12_対象外の時はすぐに抜ける
#13_都合が悪いケースはガードする
#14_必ずやりたい処理はfinallyを使う
#15_比較演算子はできるだけクラスにさせる
#16_ifの中括弧の省略はしない
#17_if文のリーダブルコードまとめ
#18_名前の付け方
#19_意図が明確な名前を付ける
#20_名前は素直に付ける_連想ゲーム的な名前を付けない
#21_1つの事しかしていなければ短い名前でも理解できる
#22_長いクラス名の扱い方
#23_単数形と複数形で表現する
#24_対になる言葉の組み合わせを決めておく
#25_業務で使う名前は統一する
#26_名前を統一するための辞書ツール作成
#27_メンバー変数にアンダーバーを付ける
#28_ハンガリアン記法を使わない
#29_メソッド内の変数をメソッド最初に全部宣言しない
#30_メソッド内の変数は直前に宣言する
#31_ループの変数はループ内で宣言する
#32_変数を使いまわさない
#33_boolの戻り値はどちらがTrueかをわかるようにする
#34_解放が必要なオブジェクトにはusingを使う
#35_varを推奨する場合
#36_メソッド名の付け方
#37_voidとFunctionを意識する
#38_インテリセンスを意識した名前にする
#39_生成メソッドはCreate_型変換はToを使う
#40_無駄に変数に入れて返却しない
#41_重複をなくす
#42_リージョンで区切らない
#43_アクセス修飾子とsealedを付ける
#44_クラス名はソリューションエクスプローラーで並べることを意識する
#45_クラス名は名詞か名詞句で命名する
#46_クラス名で継承元や特性を表現する
#47_メソッド内にコメントを書かない
#48_分かりづらい部分はメソッド化をしてメソッド名で想いを伝える
#49_コードを読んだ人が「えっ?」と思うことが予想される場所にだけコメントを付ける
#50_コメントで悪いコードを取り繕うことはできない
#51_未実装機能はTODOコメントを書く
#52_リーダブルコードまとめ