我有一個基於枚舉值構建對象的類。所以這些對象的幾個屬性基於一些枚舉值,一個類型。基於枚舉構造對象
選項1:
typedef NS_ENUM (NSUInteger, ViewType) {
VTHouse,
VTCar,
VTChair,
...
};
我有幾種方法,確定基於該類型的對象的屬性。
- (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