SOLID

23 阅读2分钟

SOLID oop 软件开发设计原则

S

单一职责原则

一个文件,一个类只负责一个功能

O

开闭原则

对修改关闭,对扩展开发

L

里氏替换原则

设计的继承,子类要在任何情况下可以替换父类,而不发生程序性的错误

I

接口隔离原则

demo

示例代码

假设有一个打印机类,它同时支持打印和扫描功能。如果将所有功能都放在一个接口中,可能会导致某些只支持打印功能的设备也必须实现扫描功能接口,这违反了接口分离原则。

违反接口分离原则的代码:

 class IMachine {
 public:
     virtual void print() = 0;
     virtual void scan() = 0;
 };
 ​
 class Printer : public IMachine {
 public:
     void print() override {
         std::cout << "Printing..." << std::endl;
     }
 ​
     void scan() override {
         // 不支持扫描功能,但必须实现
         throw std::logic_error("This printer does not support scanning");
     }
 };

遵循接口隔离原则的代码:

 class IPrinter {
 public:
     virtual void print() = 0;
 };
 ​
 class IScanner {
 public:
     virtual void scan() = 0;
 };
 ​
 class Printer : public IPrinter {
 public:
     void print() override {
         std::cout << "Printing..." << std::endl;
     }
 };
 ​
 class Scanner : public IScanner {
 public:
     void scan() override {
         std::cout << "Scanning..." << std::endl;
     }
 };
 ​
 class AllInOne : public IPrinter, public IScanner {
 public:
     void print() override {
         std::cout << "Printing..." << std::endl;
     }
 ​
     void scan() override {
         std::cout << "Scanning..." << std::endl;
     }
 };

D

依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象

目的:通过依赖抽象而不是具体实现,减少模块之间的耦合,提高系统的灵活性和可扩展性。

依赖导致,就是中间插入了一层抽象的代码,上层从抽象中获得数据。底层去继承抽象。

 class INotification {
 public:
     virtual void send(const std::string& message) = 0;
 };
 ​
 class Email : public INotification {
 public:
     void send(const std::string& message) override {
         std::cout << "Sending email: " << message << std::endl;
     }
 };
 ​
 class SMS : public INotification {
 public:
     void send(const std::string& message) override {
         std::cout << "Sending SMS: " << message << std::endl;
     }
 };
 ​
 class Application {
 private:
     INotification* notification;
 ​
 public:
     Application(INotification* notification) : notification(notification) {}
 ​
     void notify(const std::string& message) {
         notification->send(message);
     }
 };
 ​
 int main() {
     Email email;
     Application app(&email);
     app.notify("Hello, world!");
 ​
     SMS sms;
     Application app2(&sms);
     app2.notify("Hello, world!");
 ​
     return 0;
 }

F3 中 platform 是一个抽象的类,管理了 下面的3种运行的平台, cmodel , sft , uft。

上层调用方,调用的是一个 类似抽象类的概念,下面的具体实现方,是 3个平台下的 内存,上下电 和 IPC.,这就是依赖倒置。