2009-03-28 9 views
0

Wenn ich eine Datenbank-Tabelle enthält eine Flagge, die mehrere Zustände annehmen kann, sollte ich tun, um dieseSollte ich Methoden oder konstante Flags verwenden?

if ($Object->isStateOne()) { 
    // do something 
} 
else if ($Object->isStateTwo()) { 
    // do something else 
} 
else if ($Object->isStateThree()) { 
    // do yet something else 
} 

oder dieses

switch ($Object->getSomeFlag()) { 
    case ObjectMapper::STATE_ONE: 
    // do something 
    break; 

    case ObjectMapper::STATE_TWO: 
    // do something else 
    break; 

    case ObjectMapper::STATE_THREE: 
    // do yet something else 
    break; 
} 

?

Antwort

2

Was auch immer sinnvoll ist, natürlich.

Der Schalter sieht viel sauberer aus. Aber, was ist dieser "Zustand", den du kontrollierst? Wenn Sie eine Zeichenfolge übersetzen, verwenden Sie beispielsweise ein Array.

Das if hat ein anderes Verhalten als der Schalter. Die Methodenaufrufe können Nebenwirkungen haben. Das if ist besser, wenn mehrere Zustände gleichzeitig auf dem Objekt aktiv sein können.

1

Die zweite Option scheint nur die bessere Lösung zu sein. IMHO, die unansehnlich Duplizierung des Vergleichscodes, die die Methoden der ersten Lösung begleiten würden der Show-Stopper für mich wäre, zum Beispiel:

public function isStateOne() { 
    if(strcmp(ObjectMapper::STATE_ONE, '1') == 0) { 
     return true; 
    } 
} 
public function isStateTwo() { 
    if(strcmp(ObjectMapper::STATE_TWO, '2') == 0) { 
     return true; 
    } 
} 
public function isStateThree() { 
    if(strcmp(ObjectMapper::STATE_THREE, '3') == 0) { 
     return true; 
    } 
} 

Natürlich andere vielleicht nicht zustimmen. Ich mag es einfach nicht, Klassen mit "fast den gleichen" Methoden zu füllen.

2

Von einer OO-Perspektive werden beide abgeraten. Wenn Sie einen anderen Status haben, möchten Sie möglicherweise eine virtuelle Methode erstellen und diese in der geerbten Klasse überschreiben. Basierend auf Polymorphie können Sie dann die Anweisungen if und switch vermeiden.

+0

Auf Kosten von N mehr Klassen. Und es ist viel schwieriger, zwischen Staaten zu wechseln. Ob das Sinn macht, hängt davon ab, was die Zustände sind. – derobert

+0

Ich glaube nicht, Polymorphismus wird funktionieren, wie dieser if/else/switch-Anweisungsblock in UI-Code gehen muss. Was für jeden Fall passiert, wird nicht überall gleich sein. –

Verwandte Themen