由结对编程想到的——关于Information Hiding,interface design, loose coupling

关于Information Hiding

Information hiding is part of the foundation of both structured design and object-oriented design. In structured design, the notion of “black boxes” comes from information hiding. In object-oriented design, it gives rise to the concepts of encapsulation and modularity, and it is associated with the concept of abstraction.

----From Code Complete Section 5.3

对于面向对象的程序设计而言,信息隐藏是一种重要的软件开发手段,它与对象的封装(encapsulation)与模块化(modularity)密切相关。在我看来,信息隐藏使得一个类把复杂的、敏感的、一旦被外界捕获可能会引起不良后果的内容封装在自身内部,这个类以外的代码得不到此类信息(通过反射等手段可能对得到),以提高程序的安全性与健壮性。

Code Complete中列举了两类需要考虑隐藏的内容:

Hiding complexity so that your brain doesn’t have to deal with it unless you’re specifically concerned with it

Hiding sources of change so that when change occurs the effects are localized

第一类信息是复杂化的信息,比如这个Elevator Framework,对于电梯的调度器而言,它不需要关心电梯在收到调度指令后是如何工作的,而对于电梯(Elevator)而言,它只需要被动的等待调度器的指令,而不需要关心调度器的具体实现算法,换言之,信息隐藏将内部的算法实现封装起来,对外部只提供调用的接口,使得程序之间各个模块各司其职,互不影响。

对于第二类,是指变动的信息,这个看上去比较抽象,举个例子,比如一个类中,抛出了Error,这个错误如果在类中即捕获,并进行了适当的处理,则该错误就不会扩散出去,外部代码也发现不了错误的存在,这样做,可以提高程序的容错性

关于interface design与loose coupling

我个人感觉,这两个概念是相辅相成的,后者是前者的目的,前者是后者的实现手段。

面向接口编程是软件工程领域常用的设计手段,在这次PairWork中,我们深切体会到它的一大优点:我们只需要面向IScheduler接口进行编程,实现之,我们自己的代码就完美的融入了整个程序中。虽然我们在初期并不清楚整个测试程序的工作原理与架构,但是只要我们专注于实现ISchedule的功能,就能够达到调度的目的。

这对于一个团队而言,是非常重要的,在做一个团队项目时,有人可能负责领域模型M(Model),有人负责前台V(View),有人负责业务逻辑C(Controller),在这种MVC的设计模式驱动下,我们首先想到的就是:定义一套公共的接口,方便各个模块之间的通讯。面向接口的程序设计思想是一种有效的手段。比如一个做业务逻辑的Team,他们并不清楚业务数据的CURD实现,但他们只要通过面向于数据组提供的一整套接口进行编程即可,同时,数据组的开发可以并行进行,这样,不需要等待一个模块的完成就可以预先“使用”这个模块,极大的提高了团队的效率

而对于loose coupling(松耦合),以鄙人之见,它现在几乎已经与interface design等价了,很多项目中,loose coupling就是interface design,虽然向Spring等模块提供了IOC(Inverse of Control)等更高端的方法,但这些还是基于面向接口编程的。

当然,我们也应该充分意识到,面向接口应当适度使用,也为很多情况下,接口的实现是定死的,比如说,如果电梯只有一种(SenElevator),那么,就不需要再写一个IElevator接口了,否则显得更累赘。记得当年Discuz! .Net版刚开源的时候,有些技术帖就抱怨,代码中有太多无用的接口实现。康盛这样做可能是内部规范使然,我没有读完代码,没有发言权,但我个人觉得,“为了接口而写接口”的做法是愚蠢的。

posted on 2012-10-23 21:55  yin@buaa  阅读(283)  评论(0编辑  收藏  举报