开闭原则的定义
Software entities should be open for extension, but closed for modification.
软件实体应该对扩展是开放的,但是对于修改应当是关闭的.凡是定义一般都是很晦涩的,那么下面举一个应用场景来说明开闭原则的价值.
第一天,客户提出一个需求,我们需要将用户对象存储到文件的UserDAO.
解决方案:
public class UserDAO{
public void saveUser(User user)
{
//将一个用户对象存储到文件.
}
}
半个月后,客户有了新的需求,它们需要将一部分用户对象存储到XML文件.
方案1(破坏OCP原则):
public class UserDAO {
public void saveUser(User user, String saveMethod) {
if (saveMethod.equals("txt")) {
// 将一个用户对象存储到文本文件.
} else if (saveMethod.equals("xml")) {
// 将一个用户对象存储到xml文件.
}
}
}
这个方案带来的变化:
1.我要修改依赖UserDAO的类,让其多传入一个参数saveMethod
2.我要维护if...else判断的正确性,如果传入的字符不是txt和xml,那么我还要进行异常处理.
3.加入存储到xml的代码后我无法预知对原来存储到txt的功能是否造成了影响.
4.如果需求再一次变化,那么我必须继续修改saveUser方法,甚至可能因为需要更多的参数而修改了依赖UserDAO的类.
方案2(遵循OCP原则):
public interface IUserDAO {
public void saveUser(User user);
}
public class UserDAOTXTImp implements IUserDAO
{
public void saveUser(User user)
{
//存储到txt
}
}
public class UserDAOXMLImp implements IUserDAO
{
public void saveUser(User user)
{
//存储到xml
}
}
这个方案带来的变化:
1.我要修改依赖UserDAO的类,让其依赖IUserDAO接口.
2.我重新实现一个存储到xml的UserDAO.
3.即使需求发生变化,需要存储到数据库的,我只需要重新实现IUserDAO接口.
4.这样的修改不会破坏原有程序.
以上看来是一个标准的OCP原则教程,那么下面我们进行进一步的思考:
来看看我们破坏了几次OCP原则.
第一天的开发,没有破坏OCP原则,我们只是单纯的增加了一个新功能.
半个月后的开发,无论我们采用方案一还是方案二我们都破坏了OCP原则.
如果我们使用方案一,在以后的变化中我们就会继续破坏OCP原则,并且带来很多负面的影响.
如果我在第一天就采用IUserDAO,整个过程都不会破坏OCP原则,听起来很不错.
那么我来对比一下第一天就采用IUserDAO所带来的不同:
IUserDAO方案:
1.我要做更多的工作,如果以后没有两种以上的实现,这个接口将毫无意义.
2.如果接口不稳定,比如要增加一个读取用户的操作,那么我们必须修改IUserDAO与UserDAO两个地方,增加了额外的工作量.
3.增加了程序的复杂度.
这个方案如果以后没有需求变化,将给系统带来无用的设计以及更多的维护成本.
UserDAO方案:
1.即使有了需求变化,要抽取出一个借口也是非常方便的,相对于IUserDAO方案并没有多出太多的工作量.
2.使用UserDAO方案破坏了OCP原则,破坏了DIP原则,没有依赖于抽象而依赖于具体实现.但是,我们一定要遵循这些原则吗?
3.程序简单直接,易维护.
我无法预期半个月后的那次需求变动,因此我不应该做提前的设计.
我对OpenClose原则的解释:
你对一类问题需要
一个以上的解决方案,
那么当加入新的解决方案时,你的修改不应该对已有模块产生影响,而你可以通过对抽象的实现来进行扩展.
OpenClose原则对于此外的场景是无意义的,比如你要加入一个新功能,IUserDAO现在需要读取用户的方法,你肯定要打开IUserDAO进行修改,这个时候破坏OpenClose原则是必然的.
分享到:
相关推荐
### 软件重构的思考与实践 #### 一、什么是重构? 重构(Refactoring)是一种在不改变软件外部行为的前提下,对软件内部结构进行调整的过程。这种调整旨在提高代码的质量,使其更加易于理解、修改和维护。软件的...
9. 《黄河是怎样变化的》中,“媲美”与“比美”,“破坏”与“保护”的近义词和反义词,让孩子们理解人与自然的关系。 10. 《蝙蝠和雷达》的“模仿”与“仿照”,“秘密”与“公开”的近义词和反义词,展示了科技...
极限编程(Extreme Programming,简称XP)是一种...通过遵循这些原则,团队可以更好地适应变化,降低风险,并生产出更高质量的软件产品。在实践中,不断学习和调整这些方法,以找到最适合自身团队和项目的最佳实践。
这种做法不仅无法解决问题,还可能破坏团队氛围。 **正确做法**: - **尊重每个人的观点**:鼓励团队成员发表不同的意见,即使是批评也要基于事实而非针对个人。 - **客观分析问题**:专注于问题本身,而不是提出...
30. **作业布置原则**:作业应适量、有针对性、与教学内容相符,同时要考虑学生的个体差异和兴趣。 31. **教育机智策略**:包括灵活引导、随机应变、对症下药和适度处理,以适应教育情境的变化。 32. **创造力培养...
在 TDD 中,开发者遵循以下三个基本原则: 1. **红灯原则**:首先编写一个失败的测试用例。这个测试用例应该清晰地定义即将要实现的功能或修复的bug。 2. **绿灯原则**:接着编写最少的代码,使刚刚失败的测试通过...
4. **运行测试并重构**:再次运行测试,如果测试通过,那么可以开始对代码进行重构,以提高其可读性、可维护性和遵循最佳实践。重构时,应保持测试始终通过,以确保改动不会破坏现有功能。 **JavaScript中的TDD** ...