摘要:c++++ 函数设计遵循的原则包括单一职责、开放-封闭、里氏替换和迪米特法则。这些原则构成了 solid 原则:单一职责 (s): 函数只应执行一个明确目标。开放-封闭 (o): 函数应可扩展而不需修改源代码。里氏替换 (l): 派生类可替换基类而不影响客户端代码。接口隔离 (i): 客户端仅依赖所需的接口。依赖反转 (d): 函数依赖抽象接口而非具体实现。
C++ 函数的艺术:设计原则与 SOLID 原则,架构健康之道
设计原则
单一职责原则(SRP):函数应只有一个明确定义的目标。这使得代码更容易维护、测试和理解。
开放-封闭原则(OCP):函数的行为应该可以通过扩展来修改,而无需修改其源代码。
里氏替换原则(LSP):派生类应该能够无缝地替代其基类,而不会破坏客户端代码。
立即学习“C++免费学习笔记(深入)”;
迪米特法则(LoD):函数只应知道所需的最小信息,并应避免与不相关的模块直接交互。
SOLID 原则
上述设计原则为 SOLID 原则奠定了基础:
单一职责 (S):函数应执行单一明确的目标。
开闭 (O):函数应对扩展开放,对修改关闭。
里氏替换 (L):派生类应能够替换其基类而不会破坏客户端代码。
接口隔离 (I):客户端应仅依赖于它们所需的接口,而不是大而全的接口。
依赖反转 (D):函数不应直接依赖其他函数,而是应通过抽象接口依赖。
实战案例
SRP:
// 获得用户的姓名
std::string get_user_name() {
// 获取用户输入
return prompt_user("Enter your name: ");
}
此函数遵循 SRP,因为它只执行一个任务:获取用户姓名。
OCP:
// Abstract Shape 类
class Shape {
public:
virtual float area() const = 0;
};
// Rectangle 类(派生类)
class Rectangle : public Shape {
public:
float width, height;
float area() const override {
return width * height;
}
};
通过继承 Shape 抽象类,Rectangle 可以扩展其功能,而无需修改 Shape 的源代码。
LSP:
// Player 类(基类)
class Player {
public:
virtual void move() = 0;
};
// HumanPlayer 类(派生类)
class HumanPlayer : public Player {
public:
void move() override {
// 人类玩家的移动逻辑
}
};
HumanPlayer 可以无缝替代 Player,因为它们都实现了相同的 move() 方法。
LoD:
// 订单处理函数
void process_order(Order order) {
// 用所需数据更新数据库
update_database(order);
// 通过事件通知其他模块
send_order_processed_event();
}
此函数仅与处理订单相关的数据交互,避免了与其他不相关的模块直接交互。
D:
// 依赖倒置示例
class Service {
public:
virtual void do_something() const = 0;
};
class Client {
public:
void use_service(Service& service) {
service.do_something();
}
};
Client 类通过接口依赖于 Service 类,而无需直接依赖其具体实现。