开放-封闭原则(OCP)是面向对象的 SOLID 原则中的一种,该原则最近受到了 Jon Skeet 和 Robert Ashton 的批评。他们认为,与其定义一样,该原则弊大于利。该原则是由 Robert C. Martin 在本世纪初总结出来的,Robert 辩护说,你们应该看一下完整的描述,而不是只看短短的定义。
这场争论是由《 C# in Depth 》的作者 Jon 的一条推特引发的,他质疑说:
“我知道,质疑 __OCP__ 这样的原则近乎于异端邪说,但我从来就没感觉到它有什么意义。”
Robert C. Martin 在一条回复中回顾了 OCP 原始文章给出的定义:
符合开放-封闭原则的模块有两个主要属性:
1. 为扩展而开放。这意味着模块的行为可以扩展。随着应用需求的改变,我们可以让模块表现出新的不同行为,或者满足新应用的需求。
2. 为修改而关闭。这种模块的源代码是不能动的,不允许任何人修改。
Robert 在回复中承认该原则的定义是有点夸大,但他同时宣称整篇文章的解释更为温和,而且他在新写的一篇文章中改进了其定义。
面对 Robert 的回复,Jon 继续争论说,定义和描述还是太过模糊不清,要讲清本质,这类原则必须使用正确的术语仔细定义。相反,他认为 Alistair Cockburn 创造的“防止变异( Protected Variation )”这一类似概念的描述更好一些:
“识别出预计会发生改变的点,围绕这些点来设计稳定的接口。”
Robert Ashton 随后也对开放-封闭原则提出了批评,他认为该原则是导致很多软件过度设计的罪魁祸首。但是他也承认,该原则在有些领域是有意义的,比如设计会反复修改的场景。之后他还谈到了SOLID 原则的其他4 个。
查看英文原文: Open-Closed Principle in SOLID Object Orientation Rules Challenged
评论