0

如果您将模式定义为一种巧妙的技巧,可以帮助您以一种优雅且可能更具可读性的方式解决编程问题[1]。使用该continue语句的设计模式是什么(如果要避免深度嵌套的if语句)?

for item in items:
    if is_for_sale(item):
        cost=compute_cost(item)
        if cost<=wallet.money:
            buy(item)

for item in items:
    if not is_for_sale(item):
        continue
    cost = compute_cost(item)
    if cost > wallet.money:
        continue
    buy(item)
4

3 回答 3

4

这不是设计模式。但是当你有很多嵌套循环,并且不清楚那里发生了什么时,那就是代码异味。我建议在这里做的是两个重构 - Extract MethodReplace Nested Conditional With Guard

首先,提取项目处理以显示您在做什么:

for(item in items)
   try_to_buy(item)

然后以新方法应用警卫:

def try_to_buy(item):
   if not is_for_sale(item):
       return

   if compute_cost(item) > wallet.money:
       return

   buy(item)
于 2012-10-18T15:07:54.380 回答
2

这有点偏离主题,但如果您正在寻找简化代码的方法,您可以这样做:

items_for_sale = (item for item in items if is_for_sale(item))
for item in items_for_sale:
    if compute_cost(item) <= wallet.money:
        buy(item)

就您最初的问题而言,我只会使用 acontinue如果它可以防止缩进多行。如果您的 if 语句中只有一行,那么continue.

于 2012-10-18T14:59:35.467 回答
1

我不知道你为什么说continue没有大量使用,因为我至少在不满足条件时使用它来继续,而不是检查所有条件,这样代码是平坦的并且Flat is better than nested.

有时我使用异常来指示状态变化并从深度嵌套的内部循环或函数中出来,例如

class MyException(Exception): pass

for item in items:
   try:
       for user in item.users:
           check_user(user)
   except MyException:
       continue

def check_user(user):
    if user.bad:
        raise MyException("bad user")
于 2012-10-18T15:29:34.643 回答