在这一阶段,必须拿出一套设计方案,并解释其中包含的各类对象在外观上是什么样子,以及相互间是如何 沟通的。此时可考虑采用一种特殊的图表工具:“统一建模语言”(UML)。请到http://www.rational.com 去下载一份 UML规格书。作为第1 阶段中的描述工具,UML也是很有帮助的。此外,还可用它在第2 阶段中 处理一些图表(如流程图)。当然并非一定要使用 UML,但它对你会很有帮助,特别是在希望描绘一张详尽 的图表,让许多人在一起研究的时候。除 UML 外,还可选择对对象以及它们的接口进行文字化描述(就象我 在《Thinking in C++》里说的那样,但这种方法非常原始,发挥的作用亦较有限。 我曾有一次非常成功的咨询经历,那时涉及到一小组人的初始设计。他们以前还没有构建过 OOP(面向对象 程序设计)项目,将对象画在白板上面。我们谈到各对象相互间该如何沟通(通信),并删除了其中的一部 分,以及替换了另一部分对象。这个小组(他们知道这个项目的目的是什么)实际上已经制订出了设计方 案;他们自己“拥有”了设计,而不是让设计自然而然地显露出来。我在那里做的事情就是对设计进行指 导,提出一些适当的问题,尝试作出一些假设,并从小组中得到反馈,以便修改那些假设。这个过程中最美 妙的事情就是整个小组并不是通过学习一些抽象的例子来进行面向对象的设计,而是通过实践一个真正的设 计来掌握OOP的窍门,而那个设计正是他们当时手上的工作! 作出了对对象以及它们的接口的说明后,就完成了第 2 阶段的工作。当然,这些工作可能并不完全。有些工 作可能要等到进入阶段 3才能得知。但这已经足够了。我们真正需要关心的是最终找出所有的对象。能早些 发现当然好,但OOP提供了足够完美的结构,以后再找出它们也不迟。
1 package Com.TomTest; 2 3 4 class NopositiveException extends Exception{ 5 String message; 6 NopositiveException(int m,int n) { 7 message="数字"+m+"或"+n+"不是正整数"; 8 } 9 public String toString(){ 10 return message; 11 } 12 } 13 class Computer { 14 public int getMaxCommonDivisor(int m,int n) throws NopositiveException { 15 if(n<=0||m<=0) { 16 NopositiveException exception=new NopositiveException(m,n); 17 throw exception; 18 } 19 if(m<n) { 20 int temp=0; 21 temp=m; 22 m=n; 23 n=temp; 24 } 25 int r=m%n; 26 while(r!=0) { 27 m=n; 28 n=r; 29 r=m%n; 30 } 31 return n; 32 } 33 } 34 public class TomTest_39 { 35 public static void main(String args[]){ 36 int m=24,n=36,result=0; 37 Computer a=new Computer(); 38 try{ 39 result=a.getMaxCommonDivisor(m,n); 40 System.out.println(m+"和"+n+"的最大公约数 "+result); 41 m=-12; 42 n=22; 43 result=a.getMaxCommonDivisor(m,n); 44 System.out.println(m+"和"+n+"的最大公约数 "+result); 45 }catch(NopositiveException e) { 46 System.out.println(e.toString()); 47 } 48 } 49 }