2017-02-25 4 views
0

私はenum値に基づいてオブジェクトを構築するクラスを持っています。そのため、これらのオブジェクトのいくつかのプロパティは、ある型のenum値に基づいています。enumに基づいてオブジェクトを構成する

オプション1:

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

I型に基づいて対象物の特性を決定するいくつかの方法を持っています。

- (NSURL*)urlForViewType:(ViewType)type { 

    NSURL *url = nil; 

    switch (type) { 
     case VTHouse: { 
      url = [NSURL URLWithString:@"House url"]; 
      break; 
     } 
     case VTCar: { 
      url = [NSURL URLWithString:@"Car url"]; 
      break; 
     } 
     case VTChair: { 
      url = [NSURL URLWithString:@"Chair url"]; 
      break; 
     } 
     ... 
    } 

    return url; 
} 

- (NSURL*)isSelectableViewType:(ViewType)type { 

    BOOL selectable = NO; 

    switch (type) { 
     case VTHouse: { 
      selectable = YES; 
      break; 
     } 
     case VTCar: { 
      selectable = YES; 
      break; 
     } 
     default: { 
      break; 
     } 
    } 

    return selectable; 
} 

- (NSURL*)colorForViewType:(ViewType)type { 

    UIColor *color = nil; 

    switch (type) { 
     case VTHouse: { 
      color = [UIColor redColor]; 
      break; 
     } 
     case VTCar: { 
      color = [UIColor blueColor]; 
      break; 
     } 
     case VTChair: { 
      color = [UIColor lightGrayColor]; 
      break; 
     } 
     ... 
    } 

    return color; 
} 

// And so on... 

次に、このクラスのユーザーが呼び出すメソッドがあります。

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

    NSURL *url = [self urlForViewType:type]; 
    BOOL selectable = [self isSelectableViewType:type]; 
    UIColor *color = [self colorForViewType:type]; 
    ... 

    return [SpecialView specialViewURL:url selectable:selectable color:color ...]; 
} 

このすべてが非常にうまく動作しますが、それは私に不安感を与えます。何かがちょうどいい気分にならない。多分それはすべてのスイッチです。私はこれを行うためのよりクリーンな方法があるように感じる。

スイッチのほとんどを取り除く別のオプションは、次のようなものです。

オプション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; 
} 

。しかし、私はオプション1を好む。

だから私の質問です。どのようにこの種のコードを改善するための提案がありますか?

+0

スイッチケースを辞書で置き換えて、簡単な検索ができます。同じ結果を生成する特定のスイッチケースルールもグループ化できます。また、ビュー用に共通のプロトコルを使用している場合は、各サブクラス内でカラー/選択可能なロジックを実装して、スイッチケースを避けることができます。 – Andy

答えて

0

スイッチは、最後の千年からのサブクラスです。これを行う最も簡単な方法は、(プライベート?)サブクラスを持つことです。そのサブクラスからインスタンスを作成します。

@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]; 
} 

次に、サブクラスはメソッドをオーバーライドできます。 e:

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

さらに重要:なぜ列挙型を使用していますか?

+0

私はサブクラスのアイディアが好きで嫌いです。私は約15種類の種類がありますが、将来的にはさらに多くの種類があります。だから、サブクラスをある特定の所定のプロパティを持っているように見えるかもしれませんが、それは過労、よく整理されるかもしれないようです。ビューコントローラのインターフェイスを単純化するためにenumを使用します。だから、それが知る必要があるのは、それが望むタイプのビューです。ここでenumより優れているのは何ですか? – OleShoebill

+0

自宅で作成したタイプではなく、クラスを保存します。 Objective-Cのクラスはクラスであることに注意してください。しかし、15のサブクラスを持つことに間違いはありません。おそらく彼らはプライベートです。 –

関連する問題