Java 这是不是太多的重构?

Java 这是不是太多的重构?,java,refactoring,Java,Refactoring,我尝试重构一段代码,以便它使用单独的方法进行一些计算。我只是想说清楚 我想知道的是,写一个单独的方法来发现一个简单的事情,比如一个数字是奇数还是偶数,这是一个好的做法还是一个坏的做法? 原来的代码是, int n = 11; if (n % 2 == 0) { System.out.println("Not selected"); } else { boolean isPrime = true; if (n == 0 ||

我尝试重构一段代码,以便它使用单独的方法进行一些计算。我只是想说清楚

我想知道的是,写一个单独的方法来发现一个简单的事情,比如一个数字是奇数还是偶数,这是一个好的做法还是一个坏的做法?

原来的代码是,

    int n = 11;
    if (n % 2 == 0) {
        System.out.println("Not selected");
    } else {
        boolean isPrime = true;
        if (n == 0 || n == 1) {
            isPrime = false;
        } else {
            int i = 2;
            double a = Math.sqrt(Math.abs(n));
            while (i <= a) {
                if (n % i == 0) {
                    isPrime = false;
                }
                ++i;
            }
        } 
        if(isPrime){
            System.out.println("Prime it is");
        }
    }
int n=11;
如果(n%2==0){
系统输出打印项次(“未选择”);
}否则{
布尔值isPrime=true;
如果(n==0 | | n==1){
isPrime=false;
}否则{
int i=2;
double a=Math.sqrt(Math.abs(n));

而(i通常认为将代码分解为不同的方法是一种好的做法,例如可读性、长度或圈复杂度,尤其是在不改变代码工作方式的情况下

布尔表达式,就像您提取的一样,通常是快速提取函数重构的好选择。它允许代码库的读者了解布尔表达式的重要性,或者通过能够读取描述性函数名而不是复杂的域相关布尔数学来了解布尔表达式的作用,因为他们可能不想知道函数的本质详细说明


一本关于Java for code organization中公认的最佳实践的好书是一本名为《Java for code organization》的书。我认为这是一本非常简单和有趣的书。

这被称为函数分解,而且(在我看来)始终是一种好的实践

它不仅更容易阅读,而且您可以更容易地发现代码中的问题,因为您现在可以轻松地单独测试每个部分

例如,您现在可以确保
isEven
实际返回一个偶数。如果以后出现问题,您知道该方法不是问题所在。此方法被调用


我建议换一下

if(isEven(n)) {

} else {
    if(isPrime(n)) {

    }
}

因为它提供了相同的功能,但为您节省了一行代码

尽管如此,如果将
0
计算为偶数,您甚至不需要
isPrime
;如果不是偶数,它必须是素数。您不需要执行
isPrime
中的所有处理:

if(isEven(n)) {
    System.out.println("Even");
} else {
    System.out.println("Odd");
}
要使其更干净,请执行以下操作:

String result = isEven(n) ? "Even" : "Odd";
System.out.println(result);

只是一个提示:
n%2==0?true:false与
n%2==0
完全等效。这是一个很好的实践……即使是用于查找上述代码的偶数或奇数,也可以使用if(n%2==0)代替isEven方法检查,因为此时不需要对该条件进行过早优化。我更希望看到isEven()的方法。这不会落入过早优化陷阱。恰恰相反。顺便说一句,如果此代码是热的,即时编译器将内联此方法。一般来说,JIT使用较短的方法效果更好。重构后代码可读性更高。此外,删除三元运算符并直接返回
n%2==0
,您还可以将
if(isPrime(n))
折叠到周围的else中,如下所示:
}else if(isPrime(n)){
。此代码将与then子句具有相同的缩进,并将提高可读性。我同意。将较大的方法拆分为较短的方法往往是一个好主意,因为较短的方法也更易于命名、读取和测试。当然,重构的最佳基础是编写良好的单元测试,因此您可以确保您的因子分解不会改变行为。
if(isEven(n)) {
    System.out.println("Even");
} else {
    System.out.println("Odd");
}
String result = isEven(n) ? "Even" : "Odd";
System.out.println(result);