我被要求非常快速地学习Java,我不仅要考虑详细的语法,还要考虑预期的风格和方法要求。
鉴于一个简单的FizzBuzz挑战,我制作了以下代码:
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方法吗?我知道我目前没有测试。
答案 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);
}
}
我改变的事情:
东西仍然缺失:
runFizzBuzzUpTo()
的参数答案 1 :(得分:0)
当然,第二个代码更模块化,更容易修改。我大多不喜欢在短时间内写出if条件...... writeAction方法可能是无效的,因为您不必返回任何内容。 但你有好主意:)