什么是Parnas原则

《编程导论(Java)·3.1.3 接口与实现分离》

Parnas原则被称为接口与实现的分离(separation of interface and implementation)。

一.节选【p100-】:

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 行为和实现的分离

为此,

  • yqj2065在介绍Parnas的图片中特意地加上了这样的话:“他于1972年所提出的Parnas原则 或 接口与实现的分离(separation of interface and implementation)是软件工程中最重要的原则,没有之一。Parnas原则奠定了面向对象软件开发的基石。”
  • 在上学期讲授C语言时,在介绍函数时,讲解了Parnas原则(接口与实现分离)。

Parnas原则不强制源代码必须是黑箱。例如,JDK的用户可以查看JDK的所有类的源代码(对于学习编程很有帮助)。但通常在使用String时,需要查看的是JDKDoc而非源代码。因为接口和实现是分离的。Parnas原则说明,用户程序员可以/也应该 对方法的实现将“视而不见”。注意:理解Parnas原则(接口与实现分离)时,不要牵扯知识产权或代码的保护问题

按照Parnas原则,或接口和实现分离后,只要接口保持不变,方法的开发者能够修改其实现而不必担心这一修改会对客户程序造成什么影响。例如系统早期开发阶段为了简化开发给出一个直截了当的(蛮力法)实现,在开发后期更改为更快的算法重新实现时,客户程序不需要任何变化。(注意:讨论Parnas原则时,不要牵扯OCP/开放封闭原理)

Parnas原则是软件工程中最重要的原则,之所以将它作为面向对象的三大原则,是因为”该原则在对象技术中的一系列的推广和应用,Parnas原则是功能抽象的核心,也是数据抽象、封装的底层依据“。

什么是Parnas原则

时间: 2024-12-20 20:30:46

什么是Parnas原则的相关文章

如何学习设计模式

GoF的[设计模式]是经典著作,有人看了好多遍仍然说没有看懂,许多人看懂了一些模式但不知道如何应用--这里,yqj2065抛砖引玉,讨论一下如何学习设计模式. ①    学习技巧 学习设计模式时,有一些技巧能够帮助你快速理解设计模式. a)        使用较简单的面向对象的语言如Java.C#.GoF的[设计模式]实质上是面向对象的设计模式.[GoF·1.1]中提到"程序设计语言的选择非常重要,它将影响人们理解问题的出发点".从学习设计模式的角度看,Java和C#较C++更容易一些

《编程导论(Java)》格言录

★的后面重要言论/建议/格言-- ★计算机软件开发的核心有二:程序的组织(面向对象技术).问题求解(算法). ★柏拉图法则:类的世界独立存在,对象世界由类创建而来. ★面向对象技术通过颠倒的理念世界而模拟唯物的真实世界. ★我服务故我在. ★Learning by doing. ★计算就是模拟--艾伦·凯(Alan Curtis Kay) ★程序必须是写给人读的,仅仅偶尔让机器执行--Abelson andSussman[1] ★Any fool can write codethat a com

《编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)》

<编程导论(Java)>将Plato法则.Liskov原则和Parnas原则作为面向对象编程范式的三大基石. 面向对象范式的第一原则,yqj2065称之为柏拉图法则,它是对象技术的观念范式和心理范式的根源,对象技术是通过颠倒的理念世界而模拟唯物的真实世界. ★柏拉图法则:类的世界独立存在,对象世界由类创建而来. 虽然有人认为,这一原则非常自然,没有必要提出和强调,但是,我发现,对这一原则的理解和接纳程度,决定了你对面向对象的领悟程度. 提出的依据: 1.对象(object)是一个具有浓郁的哲学

《编程导论(Java)&#183;4.1数据抽象的含义》

You have no choice about the necessity to integrateyour observations, your experiences, your knowledge into abstractideas, i.e., into principles. --Ayn Rand, <Philosophy: Who Needs It> 1974 数据抽象(Data abstraction)是将数据类型的抽象特征与其实现的具体细节清晰地分离.其中数据类型的&quo

《编程导论(Java)&#183;1.4.1 范式》

这个楼主,是我的学生么?2013年写的! 嗯,"编程范式也许是学习任何一门编程语言时要理解的最重要的术语".这句话早在2005年出版<Java程序设计>(宋中山,严千钧编著,清华大学出版社)中写过.但是, "托马斯.库恩提出"科学的革命"的范式论之后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP为例:.....",好像在<编程导论(Java)>出版之前,仅仅在

2014-2015-2试题

2014-2015-2信息系统分析与设计(面向对象设计)开卷考试试题. 自我感觉考试不及格的同学,建议买块豆腐自己撞死好了. A卷 : 一.论述题:依赖注入模式 1.何为依赖注入模式(4分) 2.使用Java代码介绍依赖注入的三种方式(6分) 3介绍注入工具或框架,使用配置文件的优缺点(10分). 二.论述题:Parnas原则是软件工程中最重要的原则 1.什么是Parnas原则,什么是定义良好的接口(5分) 2.从Java接口与其实现,阐述Parnas原则的推广(10分) 3.什么是信息隐藏(5

《编程导论(Java)&amp;#183;1.4.1 范式》

这个楼主,是我的学生么?2013年写的! 嗯."编程范式或许是学习不论什么一门编程语言时要理解的最重要的术语".这句话早在2005年出版<Java程序设计>(宋中山,严千钧编著,清华大学出版社)中写过. 可是, "托马斯.库恩提出"科学的革命"的范式论之后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包含三个方面,以OOP为例:.....",好像在<编程导论(Java)>出版之前.

Scheme 4 Javaer-2.功能抽象

<编程导论(Java)?第3章功能抽象>按照功能抽象的逻辑发展,介绍在Java语言环境中的三种流程.子程序和结构化分解.接口与实现相分离以及抽象方法--功能抽象的最高形式.而把操作/表达式是Java编程中最原始和起步级别的功能抽象. SICP中,作为函数式编程语言的Scheme,它以表达式为基本单元,其功能抽象/函数抽象更为直接:按照丘奇的λ演算,完成对函数抽象的基本描述: W是参数为变量x的λ表达式,则λx . W是λ表达式,如λx.( x+1).这种表达式λx . W给出了一个函数的定义:

《编程导论(Java)&amp;#183;4.1数据抽象的含义》

You have no choice about the necessity to integrateyour observations, your experiences, your knowledge into abstractideas, i.e., into principles. --Ayn Rand, <Philosophy: Who Needs It> 1974 数据抽象(Data abstraction)是将数据类型的抽象特征与事实上现的详细细节清晰地分离. 当中数据类型的&q