- 作者:zhaozj
- 发表时间:2020-12-23 10:55
- 来源:未知
1. 英文版电子书下载: http://hnwhb.go.nease.net/Prentice Hall - UML for Java Programmers.rar 2. 完全翻译的中文版电子书下载 http://61.172.250.46/yang/private/blog/UML_for_Java_Programmers_cn.rar 相关网站(可惜,已经连不上了) http://uml4java.go.nease.net/ 3. 第一章 针对Java程序员的UML概述 1. UML(统一建模语言)的三个层次: 1. 概念层(Conceptual) 接近人类自然语言 有歧义 无严格的格式 2. 规格说明层(Specification)
3. 实现层(Implementation) 规格说明层和实现层接近代码、无歧义、有严格的格式
2. UML分三类: 1. 静态图(static diagrams) 描绘类、对象、数据结构以及存在于它们之间的逻辑关系。 2. 动态图(dynamic diagrams) 描绘运行期间,软件执行流程和软件实体状态改变的方式。 3. 物理图(physical diagrams) 描绘物理实体,如:源文件、库文件、字节文件、数据文件等,以及它们之间存在的逻辑关系。 3. 类图(静态图) 1. 长方形表示类,箭头表示关系。 2. 图中的所有关系叫关联(associatons),关联的命名对应引用的对象的变量名称。 4. 对象图(动态图) 可以看成是内存的一个快照,主要反应程序中的对象在运行期的信息。 1. 对象名称有下划线。冒号后面跟着对象类型的名称。 2. 对象之间的关系叫链接(links),链接的命名同样对应引用的对象的变量名称。 5. 序列图(动态图) 几个术语: 1. 监护(guards) 2. 构造(construction) 3. 数据标记(data token) 4. 活动(activation) 6. 协作图(动态图) 序列数的点结构 7. 协作图和序列图的异同点 同:它们包含的信息相同 异:协作图描述对象之间的关系,序列图描述消息被执行的前后顺序。 8. 状态图(动态图) 限定状态机(finate state machines) 图中的箭头被称为转换(transitions) 4. 第二章 使用图 1. 为何要制作模型? 制作模型的目的是为了证明模型是否可以正常工作。 一个模型必须有一个可用的检验标准。 2. 使用UML的时机: 1. 需要通过检验来确定某些东西是否可用的时候。 2. 使用UML来检验比用编码来检验更划算的时候。 3. 有效的使用UML 1. 使用UML在开发人员之间传达设计概念。 使用UML创建具体算法对应的图,并不方便。 UML对创建大型软件结构的“路线图”,比较有用。 通过UML图可以清楚的发现类与类之间的依赖关系和整个系统的结构。 2. 保留和舍弃 大多数的UML图都是短命的,应该舍弃的。只需记录在白板或白纸上。 但下列图应该保存下来: 1. 表现系统中一个通用设计的解决方案的UML图。 2. 记录了复杂的协议,难以通过代码了解的UML图。 3. 提供了较少涉及到系统范围内的“路线图”的UML图。 4. 比代码更易表述设计意图的UML图。 这些保存下来的UML图,应该经过多次迭代精化修改,最终版本应保存在团队都能访问的公共区域。 长期保存与临时创建的UML图应该分开存放。 3. 迭代精化 先研究动态场景,然后确定静态结构的内在含义。 对动态图(如:协作图)和静态图(如:类图)进行多次迭代并不断完善。 4. 最适合创建文档的时机: 团队完成了所有工作,项目即将结束的时候。 5. 使用Interface实现事件机制,避免了button对Dialler的依赖。 这样按下按键之后可以拨号,也可以做别的事。 6. 适配器 适配器也叫转接器,用于在一件或多件仪器的不同部件之间实现有效兼容性的装置。 适配器的作用:实现接口,转发消息。 7. 画UML图时应时刻想像着如何转化为代码。 8. UML图的目标并不是要如何正确,而是要讨论它的人都理解它,所以UML图应尽量简洁。 9. 什么时候画UML图: 1. 多人参与开发,且这些人需要理解一个系统的特定部分的设计结构时,开始画UML图。 所有人都声明已经理解了的时候,停止画UML图。 2. 两个或多人之间对某个设计点产生意见分歧,进行讨论时,需要画UML图。 讨论完毕,做出决定后,停止画UML图。 3. 思考一个设计时,画UML图会有所帮助。 思考成熟并完成相应的代码后,停止画UML图。 4. 向他人或自己解释一段代码的逻辑结构时,开始画UML图。 发觉看代码能理解的更清楚时,停止画UML图。 5. 当项目快要结束,客户需要UML图和文档时,开始画UML图。 10. 什么时候停止画UML图: 1. 画图并不是一个必经的过程。 2. 好的设计者只有在需要的时候才编码和画UML图。 3. 不要在编码之前的设计阶段,去为创建全面的文档而画UML图,这是浪费时间。 4. 不要为了其他人编码而去画图。 11. UML Case工具: 1. UML Case 工具的弊: 1. 正版价格贵 2. 需要学习周期 2. 自动绘制UML图的协作系统,应当在手动协作系统不够用的时候才去考虑它。 3. 项目中使用UML Case工具或集成于IDE的UML Case工具,应先进行效能实验,三思而后行。 12. 文档 必须建立文档,但必须谨慎地创建文档。 软件文档应该言简意赅 一个软件文档的价值通常与文档的大小成反比。 wiki是一个团队中协作编写文档的不错方法。 5. 第三章 类图 1. 类图描绘类本身的信息,以及类之间的关系。 2. 类使用正方形表示 "-"表示私有(private),"+"表示公有(public),"#"表示受保护(protected) Figure UML-5-2-1 Figure UML-5-2-1 对应的代码 public class Dialler { private Vector digits; int nDigits; public void digit(int n); protected boolean recordDigit(int n); }; 3. 关联 大多数情况下是表示对象实例持有着对其它对象的引用。 Figure UML-5-3-1 Figure UML-5-3-1 对应的代码 public class Phone { private Button itsButtons[15]; }; 4. 多重性 Figure UML-5-4-1 Figure UML-5-4-1 对应的代码 public class Phonebook { private Vector itsPnos; }; "*"表示数量非常多,所以PhoneBook的成员变量itsPnos的类型往往使用Vector、List或其它容器。 5. 继承 约定:为了便于区分,通常用垂直方向的箭头表示继承关系,用水平方向的箭头表示关联。 在UML中,继承箭头指在基类上。 Figure UML-5-5-1 Figure UML-5-5-1 对应的代码 public class Employee { ... }; public class SalariedEmployee extends Employee { ... }; 虚线继承箭头表示实现一个接口。 虚线继承箭头指向被实现的接口。 白板上画虚线耗时,可以马虎一下用实线代替。 Figure UML-5-5-2 Figure UML-5-5-2 对应的代码 interface ButtonListener { ... }; public class ButtonDiallerAdapter implements ButtonListener { ... }; 另外一种表示实现接口的方法: Figure UML-5-5-3 6. 在一个UML图中,同时展现所有的方法会引起混乱,所以,只提供一批有代表性的方法会使UML图更清晰。 7. 细节 细节和修饰符大多数时候并不需要,但是有时候它们是很有用的。 1. 类的构造型 类的构造型显示在一对双角括号之间,放在类的名称上访。 Java有两种标准的构造型: 1. interface interface的所有成员函数都是抽象的 2. utility(工具类) utility的所有成员变量和成员函数都是静态的。 类的构造型可以自己定义,但必须所有阅读UML图的人都明白其含义。 2. 抽象类、抽象方法 用斜体字或用{abstract}属性,表示一个抽象类或一个抽象方法。 Figure UML-5-7-2-1 Figure UML-5-7-2-1 对应的代码 public abstract class Shape { private Point itsAnchorPoint; public abstract void draw(); }; 3. 属性 1. 属性不是类的一部分,但可用来代表额外的信息。 属性可被自定义。 2. 属性的形式:用逗号分隔,由名称、值对组成的列表。 如:{author=Matin,date=20020429,file=shape.java,private} 3. 一个属性的默认值是true,所以{abstract}等价于{abstract=true} 4. 属性被写在类名称的下方。 5. 一个非正式的约定:在白板上{abstract}可以简写成{A} 6. 一般只使用{abstract}属性。 4. 聚合(Aggregation) 聚合是关联的一种特殊形式,表示一种整体/部分(whole/part)的关系。 为了防止混淆,应避免使用聚合 Figure UML-5-7-4-1 Figure UML-5-7-4-1 对应的代码 public class Whole { private Part itsPart; }; 5. 组合(Composition) 组合是一种特殊的聚合形式 组合用的极少 涉及到一个深度复制的问题。 Figure UML-5-7-5-1 Figure UML-5-7-5-1 对应的代码 public class Owner { private Ward itsWard; }; 6. 多重性(multipicity) 对象能够持有其它对象的数组或向量,或者说它们能够持有许多同一类型但不同实例的对象。 多重性的表达式: 数字 精确的数量,使用数组作为容器。 *或0..* 0个或0个到无数个,使用Vector作为容器 0..1 0个或1个,在Java中通常用一个空的引用来实现。 1..* 1个到无数个,使用Vector作为容器 3..5 3个到5个,使用数组作容器 0,2..5,9..* 非法的表达式 Figure UML-5-7-6-1 Figure UML-5-7-6-1 对应的代码 public class BinaryTreeNode { private BinaryTreeNode leftNode; private BinaryTreeNode rightNode; }; 7. 关联的构造型 1. < > 标准UML标记 源对象创建了目标对象,然后将目标对象传递给系统的其它对象。 这种关联可应用于工厂模式。 Figure UML-5-7-7-1 Figure UML-5-7-7-1 对应的代码 public class A { public B makeB() { return new B(); } }; 2. < > 标准UML标记 源对象的成员函数中创建了一个目标对象的实例,把这个实例当做一个本地变量。 Figure UML-5-7-7-2 同 Figure UML-5-7-7-1 ,图中关联的构造型改为< > Figure UML-5-7-7-2 对应的代码 public class A { public void f() { B b=new B(); //use b } }; 3. < > 标准UML标记 源对象的成员函数把目标对象的实例作为参数使用,源对象不保存目标对象的实例。 Figure UML-5-7-7-3 同 Figure UML-5-7-7-1 ,图中关联的构造型改为< > Figure UML-5-7-7-3 对应的代码 public class A { public void f(B b) { //use b } }; 4. < > 非标准UML标记 源对象传递目标对象的一个成员函数时,用到< > < >可应用于多种涉及模式,如:Proxy、DECORATOR和COMPOSITE7。 Figure UML-5-7-7-4 同 Figure UML-5-7-7-1 ,图中关联的构造型改为< > Figure UML-5-7-7-4 对应的代码 public class A { private B itsB; public void f() { itsB.f(); } }; 8. 内部类 Figure UML-5-7-8-1 Figure UML-5-7-8-1 对应的代码 public class A{ private class B{ ... } }; 9. 匿名内部类 UML还未对匿名内部类提供官方支持 一种非官方的表示方法,用有一个< >构造型的嵌入类来表示。 Figure UML-5-7-9-1 Figure UML-5-7-9-1 对应的代码 public class Window { public void f() { ActionListener l = new ActionListener() { //implementation }; } }; 10. 关联类 关联类能进一步的展示一个特殊的关联如何被实现。 比如:对于多重性关联使用何种容器 Figure UML-5-7-10-1 Figure UML-5-7-10-1 对应的代码 public class Address { private Vector itsLines; }; 关联类能够指明的特定形式的引用有 1. 不固定的引用(WeakReference ) 2. 松散的引用(SoftReference) 3. 幻影的引用(PhantomReference) Java 2 引用类使用指南-学习如何有效地使用 SoftReference、WeakReference 和 PhantomReference http://www-900.ibm.com/developerWorks/cn/java/j-refs/index.shtml 11. 关联限定符 源对象通过某种类型的关键字或标记与目标对象实例发生对应关联时,使用关联限定符。 Figure UML-5-7-11-1 Figure UML-5-7-11-1 对应的代码 public class LoginServlet { private String empid; public String getName() { Employee e = DB.getName(empid); return e.getName(); } }; 关联限定符使用较少 12. 少用UML远比多用UML好。