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

これはデザインパターンではありません。しかし、ネストされたループが多数あり、そこで何が起こっているのかが明確でない場合、それはコードの臭いです。ここで行うことをお勧めするのは、2つのリファクタリングです。メソッドの抽出ネストされた条件付きのガードの置き換えです。

まず、アイテムの処理を抽出して、何をしているかを示します。

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)

元の質問に関する限り、continue複数の行をインデントする必要がない場合にのみ a を使用します。if ステートメントに 1 行しかない場合は、あまり意味がありません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 に答える