
在一个面向对象的系统中,系统功能通过众多不同对象协作完成。这些对象内部实现细节对设计人员不重要,关键在于它们之间的协作方式。这包括类与类之间的通信以及模块间的交互,这些都需要在系统设计初期考虑,也是设计的核心工作。
面向接口编程即按此理念编程。在日常工作中,你可能已经在按照接口编程,但如果没有这种意识,那只是被动实现这一思想。比如,抱怨代码改动影响接口,或模块改动导致其他模块大规模调整等。
Booch提到的Interaction Designer,是更高层次的设计者。目前,这类人才是我们软件设计团队中最缺乏的。
从深层次理解接口,它是定义与实现的分离。通常实现系统时,定义与实现是一体的,但为了更好地规范系统,所有定义与实现应分离,尽管这可能增加复杂性。
接口反映系统设计人员对系统的抽象理解。接口分为两类:个体抽象对应抽象体,个体某方面抽象对应抽象面。一个体可能有多个抽象面,抽象体与抽象面有区别。
接口设计还需考虑环境因素。任何接口都是在特定环境中产生的,环境定义及变化对接口影响不可忽视,脱离原有环境,接口失去意义。
组件开发模型(3C)强调接口设计的重要性,它们相互依存,缺一不可。面向对象以对象为单位考虑属性及方法,面向过程则以具体流程考虑实现。接口设计与非接口设计针对复用技术,与面向对象不是同一概念。
UML中的interface是协议的另一种说法,而不是特定技术的接口。面向接口编程即面向抽象协议编程,实现时严格按协议。这正如Bill Joy所说,一边翻rfc,一边写代码。
面向对象编程涉及抽象和具象,二者是矛盾统一体,不可能只有抽象。懂得抽象的人明白此理,但有些人只知具象而忽视抽象。因此,仅有接口无实现或仅有实现无接口都是反面向对象编程的。