Flex设计模式
分析阶段
用例介绍
书写正式用例
一般情况下,我们用正式用例来创建功能性需求文档。
编写用例
设计阶段
CRC卡介绍
类确定
就像每一位画家都有不同的创作理念和色彩搭配方式一样,每一们系统设计师对于如何构建一个系统也是见仁见智。
类是一些名词,所以可以遍历用例图,找到那些有意义的词,作为系统中的类。
类功能确定
确定类的功能可以帮助我们确定是否将该类作为系统所需要实现的类。
确定协作类
编程人员都知道,一个类不可能通过自己来实现所有的功能。它们必须依靠其他类来协助它们实现其功能。这些起协助作用的类称之为协作类(collaborator)。
确定类与类之间的联系
关联,其中一个类依赖于另外一个类以实现其中的一个或者多个功能。
注释,“有一个”。一旦其中一个类是协作类的拥有者,如果这个拥有者被销毁的时候,注释协作类也被销毁。
继承
?
实现阶段
编程规范
包
对于包的名称是否使用中间词首大写格式存在两派观点。
封装
封装的设计
封装是一个非常重要的原理,它具有异常重要的意义。假如,School类拥有一个私有属性_student和全校学生的入学名单数组。如果我们让School对象可以随时访问学生信息(比如说,SchoolDistrict类需要知道该区域所有学校学生的信息),那么可以使用getter方法制作一个可访问数组,如下所示:
public function set students():Array { return _students; }
虽然上例中并未使用公共属性,但是它的设计已经破坏了封闭原理。试想一下,如果我们调回_student数组并对它直接做出修改:
school.students.splice(10,5);
?这行代码将从学校中移出5个学生的信息,但是school却没有收到任何关于此次透出的任何通知。这明显违背于现实生活,也违背于我们的设计初衷——一个学校应该时刻对自己的学生信息了如指掌。我们可以通过以下两种方式解决这类问题。第一种是最简单的方式,就是返回一个副本而不是一个引用。如下所示:
public function get students():Array { return _students.concat(); }
?
第二种方法,就是使用迭代器模式。
其实,大多数设计模式解决的问题都和封装性有关。