《编程导论(Java)·3.1.3 接口与实现分离》
Parnas原则被称为接口与实现的分离(separation of interface and implementation)。
1. Brooks Vs. David Parnas
在大规模编程中,如何组织大型团队中多个程序员同时开发、特别是如何对待其他程序员的代码,FrederickP. Brooks Jr在《人月神话》中介绍了他当时(1964年前后)的做法:他决定“所有的程序员应该了解所有的材料”,因为“把所有工作都暴露在每个人的凝视之下,能够帮助质量控制,这既源于其他人优秀工作的压力,也由于同伴能直接发现缺陷和bug”。这样一来,每个项目成员都拥有一份大约10,000 页的项目工作手册的拷贝。面对庞大的IBM OS/360软件项目,Brooks认为独立的程序员们不能够有效的并行工作,Brooks说:无法让9个妇女在一个月内生产一个婴儿,为了概念的完整性,人手和时间可替换的想法仅仅是神话。
现代计算机科学和软件工程的奠基者之一David Parnas则认为同步开发是可行的!唯一的前提是将子程序/方法视为抽象的工具(abstract tools),或Parnas所称的模块。用户在使用该工具时,并不需要知道它的内部实现。
日常生活中人们习惯于使用抽象工具。例如用户使用电视机时,不需要理解电视机的内部结构如阴极射线管、控制电路;唯一需要学习的是阅读产品说明书、了解电视机上的各种按钮和背后的各种插线孔,以及遥控器的各种操作。这些是电视机的用户需要知道的界面或接口。
2. Parnas原则
Parnas指出:(模块的)接口基本上由子程序的名称和参数的名称与类型组成。
模块开发应该遵循Parnas原则:
2 模块开发者必须获得完成该模块所承担职责需要的所有信息,除此之外,无需获得其他任何信息。
2 模块开发者必须向目标用户提供正确使用模块所需要的所有信息,除此之外,无需提供其他任何信息。
前一条说明接口的使用者应该遵循的原则——开发一个模块时,仅仅需要知道其他模块的接口;后一条说明接口的开发者应该遵循的原则——给用户提供接口。假定某个程序员编写了方法foo(),一般的,使用了foo()的程序员称为foo()的用户(user)或用户程序员,而调用了foo()的程序称为客户(clinet)或客户程序。
站在客户程序的角度,接口指方法的签名和返回值类型;而站在用户程序员的角度,接口(interface)是使用该方法的用户所需要知道的所有信息,包括方法头(方法原型)和非常重要的说明文档。而实现(implementation)是指完成该接口之功能承诺的代码块,即方法体。此时,子程序被用户作为抽象工具,仅需要了解其接口。Parnas原则被称为接口与实现的分离(separation of interface and implementation)。
★用户仅需要了解接口——Parnas原则。
在我国的编程教学中,很少有人讨论/介绍Parnas原则(接口与实现分离),真的令人惊讶。在CC2001(参考本书附录B 表B-3)中赫然列出:
PL6. Object-oriented programming面向对象编程之
Separation of behavior and implementation 行为和实现的分离
为此,
Parnas原则不强制源代码必须是黑箱。例如,JDK的用户可以查看JDK的所有类的源代码(对于学习编程很有帮助)。但通常在使用String时,需要查看的是JDKDoc而非源代码。因为接口和实现是分离的。Parnas原则说明,用户程序员可以/也应该 对方法的实现将“视而不见”。注意:理解Parnas原则(接口与实现分离)时,不要牵扯知识产权或代码的保护问题。
按照Parnas原则,或接口和实现分离后,只要接口保持不变,方法的开发者能够修改其实现而不必担心这一修改会对客户程序造成什么影响。例如系统早期开发阶段为了简化开发给出一个直截了当的(蛮力法)实现,在开发后期更改为更快的算法重新实现时,客户程序不需要任何变化。(注意:讨论Parnas原则时,不要牵扯OCP/开放封闭原理)
Parnas原则是软件工程中最重要的原则,之所以将它作为面向对象的三大原则,是因为”该原则在对象技术中的一系列的推广和应用,Parnas原则是功能抽象的核心,也是数据抽象、封装的底层依据“。
原文地址:http://blog.csdn.net/yqj2065/article/details/36478517