设计一个模块时,应当使该模块在不被修改的前提下被扩展,即可在不必修改源代码的情况下改变该模块的行为。
陈述:
软件实体(类、模块、函数等)应该是可以扩展的,同时还可以是不必修改的,更确切的说,函数实体应该:
(1)对扩展是开放的
当应用的需求变化时,我们可以对模块进行扩展,使其具有满足改变的新的行为。即:我们可以改变模块的功能
(2)对更改是封闭的
对模块进行扩展时,不必改动模块已有的源代码或二进制代码。
分析:
世界是变化的(而且变化很快),软件是对现实的抽象。---->软件必须能够扩展。
如果任何修改都需要改变已经存在的代码,
那么可能导致牵一发动全身现象,进而导致雪崩效应,使软件质量显著下降。
实现OCP的关键是抽象:
例1:既不开放也不封闭的Client:
问题:
client和server都是具体类,接口与实现没有实现分离。如果我们想要让client调用一个新的server类,那么我们不得不修改client的源代码。从而带来编译、链接、部署等一系列的问题。
view plainprint? class client{ server& s; public: client(server& SER):s(SER) {} void useServer(){ s.ServerFunc(); } }; view plainprint? class server{ int serverData; public:
时间: 2024-10-26 02:59:55