SOLID 面向对象规则中的开放-封闭原则受到挑战

  • Jan Stenberg
  • 臧秀涛

2013 年 5 月 8 日

话题:语言 & 开发架构

开放-封闭原则(OCP)是面向对象的SOLID 原则中的一种,该原则最近受到了Jon SkeetRobert 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

语言 & 开发架构