X(Twitter) Zenn GitHub RSS 共有

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);
  }
}

まとめ

ポエムなので特にまとめは無いが、強いて言うならば下記。

参考

参考キーワード:SOLID原則
参考キーワード:多態性
参考キーワード:デザインパターン
おすすめ書籍:リーダブルコード - O’Reilly Japan
おすすめ書籍:プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ - 秀和システム新社 あなたの学びをサポート!
おすすめ書籍:Java言語で学ぶデザインパターン入門 第3版|結城浩