首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标准汽水(3)嗡嗡声(5)

标准汽水(3)嗡嗡声(5)
EN

Code Review用户
提问于 2022-09-15 13:55:53
回答 3查看 115关注 0票数 1

是否有可能重构这一方法,并使其清洁和尊重坚实的原则。

代码语言:javascript
复制
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);
    } 
EN

回答 3

Code Review用户

发布于 2022-10-22 23:07:13

若简化

首先,if可以简化为input % 15。基本上,你是在检查可被3和5整除的数字,所以你只需检查15。我同意使用括号,即使在这里也是如此。

代码语言:javascript
复制
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,所以可能不是更好,但应该提到:

代码语言:javascript
复制
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();
}

面向数据的

方法

如果条件相同,则可以将其提取到数据结构中,并进一步简化代码。出于简单的原因,我将映射保持在相同的方法中,但实际上它应该是类属性或常量。这是我所能想到的最可扩展和最干净的功能,您可以轻松地修改此功能,只需修改数据而不触及代码。

代码语言:javascript
复制
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 的

使用streams的稍微好一点的版本(imho): public String pickOneV4(int input) { return fizzbuzzMap.entrySet().stream().filter( entry -> input % entry.getKey() == 0 ).map(Map.Entry::getValue).findFirst().orElse(String.valueOf(input)); }

票数 2
EN

Code Review用户

发布于 2022-09-19 09:52:53

您有一个最简单、最简约的fizzbuzz示例。您可以通过使方法静态化来改进它,因为它的状态不依赖于任何外部字段,并且遵循标准的代码格式(if-elses应该始终有花括号)。可能会将结果存储在变量中,并在最后返回结果,而不是有四个不同的方法退出点。并将该方法命名为与fizzbuzz相关的方法,而不只是“挑选一个”。但仅此而已。

要使它“尊重”坚实的原则,你需要理解什么是坚实的含义。所有这些原则都涉及可扩展性和模块化。因为在fizzbuzz程序中根本没有什么可扩展或模块化的东西,所以您必须定义如何打破fizzbuzz规范,然后就可以开始讨论扩展它了。但在我看来,这只是在一个不需要它们的程序上强制使用功能而已。那么,您想让它输出不同的单词,使用不同的值进行模块化操作,等等吗?在编写下面的答案之前,您需要先编写代码并使其正常工作,然后您可以要求对您所生成的内容进行可靠的评审。

出于好奇..。你从哪里得到这个任务的?这是在短时间内关于fizzbuzz和固体原理的第二个几乎相同的问题。我觉得它有点奇怪,因为它是一个流行的问题。

票数 1
EN

Code Review用户

发布于 2022-10-22 03:37:45

我建议在任何if语句上始终使用大括号。如果你不这样做的话,就很容易不小心搞砸了。它不会增加很多额外的线,特别是像这样的长链,因为它在结尾只增加了一条线。

代码语言:javascript
复制
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);
    }

像这样的事情存在着重大的安全问题:

代码语言:javascript
复制
if (user.isAdmin())
    log("Admin user logged in.");
    doImportantAdminThings();

你能发现这个缺陷吗?单击下面查看是否正确。

即使doImportantAdminThings();是假的,也会执行user.isAdmin()。缩进使得错误地认为它实际上不是块的一部分而变得很容易。现在,在这个小示例中,很容易发现,是的,但是在大量的代码评审中,它很容易被忽略。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/279719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档