Java:良好的编程方法?

时间:2017-08-09 22:31:30

标签: java oop

我被要求非常快速地学习Java,我不仅要考虑详细的语法,还要考虑预期的风格和方法要求。

鉴于一个简单的FizzBu​​zz挑战,我制作了以下代码:

public class FizzBuzz {
  public static void main(String[] args) {

    boolean hit;

    for (int n = 1; n <= 30; n++) {

        hit = false;

        if (n % 3 == 0) {
            System.out.print("Fizz");
            hit = true;
        }
        if (n % 5 == 0) {
            System.out.print("Buzz");
            hit = true;
        }
        if (hit != true) {
            System.out.print(n);
        }
        System.out.println();
    }
  }
}

要求由主程序员重构此代码并考虑可能的未来需求和代码管理问题,我给了它一些思考并产生了以下重构代码:

public class FizzBuzz {
  public static void main(String[] args) {

    boolean hit;

    for (int n = 1; n < 30; n++) {

        hit = false;

        hit =  (n % 3 == 0) ? writeAction("Fizz") : hit;
        hit =  (n % 5 == 0) ? writeAction("Buzz") : hit;

        if ( ! hit)
           System.out.print(n);
        System.out.println();
    }
  }
   private static boolean writeAction(String actionWord){
     System.out.print(actionWord);
   return true;
   }
}

然而,设置此任务的人已经很快就开始了,我从来没有得到任何关于这种方法的反馈。我是朝着正确的方向前进还是让我倒退了?对我来说,这应该更好地扩展,并且更容易修改。我也考虑过他可能期待某种TDD方法吗?我知道我目前没有测试。

2 个答案:

答案 0 :(得分:1)

此网站不适用于评论,但如果您的问题被移动,这里有一些反馈(从“清洁代码”的角度来看):

  • 您的“主要”代码位于main()方法中。重新使用它非常困难。
  • 谈论重复使用 - 那里的各种事情阻止了重复使用
  • 你有一些重复的代码
  • 你违反了单一的抽象原则

我将如何写下以下内容:

public class FizzBuzz {

    private final OutputStream out;

    public FizzBuzz(OutputStream out) {
      this.out = out;
    }

    public void runFizzBuzzUpTo(int n) {
      for (int i = 1; i < n; i++) {
        if ( writeIfTrue(n % 3 == 0, "Fizz") ) { 
          continue;
        }
        if ( writeIfTrue(n % 5 == 0, "Buzz") ) { 
          continue;
        }
        out.println(n);
      }
    }

    private boolean writeIfTrue(boolean toCheck, String word) {
      if (toCheck) {
        out.println(word);
      }
      return toCheck;
    }

   public static void main(String[] args) {
     new FizzBuzz(System.out).runFizzBuzzUpto(30);
   }
}

我改变的事情:

  • 使输出成为一个类的“核心”事物
  • 提供了为任意正数运行的可能性

东西仍然缺失:

  • “单一的抽象”仍然不好
  • 而不是在main()中修复“30” - 可以检查传递给main()的一个参数 - 然后将其用作runFizzBuzzUpTo()的参数

答案 1 :(得分:0)

当然,第二个代码更模块化,更容易修改。我大多不喜欢在短时间内写出if条件...... writeAction方法可能是无效的,因为您不必返回任何内容。 但你有好主意:)