什么是Parnas原则
来源:互联网 发布:张民弢 知乎 编辑:程序博客网 时间:2024/06/15 22:21
《编程导论(Java)·3.1.3 接口与实现分离》Parnas原则被称为接口与实现的分离(separation of interface and implementation)。
Parnas原则是软件工程中最重要的原则,之所以将它作为面向对象的三大原则,是因为“该原则在对象技术中的一系列的推广和应用,Parnas原则是功能抽象的核心,也是数据抽象、封装的底层依据”。
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指出:(模块的)接口基本上由子程序的名称和参数的名称与类型组成。模块开发应该遵循下面的原则:
² 模块开发者必须获得完成该模块所承担职责需要的所有信息,除此之外,无需获得其他任何信息。
² 模块开发者必须向目标用户提供正确使用模块所需要的所有信息,除此之外,无需提供其他任何信息。
前一条说明接口的使用者应该遵循的原则——开发一个模块时,仅仅需要知道其他模块的接口;后一条说明接口的开发者应该遵循的原则——给用户提供接口。假定某个程序员编写了方法foo(),一般的,使用了foo()的程序员称为foo()的用户(user)或用户程序员,而调用了foo()的程序称为客户(clinet)或客户程序。
- 站在客户程序的角度,接口指方法的签名和返回值类型;而站在用户程序员的角度,接口(interface)是使用该方法的用户所需要知道的所有信息,包括方法头(方法原型)和非常重要的说明文档。
- 而实现(implementation)是指完成该接口之功能承诺的代码块,即方法体。此时,子程序被用户作为抽象工具,仅需要了解其接口。
- Parnas原则被称为接口与实现的分离(separation of interface and implementation)。
★用户仅需要了解接口——Parnas原则。
3. 数据抽象
4.类的接口
吐槽
在我国的编程教学中,居然很少看见有人讨论/介绍Parnas原则(接口与实现分离),真的令人惊讶。在CC2001(参考本书附录B 表B-3)中赫然列出:
PL6. Object-oriented programming面向对象编程之
Separation of behavior and implementation 行为和实现的分离
为此,
- yqj2065在介绍Parnas的图片中特意地加上了这样的话:“他于1972年所提出的Parnas原则 或 接口与实现的分离(separation of interface and implementation)是软件工程中最重要的原则,没有之一。Parnas原则奠定了面向对象软件开发的基石。”
- 在上学期讲授C语言,介绍函数时,讲解了Parnas原则(接口与实现分离)。
Parnas原则不强制源代码必须是黑箱。例如,JDK的用户可以查看JDK的所有类的源代码(对于学习编程很有帮助)。但通常在使用String时,需要查看的是JDKDoc而非源代码。因为接口和实现是分离的。Parnas原则说明,用户程序员可以/也应该 对方法的实现将“视而不见”。注意:理解Parnas原则(接口与实现分离)时,不要牵扯知识产权或代码的保护问题。
按照Parnas原则,或接口和实现分离后,只要接口保持不变,方法的开发者能够修改其实现而不必担心这一修改会对客户程序造成什么影响。例如系统早期开发阶段为了简化开发给出一个直截了当的(蛮力法)实现,在开发后期更改为更快的算法重新实现时,客户程序不需要任何变化。(注意:讨论Parnas原则时,不要牵扯OCP/开放封闭原理)
- 什么是Parnas原则
- 什么是SMART原则
- 什么是开闭原则
- 什么是开闭原则
- 什么是好莱坞原则
- 什么是双眼皮修复原则
- 什么是软件设计(OCP)原则
- 什么是单一原则?
- 什么是开闭原则
- 什么是SMART原则?
- 什么是 里氏代换原则?
- 切实反思“形式化方法”-David Lorge Parnas
- 什么是接口,实现接口时有几个原则?
- 什么是“移动先行”原则,如何践行?
- 什么是低耦合和高聚合?封装原则又是什么意思?
- 什么是面向对象设计的六大原则—详解
- 谈谈到底什么是抽象,以及软件设计的抽象原则
- 原则
- VTune利用amplxe-cl进行Hardware Event-based Sampling Analysis 0分析
- 手机卫士功能点之---广播事件和engine包
- JDBC连接池的简单实现
- BOOST VS2010编译安装
- 学习uC/OS的一些心得
- 什么是Parnas原则
- WebDriver + Python 调用AutoIt例子(实现139邮箱写信页的附件上传)
- lame移植步骤
- OCP 1Z0 053 53
- xml操作之Cmarkup
- 802.11n 协议浅析
- Java中介者设计模式
- 2-4. BCD解密(10)
- HDU 题目1236 排名