信息隐蔽是程序定义抽象设施的设计的中心原则 每个程序部件应尽可能对用户隐藏信息。 ·当信息被封装在抽象中时,意味着抽象的用户 为了使用该抽象,不需要知道隐蔽的信息 2、不允许直接使用或操纵被隐蔽的信息,即使用户希望 这么做。 例如: Fortran、 Pascal中的整数类型不仅隐蔽了整数的表 示细节,甚至有效地封装了表示,使得程序员不能操作整 数中的个体位。 但它们难于封装新数据类型的表示,虽然也可以构造子程 序集合来创建和操作抽象,但不能真正封装其表示,程序 员可以编写其他子程序来非法地或不合适地操作抽象。 封裝对使程序易于修改特別有用,只要保持子程序(操作) 接口不变即可。 °注意:信息隐蔽是一个程序设计问题,和语言无关。封装则 是语言设计问题。抽象被有效封装的前提是有机制防止外界 对抽象中隐蔽信息的访问
•信息隐蔽是程序定义抽象设施的设计的中心原则 ——每个程序部件应尽可能对用户隐藏信息。 •当信息被封装在抽象中时,意味着抽象的用户: 1、为了使用该抽象,不需要知道隐蔽的信息。 2、不允许直接使用或操纵被隐蔽的信息,即使用户希望 这么做。 例如:Fortran、Pascal中的整数类型不仅隐蔽了整数的表 示细节,甚至有效地封装了表示,使得程序员不能操作整 数中的个体位。 但它们难于封装新数据类型的表示,虽然也可以构造子程 序集合来创建和操作抽象,但不能真正封装其表示,程序 员可以编写其他子程序来非法地或不合适地操作抽象。 •封装对使程序易于修改特别有用,只要保持子程序(操作) 接口不变即可。 •注意:信息隐蔽是一个程序设计问题,和语言无关。封装则 是语言设计问题。抽象被有效封装的前提是有机制防止外界 对抽象中隐蔽信息的访问
52通过子程序封装 子程序是程序员定义的抽象操作—是大多数程序的基本建 筑块。对子程序可从两个方面来看: 在程序设计级——子程序表示程序员定义的抽象操作。 在语言设计级—涉及子程序设施的设计和实现。 子程序作为抽象操作 子程序的规约和实现均由程序员提供, 子程序的规约 包括: 1、子程序的名字 2、子程序的基调 3、子程序的动作 和基本原操作类似
5.2 通过子程序封装 子程序是程序员定义的抽象操作——是大多数程序的基本建 筑块。对子程序可从两个方面来看: 在程序设计级——子程序表示程序员定义的抽象操作。 在语言设计级——涉及子程序设施的设计和实现。 子程序作为抽象操作 子程序的规约和实现均由程序员提供。 •子程序的规约 包括: 1、子程序的名字 2、子程序的基调 3、子程序的动作 和基本原操作类似
函数子程序—显示地返回单个结果数据对象。 基调为:FN:rea× Integer→real 过程式子例程—返回多个结果,或修改参数而不是显式地返 回结果。如:C语言中: void Sub(float X, int Y, float*Z, int *W) 无显式返回,*表示指针,可以被修改的参数。 AdaH: procedure Sub(X: in REAL; Y: in integer Z: inout REAL; w: out Boolean) 其基调为:Sub:real× integer X real2-real3× Boolean in和ou指出参数的性质。 当子程序表示数学函数,如何精确地描述其功能有如下问题: 、子程序可能有隐式参数(以非局部变量形式) 2、子程序可能有隐式结果(副作用)(对非局部变量和in- ou参数) 3、可能对某些可能的参数没有定义。 4、子程序是历史敏感的
函数子程序——显示地返回单个结果数据对象。 基调为:FN:real×integer→real 过程式子例程——返回多个结果,或修改参数而不是显式地返 回结果。如:C语言中: void Sub(float X, int Y, float * Z, int *W); 无显式返回, *表示指针,可以被修改的参数。 Ada中:procedure Sub (X: in REAL; Y: in integer; Z: inout REAL; W: out Boolean) 其基调为:Sub: real1×integer×real2→real3×Boolean in和out指出参数的性质。 当子程序表示数学函数,如何精确地描述其功能有如下问题: 1、子程序可能有隐式参数(以非局部变量形式) 2、子程序可能有隐式结果(副作用)(对非局部变量和inout参数) 3、可能对某些可能的参数没有定义。 4、子程序是历史敏感的
子程序的实现 一个子程序表示了由程序员构造的虚拟机层次上的一个操 作。这样,子程序用程序语言本身提供的数据结构和操作 来实现 子程序的实现用子程序体定义。包括: 局部数据声明——定义局部结构或数据 句——定义动作 封装保证:局部数据和语句不可被用户单独访问,只 能通过传入参数而调用子程序 有些语言中,Body中也允许其他子程序的定义。 子程序调用需要合适类型的参数,因此,类型检查也是需 要的。类型检查和基本操作类似处理
•子程序的实现 一个子程序表示了由程序员构造的虚拟机层次上的一个操 作。这样,子程序用程序语言本身提供的数据结构和操作 来实现。 子程序的实现用子程序体定义。包括: 局部数据声明——定义局部结构或数据; 语句——定义动作。 封装保证:局部数据和语句不可被用户单独访问,只 能通过传入参数而调用子程序。 有些语言中,Body中也允许其他子程序的定义。 子程序调用需要合适类型的参数,因此,类型检查也是需 要的。类型检查和基本操作类似处理
子程序定义和调用 ·子程序定义和子程序激活 子程序定义描述程序的静态性质,在执行中,如子程序 被调用,则子程序的一个激活被创建,当子程序执行结 果,则激活被消除,因此,定义作为创建执行过程中激 活的模板。 定义和激活的不同是重要的。 定义是程序的语法成分,其信息只是在翻译时所用信息 (如变量类型,但其左、右值并不知道) 激活在执行时存在(可访问左值、执行右值,但类型不 再可用,除非描述子)
子程序定义和调用 •子程序定义和子程序激活 子程序定义描述程序的静态性质,在执行中,如子程序 被调用,则子程序的一个激活被创建,当子程序执行结 果,则激活被消除,因此,定义作为创建执行过程中激 活的模板。 •定义和激活的不同是重要的。 定义是程序的语法成分,其信息只是在翻译时所用信息 (如变量类型,但其左、右值并不知道)。 激活在执行时存在(可访问左值、执行右值,但类型不 再可用,除非描述子)