我有一个基于枚举值构建对象的类。所以这些对象的几个属性基于一些枚举值,一个类型。基于枚举构造对象
选项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