SOLID 原则,这是面向对象设计中非常核心的一套指导原则,用来写 可维护、可扩展、可复用 的代码。每个字母对应一个原则:
S — Single Responsibility Principle(单一职责原则)
- 含义:一个类只负责一项职责(功能)。
- 目的:降低类的复杂度,提高可维护性。
- 示例:
// ❌ 不符合单一职责:既负责用户数据管理,又负责打印日志
@interface UserManager : NSObject
- (void)saveUser:(User *)user;
- (void)logUserSave:(User *)user;
@end
// ✅ 符合单一职责:分开两个类
@interface UserManager : NSObject
- (void)saveUser:(User *)user;
@end
@interface Logger : NSObject
- (void)log:(NSString *)message;
@end
O — Open/Closed Principle(开闭原则)
- 含义:软件实体(类、模块、函数等)对扩展开放,对修改封闭。
- 目的:新增功能不破坏已有代码,降低回归风险。
- 示例:
// ❌ 修改原有类增加支付方式
@interface PaymentManager : NSObject
- (void)payWithAmount:(double)amount type:(EVPaymentType)type;
@end
// ✅ 使用策略模式扩展支付方式,不修改 PaymentManager
@interface EVPaymentManager : NSObject
- (void)payWithAmount:(double)amount type:(id<EVPaymentStrategy>)strategy;
@end
L — Liskov Substitution Principle(里氏替换原则)
- 含义:子类对象必须可以替换父类对象,并且功能不出错。
- 目的:保证继承体系的可靠性和可替换性。
- 示例:
@interface Bird : NSObject
- (void)fly;
@end
@interface Duck : Bird @end
@interface Ostrich : Bird @end
// ❌ 错误:Ostrich 不会飞,如果调用 fly 会出问题
正确做法:将
fly
提取到可飞行接口,Ostrich 不实现Flyable
。
I — Interface Segregation Principle(接口隔离原则)
- 含义:不强迫类依赖它不需要的接口。
- 目的:接口粒度小,避免“胖接口”。
- 示例:
@protocol Worker <NSObject>
- (void)work;
- (void)eat;
@end
// ❌ 不符合接口隔离:机器人也必须实现 eat
@interface Robot : NSObject <Worker> @end
// ✅ 分接口
@protocol Workable <NSObject>
- (void)work;
@end
@protocol Eatable <NSObject>
- (void)eat;
@end
D — Dependency Inversion Principle(依赖倒置原则)
-
含义:
- 高层模块不应该依赖低层模块,二者都应该依赖抽象。
- 抽象不应该依赖细节,细节应该依赖抽象。
目的:降低模块间耦合,增强灵活性。
示例:
// ❌ 高层模块直接依赖低层模块
@interface UserService : NSObject
@property (nonatomic, strong) UserManager *manager;
@end
// ✅ 高层模块依赖抽象接口
@interface UserService : NSObject
@property (nonatomic, strong) id<UserStorable> storage;
@end
总结
- S:一个类只做一件事
- O:扩展功能时,尽量不改已有代码
- L:子类能替换父类且行为正确
- I:接口要小,类只依赖需要的方法
- D:高层模块依赖抽象,不依赖具体实现
SOLID 原则是面向对象设计的基石,和你之前讲的 组合模式 / 策略模式 / 工厂模式 很契合。例如:
- 组合模式体现 依赖倒置
- 策略模式体现 开闭原则
- 工厂模式帮助 单一职责 + 依赖倒置