2016-03-25 4 views
0

Ich habe zwei Klasse:beseitigen if-else von while-Schleife

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(): ... 

Ich fühle mich dieser Code ist schlecht, weil ich weiß, dass B.performMethod2() viel mehr Zeit als B durchgeführt werden soll performMethod1(), aber das if-else (wenn Zähler < 10) wird jedes Mal überprüft werden, wenn ich in B.doSomething() gehe.

Darüber hinaus möchte ich nicht die While-Schleife der Klasse A brechen, weil ich die Implementierungsdetails der Klasse B von A.DoSomething() ausblenden möchte.

Gibt es eine gute Möglichkeit, die Wenn-sonst von B.doSomething() zu beseitigen? Vielen Dank.

+0

Prüfen Sie diese Seite aus http://codereview.stackexchange.com/ für Fragen wie die – Querenker

+0

@Querenker Code Review ist für konkrete, reale Implementierungen nur! In diesem Fall würde es als Beispielcode geschlossen werden, ebenso wie eine fehlende Implementierung. – Pimgd

+1

@Pimgd Danke für Ihre Erklärung. Ich stehe korrigiert. – Querenker

Antwort

0

Sie könnten die state pattern verwenden. Dann würden Sie zwei Zustände erstellen, einen für Fälle, in denen der Zähler < 10 (stateA) und ein Zähler counter> = 10 (statB) ist. Der Übergang von stateA, der initial stat, zu stateB würde passieren, wenn der Zähler in stateA 10 erreicht.

0

Der Overhead für Ihre if-Anweisung sollte ziemlich minimal und kein Problem sein. Aber wenn Sie es optimieren müssen, könnten Sie so etwas versuchen.

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(): ...