【程序设计实践】第4章 界面

来源:互联网 发布:红海军知乎 编辑:程序博客网 时间:2024/06/13 07:22
4章 界面

设计的真谛,就是在一些相互冲突的需求和约束条件之间寻找平衡点。

在进行设计的时候,必须考虑的问题包括:

界面:应提供哪些服务和访问?界面在效能上实际成为服务的提供者和使用者之间的一个约定。在这里要做的是提供一种统一而方便的服务,使用方便,有足够丰富的功能,而又不过多过滥以至无法控制。

信息隐藏:哪些信息应该是可见的,哪些应该是私有的?一个界面必须提供对有关部件的方便访问方式,而同时又隐蔽其实现的细节。这样,部件的修改才不会影响到使用者。

资源管理:谁负责管理内存或者其他有限的资源?这里的主要问题是存储的分配和释放,以及管理共享信息的拷贝等。

错误处理:谁检查错误?谁报告?如何报告?如果检查中发现了错误,那么应该设法做哪些恢复性操作?

逗号分隔的值

逗号分隔的值(comma-separated value),或CSV,是个术语,指的是一种用于表示表格数据的自然形式,使用很广泛。这里表格的每行是个正文行,行中不同的数据域由逗号分隔。

在下面几节里,我们要写出这个库的三个版本,其功能是读CSV数据,将它转换为内部表示。

一个原型库

为别人用的库

要建立一个其他人能用的界面,我们必须考虑在本章开始处列出的那些问题:界面、信息隐藏、资源管理和错误处理。它们的相互作用对设计有极强的影响。我们把这些问题分割开是有点太随意了,实际上它们是密切相关的。

新库的大小超过第一个原型的四倍,而且包含一些很复杂的代码。在从原型转换到产品时,程序在大小和复杂性方面有所扩张是很典型的情况。

C++实现

界面原则

一个界面要想成功,它就必须特别适合有关的工作—必须简单、通用、规范、其行为可以预料及坚固等等,它还必须能很好地适应用户或者实现方式的变化。好的界面总是遵循着一组原则,这些原则不是互相独立的,互相之间甚至可能并不很协调,但它们能帮助我们刻画那些位于界限两边的两部分软件之间的问题。

1) 隐藏实现细节。对于程序的其他部分而言,界面后面的实现应该是隐藏的,这样才能使它的修改不影响或破坏别的东西。人们用了许多术语来描述这种组织原则:信息隐蔽、封装、抽象和模块化,它们谈论的都是类似的思想。一个界面应该隐藏那些与界面的客户或者用户无关的实现细节。这些看不到的细节可以在不影响客户的情况下做修改。

避免使用全局变量,最好将所有需要引用的数据通过函数参数传递给参数,强烈反对任何形式的公有可见数据。

2) 选择一小组正交的基本操作。一个界面应该提供外界所需要的全部功能,但是绝不要更多;函数在功能方面不应该有过度的重叠。虽然提供大量函数可能使库变得更容易使用,你需要什么就有什么。但是大的界面既难写又难维护,太大的规模也使它难以学习、难以被用好。一般说来,窄的界面比宽的界面更受欢迎,在给界面增加新功能前,应该做一件事并且把它做好。

3) 不要在用户背后做小动作,修改变量、改变全局性数据

4) 在各处都用同样方式做同样的事。一致性和规范性是非常重要的。相关的事物应该具有相关的意义。

资源管理

释放资源与分配资源应该在同一个层次进行。控制资源分配和回收有一种基本方式,那就是令完成资源分配的同一个库、程序包或界面也负责完成它的释放工作。这种处理原则的另一种说法是:资源的分配状态在跨过界面时不应该改变。例如,我们的CSV库从一个已经打开的文件读数据,那么它在完成工作时还应该使文件保持在打开状态,由库的调用程序关闭文件。

垃圾收集有很多不同的技术:引用技术+按痕迹追踪分配池到所有被引用的对象

终止、重试或失败

在低层检查错误,在高层处理它们。作为一条具有普遍意义的规则,错误应该在尽可能低的层次上检测和发现,但应该在某个高一些的层次上处理。一般情况下,应该由调用程序决定对错误的处理方式,而不该由被调用程序决定。库函数应该以某种得体的失败方式在这方面起作用。

只把异常用在异常的情况。有些语言提供了异常机制,以帮助捕捉不正常状态并设法做恢复,这种机制实际上是提供了在某些坏事情发生时的另一条控制流。异常机制不应该用于处理可预期的返回值。

用户界面

程序在使用方式错误时,应该显示有关正确方式的信息。输出要帮助用户发现问题,或者告诉他们如何提供合法的输入。


原创粉丝点击