返回
为什么使用枚举作为配置项(enum as configuration)是反开发模式的
IOS
2024-01-27 01:44:07
在我的开发工作中,我经常看到有 Objective-C(偶尔也有 Swift)的设计中用到一种模式:使用枚举类型(enum)作为一个类的配置项。比方说,传递一个enum给UIView来确定一个显示的样式。
在这篇文章里,我会解释为什么我认为这种做法是反设计模式的,并且我会给出一个更强健、模块化,扩展性更强的方式来配置一个类。
问题
使用枚举作为配置项违反了单一职责原则。单一职责原则指出,一个类应该只负责一项功能。当一个类既负责其自身的行为,又负责配置自己的行为时,它就违反了单一职责原则。这会导致以下问题:
- 扩展性差 。如果想要添加一个新的配置项,就必须修改枚举。这可能会导致类中其他部分的代码需要修改。
- 维护性低 。当枚举中的某个值发生变化时,就需要修改所有使用该枚举的代码。这可能会导致错误并增加维护成本。
- 可读性差 。枚举中的值通常是任意选择的,这使得代码难以理解。
解决方案
使用扩展来实现配置项。扩展是一种在不修改现有类的情况下为其添加新功能的机制。这可以用来为一个类添加新的配置项,而不会违反单一职责原则。
以下是一个使用扩展来实现配置项的示例:
@interface UIView (Configuration)
- (void)setStyle:(UIViewStyle)style;
@end
@implementation UIView (Configuration)
- (void)setStyle:(UIViewStyle)style {
switch (style) {
case UIViewStyleDefault:
self.backgroundColor = [UIColor whiteColor];
self.layer.borderColor = [UIColor blackColor];
self.layer.borderWidth = 1.0;
break;
case UIViewStyleRounded:
self.backgroundColor = [UIColor redColor];
self.layer.cornerRadius = 10.0;
self.layer.borderColor = [UIColor blueColor];
self.layer.borderWidth = 2.0;
break;
}
}
@end
这个扩展为UIView类添加了一个新的方法setStyle(_:)。这个方法可以用来设置UIView的样式。样式是一个枚举类型,定义了UIView的两种不同的样式:UIViewStyleDefault和UIViewStyleRounded。
使用这个扩展,我们可以通过以下方式来设置UIView的样式:
UIView *view = [[UIView alloc] init];
[view setStyle:UIViewStyleRounded];
这种方法比使用枚举作为配置项更加灵活、强健和可维护。它允许我们添加新的样式而不需要修改UIView类。它还使得代码更容易理解,因为样式的值是显式的定义的。
结论
使用枚举作为配置项是一种反设计模式。这种做法违反了单一职责原则,并会导致软件设计中出现扩展性差、维护性低和可读性差的问题。
使用扩展来实现配置项是一种更好、更强健的方式。这种方法允许我们添加新的样式而不需要修改类,并且它使得代码更容易理解。