書くべきコード。

おかしくないコードの条件を考えてみました。

  • ちゃんと動く。
  • 無駄なことをしていない。
  • 読みやすい。

こんなところでしょうか。


昨日もちらりと触れましたが、最近話題のFizzBuzz問題が一番分かりやすい例になるかも知れません。さっそくJavaで作ってみました。(インデントが消されてしまって見づらいかも知れません。すいません。)

public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    for (int i = 1; i < 100; i++) {
        String s = String.valueOf(i);
        if (i % 3 == 0 && i % 5 == 0) {
            s = "FizzBuzz";
        } else {
            if (i % 3 == 0) {
                s = "Fizz";
            } else if (i % 5 == 0) {
                s = "Buzz";
            }
        }
        sb.append(s);
        sb.append("\n");
    }

    System.out.println(sb.toString());

多分、一番基本的なアプローチをしていると思います。ただし、FizzBuzzに対して制約をかけてちょっとした工夫を強いてみる、という趣向もあるようなので、例によって剰余を禁止してみました。

public static void main(String[] args) {
    int key3 = 3;
    int key5 = 5;
    int key3and5 = 3 * 5;

    StringBuffer sb = new StringBuffer();

    for (int i = 1; i < 100; i++) {
        String s = String.valueOf(i);
        if (i == key3and5) {
            s = "FizzBuzz";
            key3and5 += 15;
            key3 += 3;
            key5 += 5;
        } else {
            if (i == key3) {
                s = "Fizz";
                key3 += 3;
            } else if (i == key5) {
                s = "Buzz";
                key5 += 5;
            }
        }
        sb.append(s);
        sb.append("\n");
    }

    System.out.println(sb.toString());
}

前者と後者、どちらが優れているかというと、その答えを考える前にまず「どの評価基準での優劣か」ということを考えなくてはなりません。コードの評価の難しい点はそこにあります。(故に、痛いコードが生まれるのでは、と思います)

  • 実行時間
  • 実行中に使用するメモリ
  • 可読性
  • 変更し易いか

現場では、冒頭で書いた3点に加え、こういった観点での評価をする必要があります。凄く高度である事は求められませんが、それは評価する側の負荷を考えての事だと思います。つまり、合計7つの評価がそれなりであれば、仕事で扱う分には差し支えないです。