Swift SOLID 2. 开闭原则
内容提要
SOLID原则是面向目标编程的基本准则,旨在帮助开发者构建易于管理和扩展的系统。在Swift编程语言中也适用这些准则。开闭准则指出软件实体应对扩展开放,对修改关闭。遵循开闭准则可以通过使用协议和继承来扩展类的功能。枚举的使用可能违反开闭准则,可以通过将行为封装在遵循协议的类中来解决。建议尽量使用协议来定义抽象,避免使用枚举和全局变量,将类的特性设为私有以保证封装性。
延伸解读
开闭原则的核心:扩展而非修改
开闭原则要求软件实体对扩展开放,对修改关闭。这意味着当需求变化时,应通过添加新代码来扩展功能,而不是修改已有代码。在Swift中,这通常借助协议和继承实现。例如,通过继承Payment类创建新的支付方式,无需改动原有类;或者定义EquipmentType协议,让Ball和Basketball等类型遵循,从而使EquipmentsRoom依赖于抽象而非具体类型。这样做降低了模块间的耦合,使系统更易于维护和扩展。
枚举为何容易违反开闭原则
使用枚举定义类型时,往往需要在多个地方进行switch-case或if-else判断。当新增一个枚举值时,所有相关的判断逻辑都必须修改,否则可能遗漏并导致未知行为。例如,LoggerType枚举新增.remote后,LogManager的log方法必须添加对应的case。这直接违反了“对修改关闭”的要求。因此,文章建议避免用枚举定义多种类型的行为,而应将行为封装在遵循同一协议的类中,让每个类实现自己的方法。
用协议抽象替代枚举与全局变量
文章给出的解决方案是:尽量使用协议来定义抽象,减少对具体类型的直接依赖。例如,将Logger协议改为声明log(message:)方法,让FileLogger、ConsoleLogger等类各自实现。这样,LogManager只需调用logger.log(message:),新增RemoteLogger时无需修改LogManager。此外,建议将类的属性设为私有,避免外部直接访问内部状态,并避免使用全局变量,以降低耦合。这些做法共同保证了类的修改不会波及其他模块,从而更好地遵循开闭原则。
Q&A
什么是SOLID原则?
SOLID原则是五个面向目标编程的基本准则,旨在帮助开发者构建易于管理和扩展的系统。
开闭原则(OCP)具体指什么?
开闭原则指出软件实体应对扩展开放,对修改关闭,允许类的功能扩展但禁止修改现有代码。
如何在Swift中遵循开闭原则?
在Swift中,可以通过使用协议和继承来实现开闭原则,允许扩展类的功能而不修改现有代码。
使用枚举会对开闭原则产生什么影响?
使用枚举可能违反开闭原则,因为增加新的枚举值通常需要修改现有的switch-case逻辑。
如何避免枚举导致的开闭原则违反?
可以通过将行为封装在遵循协议的类中,而不是直接依赖于枚举类型,来避免开闭原则的违反。
为什么将类的属性设为私有是重要的?
将类的属性设为私有可以减少外部对类内部状态的直接访问,从而保证封装性,帮助遵循开闭原则。