是否有可能重构这一方法,并使其清洁和尊重坚实的原则。
public String pickOne(int input) {
if ((input % 3) == 0 && (input % 5) == 0)
return "fizzbuzz";
else if ((input % 3) == 0)
return "fizz";
else if((input % 5) == 0)
return "buzz";
return String.valueOf(input);
} 发布于 2022-10-22 23:07:13
首先,if可以简化为input % 15。基本上,你是在检查可被3和5整除的数字,所以你只需检查15。我同意使用括号,即使在这里也是如此。
public String pickOne(int input) {
if (input % 15 == 0) {
return "fizzbuzz";
} else if (input % 3 == 0) {
return "fizz";
} else if(input % 5 == 0) {
return "buzz";
}
return String.valueOf(input);
} 段构造字符串
如果删除“one”条件,则可以减少一个。缺点是,您最终需要为返回值添加另一个if,所以可能不是更好,但应该提到:
public String pickOneV2(int input) {
var sb = new StringBuilder();
if (input % 3 == 0) {
sb.append("fizz");
}
if (input % 5 == 0) {
sb.append("buzz");
}
if (sb.length() == 0) {
return String.valueOf(input);
}
return sb.toString();
}面向数据的
如果条件相同,则可以将其提取到数据结构中,并进一步简化代码。出于简单的原因,我将映射保持在相同的方法中,但实际上它应该是类属性或常量。这是我所能想到的最可扩展和最干净的功能,您可以轻松地修改此功能,只需修改数据而不触及代码。
public String pickOneV3(int input) {
var fizzbuzzMap = new TreeMap<Integer, String>(Comparator.reverseOrder());
fizzbuzzMap.put(3, "fizz");
fizzbuzzMap.put(5, "buzz");
fizzbuzzMap.put(15, "fizzbuzz");
for (var index : fizzbuzzMap.keySet()) {
if (input % index == 0) {
return fizzbuzzMap.get(index);
}
}
return String.valueOf(input);
}使用stream 的
发布于 2022-09-19 09:52:53
您有一个最简单、最简约的fizzbuzz示例。您可以通过使方法静态化来改进它,因为它的状态不依赖于任何外部字段,并且遵循标准的代码格式(if-elses应该始终有花括号)。可能会将结果存储在变量中,并在最后返回结果,而不是有四个不同的方法退出点。并将该方法命名为与fizzbuzz相关的方法,而不只是“挑选一个”。但仅此而已。
要使它“尊重”坚实的原则,你需要理解什么是坚实的含义。所有这些原则都涉及可扩展性和模块化。因为在fizzbuzz程序中根本没有什么可扩展或模块化的东西,所以您必须定义如何打破fizzbuzz规范,然后就可以开始讨论扩展它了。但在我看来,这只是在一个不需要它们的程序上强制使用功能而已。那么,您想让它输出不同的单词,使用不同的值进行模块化操作,等等吗?在编写下面的答案之前,您需要先编写代码并使其正常工作,然后您可以要求对您所生成的内容进行可靠的评审。
出于好奇..。你从哪里得到这个任务的?这是在短时间内关于fizzbuzz和固体原理的第二个几乎相同的问题。我觉得它有点奇怪,因为它是一个流行的问题。
发布于 2022-10-22 03:37:45
我建议在任何if语句上始终使用大括号。如果你不这样做的话,就很容易不小心搞砸了。它不会增加很多额外的线,特别是像这样的长链,因为它在结尾只增加了一条线。
public String pickOne(int input) {
if ((input % 3) == 0 && (input % 5) == 0) {
return "fizzbuzz";
} else if ((input % 3) == 0) {
return "fizz";
} else if((input % 5) == 0) {
return "buzz";
}
return String.valueOf(input);
}像这样的事情存在着重大的安全问题:
if (user.isAdmin())
log("Admin user logged in.");
doImportantAdminThings();你能发现这个缺陷吗?单击下面查看是否正确。
即使
doImportantAdminThings();是假的,也会执行user.isAdmin()。缩进使得错误地认为它实际上不是块的一部分而变得很容易。现在,在这个小示例中,很容易发现,是的,但是在大量的代码评审中,它很容易被忽略。
https://codereview.stackexchange.com/questions/279719
复制相似问题