私は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を好む。
だから私の質問です。どのようにこの種のコードを改善するための提案がありますか?
スイッチケースを辞書で置き換えて、簡単な検索ができます。同じ結果を生成する特定のスイッチケースルールもグループ化できます。また、ビュー用に共通のプロトコルを使用している場合は、各サブクラス内でカラー/選択可能なロジックを実装して、スイッチケースを避けることができます。 – Andy