I nterface S egregation P 原则在C++中是第四个&;到目前为止是一系列SOLID如磐石设计原则中最简单的设计原则。SOLID设计原则着重于开发易于维护、可重用&可扩展的软件。在这篇文章中,我们将看到一个违反ISP的代码,一个解决相同代码的方法,准则& ISP的好处。
顺便说一下,如果你还没有看过我以前关于设计原则的文章,那么下面是快速链接。
你在这一系列文章中看到的代码片段是简化的而不是复杂的。所以你经常看到我没有使用像 override
、 final
、 public
这样的关键词(虽然是继承),只是为了使代码紧凑和amp;在单一的标准屏幕大小中可以消费(大部分时间)。我也喜欢用 struct
而不是 class
,只是为了节省行数,有时不写" public:
",也故意错过 虚拟析构器 、构造器、 复制构造器 、前缀 std::
、删除动态内存。我也认为自己是一个务实的人,希望用最简单的方式来表达一个想法,而不是用标准的方式或使用Jargons。
注意:
不应强迫客户依赖他们不使用的接口。
struct Document;
struct IMachine {
virtual void print(Document &doc) = 0;
virtual void fax(Document &doc) = 0;
virtual void scan(Document &doc) = 0;
};
struct MultiFunctionPrinter : IMachine { // OK
void print(Document &doc) override { }
void fax(Document &doc) override { }
void scan(Document &doc) override { }
};
struct Scanner : IMachine { // Not OK
void print(Document &doc) override { /* Blank */ }
void fax(Document &doc) override { /* Blank */ }
void scan(Document &doc) override {
// Do scanning ...
}
};
MultiFunctionPrinter
而言,实现 print()
, fax()
& scan()
方法由 IMachine
接口执行是可以的。 Scanner
或 Printer
, 一些设计仍然继承 IMachine
& 留下不必要的方法或者抛出 NotImplemented
异常,无论如何,你都是做错了。 /* -------------------------------- Interfaces ----------------------------- */
struct IPrinter {
virtual void print(Document &doc) = 0;
};
struct IScanner {
virtual void scan(Document &doc) = 0;
};
/* ------------------------------------------------------------------------ */
struct Printer : IPrinter {
void print(Document &doc) override;
};
struct Scanner : IScanner {
void scan(Document &doc) override;
};
struct IMachine : IPrinter, IScanner { };
struct Machine : IMachine {
IPrinter& m_printer;
IScanner& m_scanner;
Machine(IPrinter &p, IScanner &s) : printer{p}, scanner{s} { }
void print(Document &doc) override { printer.print(doc); }
void scan(Document &doc) override { scanner.scan(doc); }
};
MyMachine : IMachine
和
MyMachine : IPrinter, IScanner, IFaxer
我需要我正在使用的这个界面上的所有方法吗?(