第5章 集合、常数和运行时类型信息编程.pdfVIP

  • 3
  • 0
  • 约3.76万字
  • 约 22页
  • 2017-06-13 发布于湖北
  • 举报

第5章 集合、常数和运行时类型信息编程.pdf

第 5 章 集合、常数与运行时类型信息编程 定义好的抽象,可以解决许多编程方面的障碍。在面向对象语言中,所谓的抽象就是“创建类”。在 某种程度上确实如此。许多项目的失败就是因为创建的类太少,结果形成了一些庞大的类,它们做的事情 太多,因而难于维护。 好的抽象也可以在较低层次上定义。像 Delphi 这样的强类型化编译器、定义在问题域中有具体意义的 类型等,都可能是有帮助的。一般的,进行较为精确的类型定义,通常可以更好地定义类的属性。大多数 属性的特征可以通过整数和数组进行表达,但相比而言,由内建类型派生而来的集合、范围、常数、数组 以及枚举等更有意义。 Object Pascal 是一种具有很强的表达能力的面向对象编程语言,它有助于定义在特定问题域的上下文 中具有意义的类型。例如,如果只有某个特定范围内的值有意义,就定义范围、集合或枚举类型来命名这 些值所代表的数据。本章示范了如何使用 Object Pascal 中的这些概念,以有助于定义好的抽象。这些技术 可以使您的代码具有更强的可读性,而且比使用内建数据类型所需的错误检查代码要少。 5.1 不可变常数 常数很好用。常数是现存的最为可靠的代码之一。定义常数之后,无论如何其值都是可以依赖的。不 用担心,不存在偶然或有意的误用。在 Delphi 中有许多方法来使用常数,以使得代码更加可靠。 注意:Delphi支持类型化常数,它们的值是可变的。关于可赋值的常数,更多的信息请参见 5.1.3节“使用 const创建静态本地变量”。 5.1.1 全局与本地常数 当变量定义在本地作用域中时,可以访问该作用域的代码均可使用该变量。临时使用全局或本地变量 可能导致有害的问题,特别是对于多线程应用程序,其中一个线程可能依赖于某个值,而另外一个线程正 在改变该值。如果一个值需要保持不变,则应该用 const 来表示。全局常数是定义在单元的接口部分的常 数。而本地常数是定义在实现部分的常数。 另外,可能会在许多地方重用的值应该定义为常数。假定 Pi 的值在您的整个程序中都是有意义的,则 应在接口部分将名字 Pi 作为常数引入,并将其值初始化为具有正确的有效数字位数的 Pi 值,以满足您的 需要。 注意:新的单元 ConvUtils.pas包含有数以百计的常数和转换单元。尽管它包含了秒差距与 米的转换常数值,但并未包含 Pi 的常数值。System.pas 单元中包含了函数 Pi,返回 Pi 值 的 extended类型的浮点值。 我们的目标是在尽可能狭窄的作用域中定义常数。如果一个常数只在过程块中需要,那么该过程就是 合适的作用域。使作用域变窄背后的思想在于,要尽量减少使用代码的程序员在理解代码目的时所需要进 行思考的事物的数目。常数的语法部分依赖于其所定义的上下文。本地、全局、过程常数的通常形式如下: const name = value; 或, const name : type = value; const 是关键字,表示其后是常数。对于一个常数列表中的所有常数,仅需要键入 const 一次。例如, 在实现部分定义三个常数,如下所示。 第 5 章 集合、常数与运行时类型信息编程 108 implementation const I : Integer = 3; S = Bachman Turner Overdrive; F : Double = 4000000000000.0; 有许多途径来使用常数,可以使得程序更加可靠。对于常数的所有变体的语法规则,请察看上下文帮 助,在索引中查找 grammar 。更多的例子见下文。 5.1.2 常数参数 当过程不应改变某个参数的值时,应把该参数声明为常数参数。如果包括了 const 限定符,可以保证 该值不被改变。保证总是难于得到,因此能够得到保证确实不错。常数参数可以有默认值。下面的代码演 示了具有默认值的常数参数。 procedure DisplayBandName( const Value : String = R.E.O. ); begin ShowMessage( Value ); end; Procedure So

文档评论(0)

1亿VIP精品文档

相关文档