2016-03-25 31 views
0

から私は2つのクラスを持っている場合は、他の排除:whileループ

class A: 
    b = B() 
    function doSomething(): 
     while True: 
      b.doSomething() 

class B: 
    counter = 0 
    function doSomething(): 
     if counter < 10: 
      performMethod1() 
     else: 
      performMethod2() 
     counter += 1 
    function performMethod1(): ... 
    function performMethod2(): ... 

私はB.performMethod2()はBよりもはるか回実行されようとしていることを知っているので、私は、このコードが悪い感じperformMethod1()が、B.doSomething()の中に入るたびにif-else(カウンタの場合は< 10)がチェックされます。

さらに、Aクラスのwhileループを中断したくないのです。クラスBの実装の詳細をA.doSomething()から隠したいからです。

B.doSomething()のif-elseを削除する良い方法はありますか?ありがとうございました。

+0

はその – Querenker

+0

@Querenkerコードレビューは、コンクリートのための唯一の本当の実装であるような質問のために、このサイトhttp://codereview.stackexchange.com/をチェック!この場合は、実装の不足だけでなく、サンプルコードとして閉じられます。 – Pimgd

+1

@Pimgdあなたの説明をありがとう。私は訂正した。 – Querenker

答えて

0

state patternを使用できます。 次に、カウンタ< 10(stateA)と1つのカウンタが> = 10(statB)の2つの状態を作成します。ステートAのカウンタがstateAに10になると、stateA、initial statからstateBへの移行が発生します。

0

ifステートメントのオーバーヘッドはごくわずかで問題ありません。しかし、それを最適化する必要がある場合は、このようなものを試すことができます。

class A: 
    b = B() 
    function doSomething(): 

     while True: 
      if b.counter < 10: 
       b.doSomething1() 
      else: 
       break 

     while True: 
      b.doSomething2() 
class B: 
    counter = 0 

    function doSomething1(): 
     performMethod1() 
     counter += 1 

    function doSomething2(): 
     performMethod2() 
     counter += 1 

    function performMethod1(): ... 
    function performMethod2(): ...