繁体   English   中英

如何编写干净的条件语句

[英]How do I write a clean conditional statement

这可能是一个愚蠢的问题,但是写一个干净的条件语句的简单方法是什么,例如让我们说如果我有一个条件语句,我只希望它在满足要求的代码块之前发生,如果它不满足要求不是那么我希望它发生在代码块之后。 但它必须按照这个顺序发生

编辑

这段代码没有被破坏。我只是问是否有更好的方法来构造这个条件语句,我发现将 //random 代码放在一个辅助方法中并将两个 if 组合到一个 else if 中可以解决它。 看我下面的回答。

if(number === 250){
    // sameMethod()
}

//random code

if(number !== 250){
    // sameMethod()
}

解决方案

function helper() {
    //random code
}

if(number !== 250){
    helper()
    // same code
} else {
    // same code
    helper()
}
if(number == 250){
    // sameMethod()
}

//random code

if(number != 250){
    // sameMethod()
}

为此,根据手头的信息,我建议保持代码不变。 您编写此代码的方式,if-else 块将对您的应用程序流程产生严重影响。

假设 randomCode 是一个方法调用,它执行下一个操作:

function randomCode() {
  this.number += 5;
}

并且您以应用程序的状态开始代码,该状态的 number 值为 245。

if ( number == 250 ) { // conditions 245 == 250 evaluates to false
  // sameMethod -> will not be executed
}

randomCode(); // increases the value of number with 5

if ( number != 250 ) { // condition 250 != 250 evaluates to false
  // sameMethod -> will not be executed
}

只是打一个if-else,像这样:

if ( number == 250 ) { // condition 245 == 250 evaluates to false
  // sameMethod
} else {
  randomCode();
  // sameMethod -> here it will be executed, even though number now is 250. Change in behaviour
}

因此,有两件事需要考虑:要么您发布的示例代码是正确的流程,使其正确(但最终可能会执行两次 sameMethod,或者根本不执行,因为可以在 randomCode 部分更改 number 的值,或者 sameMethod 和 randomCode 必须(恰好)执行一次,具体取决于该条件。

如果是这样,原始(伪?)代码是错误的,但结果确实会变成:

if ( number == 250 ) {
  sameMethod();
  randomCode();
} else {
  randomCode();
  sameMethod();
}

这是 monads 和所有爵士乐展示他们丑陋杯子的地方。

假设您在谈论 java,例如,您可以编写一个runSequentially方法,该方法可以让您编写:

   runSequentially(() -> sameMethod(), () -> {
        // random code
   }, number != 250);

runSequentially 将首先运行第一个 Runnable,然后是第二个 Runnable - 除非条件为假,在这种情况下它运行第二个,然后是第一个。

然而,在 java 中,这不是局部可变变量、检查异常和控制流透明,这些都是我不确定这是个好主意的足够缺点。 特别是考虑到显然执行顺序很重要,这通常表明状态发生变化。 但是,如果你坚持,它会是这样的:

public static void runSequentially(Runnable a, Runnable b, boolean flipOrder) {
    if (flipOrder) { b.run(); a.run(); }
    else { a.run(); b.run(); }
}

Javascript 更加自由放任(和完全不同的语言;你标记它是因为你可能不知道 'java' 和 'javascript' 完全无关?这是一个常见的错误 - 在这种情况下,忽略这一点),并且不会受到透明度问题的影响。 Javascript 没有检查异常,javascript 允许您改变外部状态(javascript-the-language 中有一些关于此的 WTF,但这是一个单独的问题)。 最大的问题是控制流(你不能轻易地从这些闭包中中断/继续“外部”代码中的循环)。

暂时回到 java,在以下上下文中使用 lambdas(闭包):

  • lambda 是“内嵌”运行的,也就是说,您将 lambda 传递给某个方法,一旦该方法返回,该 lambda 就会被所述方法“遗忘”:该方法没有将 lambda 存储在字段中,没有将它传递给另一个线程,没有将它传递给将它存储在一个字段中或将它传递给另一个线程的其他代码)。
  • lambda 中的代码不是设计成“功能风格”的(例如它改变状态或执行一堆 I/O),然后

你可能搞砸了。 Lambda 在那种环境中真的很糟糕,那些透明度问题当时令人恼火。 请注意,如果 lambda 确实“旅行”(存储/移动到另一个线程),那么缺乏透明度实际上是一件好事,因为这 3 个“透明度”变成了奇怪的脑筋急转弯 - 最好不要允许它们。

这就是为什么我建议不要这样做,如果您正在编写 java.lang. 但现在你知道一个人会怎么做。

感谢所有的建议,我应该更清楚语言,因为我认为这是一个相当简单的解决方案,可以在 Java 和 Javascript 中工作。 我最终只是将“随机代码”放在一个辅助函数中。

function helper() {
    //random code
}

if(number !== 250){
    helper()
    // same code
} else {
    // same code
    helper()
}

基本上这个想法是,执行哪个代码块的顺序取决于固定变量。 由于代码重复,没有辅助函数会很混乱,所以这个简单的解决方案修复了它。 如果你们想出更聪明的方法,请告诉我! 谢谢

也许你可以使用 else if 语句

if(condition1){
    //method();
} else if(condition2){
    //method();
} else //whathever you want here

暂无
暂无

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

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