Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

マジック分岐

概要

レビュー指摘「マジック分岐」について
Javaの話です

内容

自分が独自に定義した数値に意味を持たせて
自分にしか分からない分岐を作成すること。

サンプルコード

package review.ex3.magic_branch;

public class MusicPlayer {
  enum MusicType {
    JPOP, BALLAD, OTHER
  };

  public void incorrectPlay(int musicType) {
    // 数字1=JPOPという意味をもたせたのは製造した人にしか分からない独自ルール
    if (musicType == 1) {
      System.out.println("JPOPを再生中");
    } else if (musicType == 7) {
      System.out.println("演歌を再生中");
    } else {
      System.out.println("再生中");
    }
  }

  public void play(MusicType musicType) {
    switch (musicType) {
    case JPOP:
      System.out.println("JPOPを再生中");
      break;
    case BALLAD:
      System.out.println("演歌を再生中");
      break;
    default:
      System.out.println("再生中");
      break;
    }
  }

  public static class Music {
    String name = "";

    public Music(String name) {
      this.name = name;
    }
  }

  public static void main(String[] args) {
    MusicPlayer musicPlayer = new MusicPlayer();
    musicPlayer.play(MusicType.JPOP);
    musicPlayer.play(MusicType.BALLAD);
    musicPlayer.play(MusicType.OTHER);

    musicPlayer.incorrectPlay(1);
    musicPlayer.incorrectPlay(7);
    musicPlayer.incorrectPlay(2);
  }
}

出力

JPOPを再生中
演歌を再生中
再生中
JPOPを再生中
演歌を再生中
再生中

補足

このパターンですが、3種類の理由がありました。

1.開発者の知識が古い。Javaプログラマーを名乗っているがおそらく別言語の人
2.既存システムから受け継がれている。これは、1が受け継がれてしまっているせい
3.別言語からのリプレイス時に設計がJava用に変更されなかった

どれも論外なのですが、3あたりが結構根深い。
詳細設計担当者がJavaを知らないとこうなります。
業務だけ詳しくて、Javaは知らないSEが設計するとこうなる。
そして、設計者より実装に詳しい低単価プログラマーが詳細設計も含めて
修正したりして色々と馬鹿馬鹿しい。