リーダブルコード

C#リーダブルコード #07_複数の比較を1回のif文でやらない

「今回は複数の比較を1回でやらない」というテーマで解説していきます。

BAD:複数の比較を1回にやらない

次のような例を見てください。

valueAとvalueBを「&&」でつないで比較しています。極力こういった書き方はしない方がいいと思います。今回の例では2個の比較ですが,3個4個とある場合や,ANDとORが混ざっていたり,小確固で優先される比較を囲ったりしている場合は,どんどんわかりづらくなり,非常にバグの元となります。

ANDの場合は階層を分ける

複数の比較をANDでつないで判定する場合は,階層を分けることで対処できます。

このように,valueAの判定を通過した場合のみvalueBの判定をするように,if文をネストすれば,if文の階層は深くなりますが,判断は1回ずつしか行わないため,&&で連結するよりもバグりにくいでしょう。

ORの場合

NOTBAD:複数の比較を1回にやらない

2つの判定をOR判定する場合は,先ほどのようにif文をネストしてやるわけにはいきませんね。valueAの判定がFalseでもvalueBの判定は行いたいわけですから,次のように「||」で連結して複数の判定をしなくてはなりません。

ただ,この場合は,前述の通り,バグの温床になるので,次に紹介するメソッド化を検討するほういいでしょう。

GOOD:メソッド化を検討する

次に例は,IsWriteLosgというメソッドを作成して対応しています。

IsWriteLosgメソッドの中では,valueAが1ならTrue,valueBが1でもTrueが返却されるようになっており,どちらかが1ならTrueになるため,最初の「valueA == 1 || valueB == 1」と同じ動作をします。動作は同じですが,メソッドの中で,1つずつ判定を行い,どちらかがTrueの場合はすぐにメソッドを抜けることで,1つの判定のみの実施になっており,読みやすさとバグの混入を防ぐ効果があります。

GOOD:ANDでもメソッド化を検討する

先ほどはORの場合はメソッド化で対応するというお話をしましたが,ANDで比較する場合もif文のネストではなく,メソッド化を検討した方がより良いといえます。

ANDとORが混ざっていたらなおさらメソッド化する

さらにANDとORが混ざっていたり,小括弧が付いていて,比較の優先順位が複雑になっているようなものは,なおさら,メソッド化を検討してください。

リーダブルコードC#

C#プログラマーのための正しい3層構造が分かる「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_リーダブルコードまとめ

参考図書

C#コードの書き方や環境

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

Code Complete 第2版 完全なプログラミングを目指して

.NETのクラスライブラリ設計 改訂新版 開発チーム直伝の設計原則、コーディング標準、パターン

チーム開発の教科書 C#によるモダンな開発を実 践しよう!

達人プログラマー ―熟達に向けたあなたの旅

C#の文法

プログラミングC#

プログラミング.NET Framework

実戦で役立つ C#プログラミングのイディオム/定石&パターン

Head First C# ―頭とからだで覚えるC#の基本

Effective C#

C#プログラマのための.NETアプリケーション最適化技法

オブジェクト指向

ジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
  すばらしい本です。オブジェクト指向が詰まっています。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
  サンプルコードはjavaですが,最初にオブジェクト指向に目覚めるのに最適な本です。

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
  マンガみたいな感じで読めて,オブジェクト指向について学べます。  

Clean Code アジャイルソフトウェア達人の技

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Adaptive Code ~ C#実践開発手法

.NETのエンタープライズアプリケーションアーキテクチャ

実装パターン
  廃盤のため異常に高くなりすぎなので,様子を見た方がいい気がします。一万円のボリュームがあるかどうかは微妙です。

オブジェクト指向でなぜつくるのか

レガシーコード改善ガイド

リファクタリング 既存のコードを安全に改善する