if文が嫌い
作成日時:2025-12-04
更新日時:2025-12-04
ポエム。特にオチは無い。
if文が嫌いである。
何故ならば、if文の中を読む際に条件を覚えていなければならないし、ネストが深くなると可読性が下がるためだ。
つまり認知負荷が上がる。
個人的に許容できるのは、if文の中が数行で終わるか、ネストが2段程度の場合のみで、
そうでないならばリファクタリングを考え始める。
特に処理区分に応じて作られる長いif文が嫌い。
多態性を利用して消し去ってほしい。
下記は内部データを複数のファイル形式で書き出すプログラムである。(関係のない部分は省略)
badPatternはメソッドが長くなる。
サポートするファイル形式が増えれば増えるほど長くなるし、デグレが発生する可能性も出る。
単一責任の原則にも反している。
goodPatternはメソッドは短いし、サポートするファイル形式が増えても長くならない(そもそも改修不要)。
FileType列挙型とそのファイル形式を出力するDataWriterを実装するだけでいい。
長い出力処理はそれぞれのクラスの中に隠蔽される。
if文はファクトリー内にのみ存在し、インスタンスを生成するだけなので長くもならない。
(ついでにSOLID原則のSRPとOCP、DIPに準拠)
void badPattern(FileType fileType, Data data) {
if (fileType == FileType.CSV) {
// 長いCSV出力の処理
return;
}
if (fileType == FileType.XLSX) {
// 長いXLSX出力の処理
return;
}
if (fileType == FileType.HTML) {
// 長いHTML出力の処理
return;
}
throw new IllegalArgumentException("不正なファイルタイプ" + fileType);
}
void goodPattern(FileType fileType, Data data) {
var factory = new DataWriterFactory();
var writer = factory.create(fileType);
writer.write(data);
}
// --------------------------------------------------------------- //
enum FileType {
CSV, XLSX, HTML;
}
interface DataWriter {
void write(Data d);
}
class DataWriterFactory {
DataWriter create(FileType type) {
if (type == FileType.CSV) return new CsvWriter();
if (type == FileType.XLSX) return new XlsxWriter();
if (type == FileType.HTML) return new HtmlWriter();
throw new IllegalArgumentException("不正なファイルタイプ" + type);
}
}まとめ
ポエムなので特にまとめは無いが、強いて言うならば下記。
- if文はシンプルにする
- ガード節、早期リターンの使用
- if文内をメソッドに抽出
- 多態性の使用
- 関心の分離。1つのクラス/メソッドが複数の役割を持たないようにする。
- 可読性と認知負荷を考えたコーディングをする
参考
参考キーワード:SOLID原則
参考キーワード:多態性
参考キーワード:デザインパターン
おすすめ書籍:リーダブルコード - O’Reilly Japan
おすすめ書籍:プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ - 秀和システム新社 あなたの学びをサポート!
おすすめ書籍:Java言語で学ぶデザインパターン入門 第3版|結城浩