繁体   English   中英

你应该为if语句创建变量吗?

[英]Should you create variables for a if statement?

我想知道,技术上最有效的方法是什么。

什么会更聪明的代码:

    if (args[0].toLowerCase().toString().equals("server")) {
        System.out.println("SERVER");
    }

要么:

    String host = args[0].toLowerCase();

    if (host.equals("server")) {
        System.out.println("SERVER");
    }

请记住,我知道这个变量是多余的。 而且一个参数也可以包含一个数字,但这不是我的问题。 这只是一个例子。

什么时候应该为if语句创建变量? 总是? 它更安全吗? 我不应该这样做,因为我在浪费记忆吗? 它会影响性能吗?

无论如何,创建变量。 像这样的单个变量永远不会成为性能瓶颈。

总是喜欢可读性。 性能问题通常只出现在系统的特定部分。 当它们出现时,而不是在测量它们(也就是有数字)之前,你会逐个对待它们。 永远不要忘记: 过早优化是万恶之源。

在您的具体情况下,您可以更进一步,创建另一个变量,解释比较的意图:

String host = args[0].toLowerCase();
boolean isRunningUnderProduction = host.equals("server");
if (isRunningUnderProduction) {
    System.out.println("SERVER");
}

比评论好多了。 并在一瞥中解释了代码的意图。


Martin Fowler的重构书引用:

关于性能的有趣之处在于,如果您分析大多数程序,您会发现它们大部分时间都浪费在代码的一小部分上 如果您平等地优化所有代码,最终会浪费90%的优化,因为您正在优化运行不多的代码。 快速完成程序所花费的时间,由于缺乏清晰度而浪费的时间,都是浪费时间。

换句话说:如果你的程序更容易阅读,那么当时机到来时( 如果它来了),它们更容易修复缓慢的部分。

这种记忆影响可以忽略不计,风格和可读性更为重要。

我使用的规则是不为它创建一个变量,除非它将它全部嵌入if语句中,或者如果我打算稍后再次使用它(可能在if语句中),它将无法读取。 我发现单个使用变量让我觉得它可能在以后使用并试图避免它们。

如果编译器很聪明,他就不会太在意你将它放在一行或分开它。

该代码具有其结构,因为它易于为人类阅读。

更重要的部分是可读性以及代码的“干净”,想象你有更多的ifs:

public void doSomething(){
if (args[0].toLowerCase().toString().equals("server")) {
        System.out.println("SERVER");
    }
}

public void doSomethingElse(){
if (args[0].toLowerCase().toString().equals("server")) {
        System.out.println("SERVER");
    }

(...)

public void doEvenMoreStuff(){
if (args[0].toLowerCase().toString().equals("server")) {
        System.out.println("SERVER");
    }
}

ifs都是一样的,但如果你需要改变什么呢? 也许字符串"server" ,你必须通过你的整个代码并改变每一个事件 - 并确保找到每一个! 所以变量更容易变化,有些变化 - >你只需在一个地方改变东西:

String objectToSearchFor = "server";
String output = "Server found";

if (args[0].toLowerCase().toString().equals(objectToSearchFor)) {
        System.out.println(output);
    }
}

(...)

public void doEvenMoreStuff(){
if (args[0].toLowerCase().toString().equals(objectToSearchFor)) {
        System.out.println(output);
    }
}

这样维护起来更安全,并且有助于查找错误,因为它也更容易阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM