2017-02-25 2 views
0

Ich habe eine Klasse, die Objekte basierend auf einem Enum-Wert erstellt. Daher basieren einige Eigenschaften dieser Objekte auf einem bestimmten Enum-Wert, einem Typ.Konstruieren von Objekten basierend auf enum

Option 1:

typedef NS_ENUM (NSUInteger, ViewType) { 
    VTHouse, 
    VTCar, 
    VTChair, 
    ... 
}; 

Ich habe mehrere Methoden, die Eigenschaften des Objekts bestimmen, von der Art basieren.

Dann habe ich eine Methode, die der Benutzer dieser Klasse aufrufen würde.

Das alles funktioniert sehr gut, aber es gibt mir ein unbehagliches Gefühl. Etwas fühlt sich einfach nicht richtig an. Vielleicht sind es alle Schalter. Ich habe das Gefühl, dass es einen saubereren Weg gibt, dies zu tun.

Eine andere Option, die die meisten Switches loswird, ist etwas wie;

Option 2:

- (SpecialView*)specialViewForType:(ViewType)type { 

    SpecialView *view = nil; 

    switch (type) { 
     case VTHouse: { 
      view = [self specialViewHouse]; 
      break; 
     } 
     case VTCar: { 
      view = [self specialViewCar]; 
      break; 
     } 
     case VTChair: { 
      view = [self specialViewChair]; 
      break; 
     } 
     ... 
    } 
    return view; 
} 

Wo jeder dieser Methoden bereits weiß, welche Eigenschaften für jeden Typ einzustellen. Aber ich bevorzuge Option 1.

Also meine Frage ist; Hat jemand irgendwelche Vorschläge, wie man diese Art von Code verbessern kann?

+0

Sie könnten Switch Case mit Wörterbuch ersetzen und einfacher Lookup. Bestimmte Switch-Case-Regeln, die das gleiche Ergebnis erzeugen, können ebenfalls gruppiert werden. Wenn Sie über ein gemeinsames Protokoll für Sichten verfügen, können Sie in jeder der Unterklassen Farbe/auswählbare Logik implementieren, um einen Wechsel zu vermeiden. – Andy

Antwort

0

Schalter sind Unterklassen aus dem letzten Jahrtausend. Der einfachste Weg, dies zu tun, ist, (private?) Unterklassen zu haben. Erstellen Sie die Instanz aus dieser Unterklasse.

@implementation BaseClass 
+ (instancetype)newBaseClassForType:(ViewType)viewType 
{ 
    // Do a look-up to a array or a one-time switch to get the subclass 
    Class appropiateSubclass = …; 
    return [appropiateSubclass new]; 
} 

Dann können die Unterklassen die Methoden überschreiben, d. e:

@implementation HouswSubClass 
- (BOOL)isSelectable { return YES; } // BTW: The return type was wrong 

Wichtiger: Warum haben Sie eine Enum?

+0

Ich mag und nicht mögen die Unterklasse Idee. Ich habe ungefähr 15 verschiedene Arten und möglicherweise mehr in der Zukunft. Eine Unterklasse zu haben, nur um bestimmte vorbestimmte Eigenschaften zu haben, scheint zu übertrieben zu sein, obwohl sie gut organisiert ist. Ich benutze eine Enumeration, um die Schnittstelle für den View-Controller zu vereinfachen. Alles was es wissen muss ist, welche Art von Sicht es will. Was wäre besser als ein enum hier? – OleShoebill

+0

Speichern Sie die Klasse statt eines hausgemachten Typs. Beachten Sie, dass Klassen Objekte in Objective-C sind. Es ist jedoch nichts falsch daran, 15 Unterklassen zu haben. Wahrscheinlich sind sie privat. –

Verwandte Themen