一、两个主要特性
- 它们 “面向扩展开放(Open For Extension)”。
- 模块的行为是能够被扩展的。当应用程序的需求变化时,我们可以使模块表现出全新的或与以往不同的行为,以满足新的需求。
- 它们 “面向修改封闭(Closed For Modification)”。
- 模块的源代码是不能被侵犯的,任何人都不允许修改已有源代码。
1 | //检测字符串 |
这个 API 看着没什么毛病,能检测常用的一些数据。但是有以下两个问题。
- 但是如果想到添加其他规则的呢?就得在函数里面增加 case 。添加一个规则就修改一次!这样违反了开放-封闭原则(对扩展开放,对修改关闭)。而且这样也会导致整个 API 变得臃肿,难维护。
- 还有一个问题就是,比如A页面需要添加一个金额的校验,B页面需要一个日期的校验,但是金额的校验只在A页面需要,日期的校验只在B页面需要。如果一直添加 case 。就是导致A页面把只在B页面需要的校验规则也添加进去,造成不必要的开销。B页面也同理。
建议的方式是给这个 API 增加一个扩展的接口
1 | let checkType = (function() { |