返回

为什么使用枚举作为配置项(enum as configuration)是反开发模式的

IOS

在我的开发工作中,我经常看到有 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类。它还使得代码更容易理解,因为样式的值是显式的定义的。

结论

使用枚举作为配置项是一种反设计模式。这种做法违反了单一职责原则,并会导致软件设计中出现扩展性差、维护性低和可读性差的问题。

使用扩展来实现配置项是一种更好、更强健的方式。这种方法允许我们添加新的样式而不需要修改类,并且它使得代码更容易理解。