浅谈软件开发中的防御式编程
在软件开发中针对用户的输入往往不是我们所期待的那样(不满足前置条件),有时候软件内部往往也会出现一些我们不易察觉的错误,针对这种情况,一些人持有乐观的态度,而另外一些人则从一个其他的事情中得到了启发:即由防御式驾驶而想到的防御式编程。
所谓防御式编程,指的就是这样一件事情:即我们假定使用者都是白痴,他们可能在输入时进行各种各样的操作,这来源于防御式驾驶:即假定路上开车的都是疯子,你要提前制定策略防止他们撞到你或者你撞到他们,因此你必须要保证万无一失,而不是采取投机取巧的方法。心理学上有一个定律叫做墨菲定律,即任何你认为不会发生的事都有可能发生。
在软件开发中也正是如此,比如我们想开发一个航班管理系统,在用户进行一定的输入之后就会将所有的航班信息展示到显示屏上。但是事情往往不顺遂人意。用户可能输入并不存在的飞机,发往并不存在的机场,用户也可能和你玩恶作剧,为航班不分配飞机,那样的话所有人就只能干等。诸如此类,这仅仅是一个小小的例子,如果机场信息版出了问题可能还不是什么大毛病,但是假如这个开发机场管理系统的人同时也去开发了银行管理系统,那结果可能就不太乐观了。前些天美国用百万年薪来招聘一些会上古语言的老程序员,因为这些程序设计语言被用作银行管理系统几十年,中间并没有出过什么大问题,因此一直没有进行更新换代和相应的维护,从中我们也可以窥见一个鲁棒性较强的平台是多么重要,这几十年维护省下来的钱可能也能用于更多的用途吧(;》)
ok,当我们了解到防御式编程的意义之后,我们就需要考虑怎样实现防御式编程,具体而言有以下几个方法:
▪Protecting programs from invalid inputs
▪ Assertions
▪ Exceptions
▪ Specific error handling techniques
▪ Barricade
▪ Debugging aids
在这里我并不打算展开讲述,具体可参考MIT 软件构造课程的课件。我只想说一下里面的Barricade,这个所谓的障碍物模式,实际上是将程序内部与外界隔离开,我们通过人为的设置防火墙,来规避那些外界可能存在的风险,有点像设计模式中的proxy,通过中介来进行数据处理交换,将风险委托给别人,也不失为一种很好的开发策略。