面向对象的准则

1.3 面向对象的准则
人们编写软件的目的除了使用外,另一个目的是容易修改,否则我们就改制硬件了。所以说,变更是软件的天
性。我们不应该限制软件的更新,而应该适应更新,创造环境使得容易更新,甚至预计可能的变化(所以我们
才有更多的工作机会)。人们经过长期的经验积累和研究认识到,具有可重用性和可维护性的软件能够很好地
适应变化。这里,可重用性是指一个软件模块能否被用在很多不同场合;可维护性是指一个软件模块是否容易
修改,更新和扩展。在面向对象的实践中,人们为了写出具有这两个性质的模块,总结了一些原则。下面,我
们简略地介绍一下这些原则。值得指出的是,除了第一个开闭原则外,其它原则主要是针对类而言的。现在,
人们又总结了一些针对包的原则,但是因为它和我们的内容没有太多的直接关系,所以我们略去不谈。有兴趣
的读者可以参阅一下相关的资料。
1.3.1 开闭原则(OCP,The Open-Closed Principle)
开闭原则是说,所有软件模块都应该可以扩展,但不可以修改。遵循这个原则的关键在于抽象化。我们在写一
个模块时,不论是一个类,还是一个构件,都应该认真思考它的真正功能,它对其它模块的依赖性,输入和输
出,等等。分离出它的可变部分(例如,用接口或外部配置等),对不变部分进行封装。这些不变部分就是这
个模块的本质。这里需要说明的是,在对不变部分进行封装时,我们如何定义不变的部分。在数学中,当我们
谈到不变量时,总是要指明它是在什么变化下的不变量。否则是没有意义的,因为在一种变化下的不变量很有
可能在另一种变化下就不是不变量了。所以,当我们定义不变的部分时,首先要明确它的变化范围。但是,在
软件开发中,很难事先准确的知道这些变化,很多时候是凭经验或行业知识来判断的。所以,这个原则多多少
少带有主观性,更像一个总纲而不像一个硬性的法律条文。Martin Fowler 的书Analysis Patterns 讲解了一些实
际经验,有兴趣的读者可以参考。下面这些原则是讲如何安排依赖性使得模块具有良好的封闭性,可重用性和
可维护性。
1.3.2 依赖反向原则(DIP,Dependency Inversion Principle)
依赖反向原则是说,要依赖于抽象,而不要依赖于具体。这也就是我们所说的:要针对接口编程,而不要针对
实现编程。之所以是倒置,是因为通常在开始依照需求编程时,我们几乎总是依赖于具体的实现。但是,这些
具体的实现都不易适应变化,所以要抽象出一些不变的,本质的功能,把可变的留到具体的实现中去。这种抽
象的过程是前面过程的反向,例如,当我们需要写出结果时,开始时可能会写到文件里,后来可能会写到网络
流里,等等。抽象的结果是写这个功能。针对接口编程是一个不可能过分强调的原则。接口就像高楼大厦中层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值