使用while true避免嵌套条件-“复杂选择中的标准”吗?

问题描述

我最近在查看某人的代码时遇到了以下模式:

while True:
   if not a.b:
      break

   if sum(b) > 1:
      x = a.c
      break
   break

在不迭代任何内容时,我质疑while构造的使用。编码人员的回答是,这种模式避免了嵌套条件,并且是“复杂选择中的标准模式”。

问题

  • 此模式有名字吗?
  • “复杂选择”到底是什么?

解决方法

我还没有听说过这种模式。但是我认为“复杂的选择”需要简化而不是复杂。我更同意here的以下引用:

一些经验丰富的程序员(和教育工作者)喜欢避免将while Trueif/break,但我可以接受这种用法。实际上,我认为这样比较容易 初学者(有时甚至是经验丰富的程序员)首先编写 循环(不必思考:我们总是将其写为True),然后再担心 关于循环主体应该计算什么,以及如何/在何处进行测试 终止。如果发生这种情况,if/break首先进入循环(实际上 是用于令人惊讶的循环次数),那么我们就可以执行转换。

这些建议在初学者的错误之处在于他们经常写 在if/breaks循环内有多个while True 复杂且很难理解。循环中最重要的部分是 它如何终止。这是一个异常的while True循环,需要更多 而不是一个if/break,因此您应该怀疑自己的代码是否简单 多个if/break语句。

,

替代项是嵌套的,但与while / if比较的级别相同。

# alternatives
if a.b and sum(b) > 1:
    x = a.c
    
if a.b:
    if sum(b) > 1:
        x = a.c

只有添加更多的if语句才有意义,但是由于if语句是对齐的,因此您获得了可读性,但是您可能会使某些代码阅读器感到困惑,因为它们无法理解while循环为什么会以结尾休息一下(最后一个)。因此,这种方式使用了一个循环“只是获取break语句”。

while True:
    if not a.b:
        break
        
    if not a.c:
        break
        
    if not b:
        break
        
    if sum(b) > 1:
        x = a.c
        break
    break
        
    
    if a.b and a.c and b and sum(b) > 1:
        x = a.c
    
    if a.b:
        if a.c:
            if b:
                if sum(b) > 1:
                    x = a.c

在正常的功能/方法中,通常会使用警卫原因,以使内容更加清晰明了。这似乎是通过添加while / break语句或者如果您不想在函数中返回任何内容来在函数外部使用此结构的一种方法,因为您希望以某种方式在同一函数中更改“选择”。