如果你想要制作易于设计、构建、测试及扩展的系统,正交性是一个十分关键的概念,但是,正交性的概念很少被直接讲授,而常常是你学习的各种其他方法和技术的隐含特性。这是一个错误。一旦你学会了直接应用正交性原则,你将发现,你制作的系统的质量立刻就得到了提高。
什么是正交性:
“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的,比如图中的坐标轴。用向量术语说,这两条直线互不依赖。沿着某一条直线移动,你投影到另一条直线上的位置不变。
在计算技术中,该术语用于表示某种不相依赖性或是解耦性。如果两个或更多事物中的一个发生变化,不会影响其他事物,这些事物就是正交的。在设计良好的系统中,数据库代码与用户界面是正交的:你可以改动界面,而不影响数据库;更换数据库,而不用改动界面。
习题:
(1). 你在编写一个叫做Split的类,其用途是把输入行拆分为字段。下面的两个Java类的型构(signature)中,哪一个是更为正交的设计?
- class Split1 {
- public Split1(InputStreamReader rdr) { ...
- public void readNextLine() throws IOException { ...
- public int numFields() { ...
- public String getField(int fieldNo) { ...
- }
- class Split2 {
- public Split2(String line) { ...
- public int numFields() { ...
- public String getField(int fieldNo) { ...
- }
答:我们的看法是,Split2更为正交。它专注于自己的任务,拆分输入行,同时忽略输入行来在何处这样的细节。这不仅是代码更易于开发,也使得代码更灵活。Split2拆分的行可以来自文件、可以由另外的例程生成、也可以通过环境传入。
(2). 非模态对话框或模态对话框,哪一个能带来更为正交的设计?
答:如果设计正确,很可能是非模态对话框。使用非模态对话框的系统与任一特定时刻正在发生的事情的关联较少。它很可能会拥有比模态系统更好的模块间通信基础设施,模态系统对系统的状态可能会有内在的假定——导致耦合增加、正交性降低的假定。
(3). 过程语言与对象技术的情况又如何?哪一种能产生更为正交的系统?
答:这个问题有点棘手。对象技术可以提供更为正交的系统,但因为它有更多的特性可被滥用,使用对象技术实际上比使用过程语言更容易创建出非正交的系统。像多重继承、异常、操作符重载、父方法重定义(通过定义子类)这样的特性提供了通过不明显的途径增加耦合的充足机会。