我应该摆脱继续声明[关闭]

Posted

技术标签:

【中文标题】我应该摆脱继续声明[关闭]【英文标题】:Should I get rid of continue statements [closed] 【发布时间】:2016-02-15 00:00:52 【问题描述】:

我读过in this Q&A,通常应该避免在循环中使用continue 语句。下面的代码值得遵守规则吗?如果是,那么重构它以摆脱它们的最佳方法是什么?

    for (property in formInput) 
        if (!formInput.hasOwnProperty(property) || property === "Id") 
            continue;
        
        if (property.slice(-3) === "_Id") 
            setMagicSuggestFromFormInput(property);
            continue;
        
        if (property.slice(-3) === "_bl" && formInput[property] === true) 
            $("#" + property).prop("checked", true);
            continue;
        
        $("#" + property).val(formInput[property]);
    

编辑:如果您认为必须重构循环,除了说明如何完成之外,您能否告诉我为什么您认为提议的重构是更好的设计选择?

【问题讨论】:

个人选择...坦率地说,我宁愿看到 continue 声明深度嵌套的代码。 Why are "continue" statements bad in javascript?的可能重复 这个问题本质上是基于意见的。要求最佳实践或隐含规则只会产生缺乏技术客观性的非常固执己见的答案。这个问题很可能已经结束了。有关详细信息,请参阅help center。另请注意,尝试获得“更好的设计选择”既非常广泛,也基于意见。 我认为第一个 continue 最好保持原样,因为它指定了根本不需要任何操作的情况。其余的......我不确定。不过,我通常同意 continue 比深度嵌套的代码更好。 @Jeremy 这正是我的感觉,但出于[此处提到的] (***.com/a/11730237/5130839) 的原因,您应该避免继续。我不明白为什么继续重构会是一场噩梦。 【参考方案1】:

您的代码:

for (property in formInput) 
    if (!formInput.hasOwnProperty(property) || property === "Id") 
        continue;
    
    if (property.slice(-3) === "_Id") 
        setMagicSuggestFromFormInput(property);
        continue;
    
    if (property.slice(-3) === "_bl" && formInput[property] === true) 
        $("#" + property).prop("checked", true);
        continue;
    
    $("#" + property).val(formInput[property]);

相当于:

for (property in formInput) 
    if (property.slice(-3) === "_Id") 
        setMagicSuggestFromFormInput(property);
     else if (property.slice(-3) === "_bl" && formInput[property] === true) 
        $("#" + property).prop("checked", true);
     else if (formInput.hasOwnProperty(property) && property !== "Id") 
        $("#" + property).val(formInput[property]);
    

这将是首选方法,因为它正确利用了if/then/else,并且更易于逻辑推理。

【讨论】:

好的,我想它会继续with this post why else if is good【参考方案2】:

为什么不试试“else if”呢?

放置

$("#" + property).val(formInput[property]);

在 else 语句中确保它不会在运行 else if 语句之一时运行。您可以将其余的 if 语句设为 else if 语句。

【讨论】:

是的,我考虑过使用多个 else if,但正如对另一个答案的评论中提到的那样,我没有看到这样做的设计理由,这样做有什么好处? 【参考方案3】:

如果不想使用 continue 语句,那么你可以走嵌套代码的路线:

for (property in formInput) 
    if (formInput.hasOwnProperty(property) && property !== "Id") 
        if (property.slice(-3) === "_Id") 
            setMagicSuggestFromFormInput(property);
        
        else if (property.slice(-3) === "_bl" && formInput[property] === true) 
            $("#" + property).prop("checked", true);
        
        else
           $("#" + property).val(formInput[property]);
        
    

不过,我真的很喜欢您的链接问答的答案。这是一个工具,你应该在适当的时候使用它。

【讨论】:

【参考方案4】:

您可以嵌套条件检查并反转条件。

for (property in formInput) 
    if (formInput.hasOwnProperty(property) && !property === "Id")
        if (property.slice(-3) === "_Id") 
            setMagicSuggestFromFormInput(property);
        else if (property.slice(-3) === "_bl" && formInput[property] === true)
            $("#" + property).prop("checked", true);
        else
            $("#" + property).val(formInput[property]);
    

【讨论】:

好的,但我似乎不清楚为什么添加两层嵌套比继续更好。为了消除“继续”而增加这种复杂性的实际目标是什么? 它更易于维护和以后添加。使用 if-else 时更容易看到意图和阅读。我猜在功能方面没有区别。【参考方案5】:

当您在开始时在循环或块中使用中断/继续时,它们充当前提条件,这是一个很好的设计,有助于轻松理解块。如果你在代码块的中间使用continuebreak 并且周围有一些代码,那么它就像一个隐藏的陷阱,很难理解哪个是坏的。

您可以查看此链接以了解有关中断/继续https://softwareengineering.stackexchange.com/questions/58237/are-break-and-continue-bad-programming-practices的更多讨论

您可以尝试使用嵌套的 if else 块来代替。

for (property in formInput) 
  if (formInput.hasOwnProperty(property) && property !== "Id") 
    var propVal = property.slice(-3);
    if (propVal === "_Id") 
      setMagicSuggestFromFormInput(property);
     else if (propVal === "_bl" && formInput[property]) 
      $("#" + property).prop("checked", true);
     else 
      $("#" + property).val(formInput[property]);
    
  

【讨论】:

以上是关于我应该摆脱继续声明[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

摆脱 \r\n [关闭]

在 C++ 中应该按啥顺序声明类? [关闭]

何时使用继续[关闭]

铁路围栏密码摆脱循环重复[关闭]

我的 Python 应用程序与 cli 一起启动如何摆脱它 [关闭]

Pythonic / Python中继续的性能[关闭]