点击上方蓝色字体了解更多的嵌入式编程实用技能。
如果你觉得该文章对你有帮助,欢迎点赞+关注
软件开发设计中最大的难题就是应对需求的变化,而各种各样的需求变化又是不可预料的,我们要为这种不可预料的变化做好准备,这本身是一件十分痛苦的事情,通常涉及到功能的变更、扩展和删除等,所幸前辈们已经给我们提出了经典的六大设计原则和23种设计模式来“封装”未来的变化。
在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。六大设计原则中多了一个“迪米特法则”。
本文只针对六大设计原则的开闭原则进行介绍。
六大设计原则和23种设计模式主要适用于面向对象的编程语言,而非面向过程语言,即C语言。
熟练理解6大设计原则后,在面向过程语言中也能有一定的借鉴。
在面向对象编程领域中,开闭原则 (The Open/Closed Principle, OCP) 规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用品质的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。
对扩展开放:模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。
对修改关闭:模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。
在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
此原则的核心就是对扩展开放和对更改封闭;面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。
该原则就要求在最开始设计程序的时候,尽量考虑更加全面,并且在实际编程中不断去优化甚至重构之前的实现方式(当然在时间较为充裕的情况下),并不是仅仅功能实现后就不管不顾了。
有很多的设计方式就是根据这些设计原则慢慢总结归纳的,比如表驱动编程、状态机编程等,在尽量不影响原有的程序下,添加数据或者删除数据。修改后甚至代码只需要测试新增的数据是否有效等。
对软件测试友好
软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
可复用性好
我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
可维护性好
由于程序代码的基础框架考虑完善,基本上很少去修改这部分核心的代码内容,因此,我们不用担心软件系统中原有核心代码的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。
在最开始设计程序的时候,尽量考虑更加全面,并且在实际编程中不断去优化甚至重构之前的实现方式,但是!!!!考虑的时候也要适当进行取舍,思考设计的代码以后是否会用到,或者扩展功能时需要,有时候考虑太多反而限制了实际的编程进度,在思考初步基本框架后,就可以开始编程,在编程过程中思考。
通常程序设计,特别是对于功能扩展,需要多年的程序设计经验、同时有这个行业多年的业务要求经验,这样才会在开发过程中想象到之后大概率会存在哪些需求,从而搭建这部分的基础框架。