维维的工作学习空间(*_*)

软件业新手上路
posts - 29, comments - 2, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年5月20日

敏捷开发的设计原则

------------------------------------

为了便于记忆,我把它的设计原则归结为ISOLD ,也就是isold,有点像函数的过时方法。

i:interface,接口隔离;S:single,单一职责;O:open&close,开放封闭原则;L:liskov ,里斯科瓦替换原则;D:Denpendency,依赖倒置原则。哈哈,是不是好记忆多了。我小猪就是这么牛!

------------------------------------
单一职责原则SRP:Single Responsibility Principle


开放封闭原则OCP:Open-Close Principle

一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。


Liskov替换原则LSP:Liskov Substitution Principle

子类应当可以替换父类并出现在父类能够出现的任何地方。


依赖倒置原则DIP:Dependency Invertion Principle

在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。


接口隔离原则ISP:Interface Separate Principle
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。

关于包的设计原则
重用发布等价原则REP:Reuse Equivalence Principle
共同重用原则CRP:Common Resue Principle
共同封闭原则CCP:Common Close Principle
无环依赖原则ADP:Acyclic Dependency Principle
稳定依赖原则SDP:Stabilization Dependency Principle
稳定性度量公式:I=Ce/(Ca+Ce) (I:不稳定度,Ce:输入耦合度,Ca:输出耦合度)
I取值范围在【0,1】,I=0表示具有最大稳定度;iI=1标识具有最大不稳定度
稳定抽象原则SAP:Stabilization Abstract Principle

敏捷开发技术的特点和优势
1.个体和交互胜过过程和工具

  人是获得成功的最为重要的因素。如果团队中没有优秀的成员,那么就是使用好的过程也不能从失败中挽救项目,但是,不好的过程却可以使最优秀的团队成员失去效用。如果不能作为一个团队进行工作,那么即使拥有一批优秀的成员也一样会惨败。团队的构建要比环境的构建重要得多。许多团队和管理者就犯了先构建环境,然后期望团队自动凝聚在一起的错误。相反,应该首先致力于构建团队,然后再让团队基于需要来配置环境。

2.可以工作的软件胜过面面俱到的文档

  没有文档的软件是一种灾难。代码不是传达系统原理和结构的理想媒介。团队更需要编制易于阅读的文档,来对系统及其设计决策的依据进行描述。然而,过多的文档比过少的文档更糟。编制众多的文档需要花费大量的时间,并且要使这些文档和代码保持同步,就要花费更多的时间。如果文档和代码之间失去同步,那么文档就会变成庞大的、复杂的谎言,会造成重大的误导。虽然从代码中提取系统的原理和结构信息可能是困难的,但是代码是惟一没有二义性的信息源。在团队成员的头脑中,保存着时常变化的系统的脉络图(road map)。人和人之间的交互是把这份脉络图传授给他人的最快、最有效的方式。

3.客户合作胜过合同谈判

  不能像订购日用品一样来订购软件。你不能够仅仅写下一份关于你想要的软件的描述,然后就让人在固定的时间内以固定的价格去开发它。所有用这种方式来对待软件项目的尝试都以失败而告终。有时,失败是惨重的。告诉开发团队想要的东西,然后期望开发团队消失一段时间后就能够交付一个满足需要的系统来,这对于公司的管理者来说是具有诱惑力的。然而,这种操作模式将导致低劣的质量和失败。成功的项目需要有序、频繁的客户反馈。项目的需求基本处于一个持续变化的状态。大的变更是很平常的。在这期间,也会出现整个功能块被减掉,而加进来另外一些功能块。然而,合同和项目都经受住了这些变更,并获得成功。成功的关键在于和客户之间真诚的协作,并且合同指导了这种协作,而不是试图去规定项目范围的细节和固定成本下的进度。

4.响应变化胜过遵循计划

  响应变化的能力常常决定着一个软件项目的成败。当我们构建计划时,应该确保计划是灵活的并且易于适应商务和技术方面的变化。计划不能考虑得过远。

敏捷开发技术的12个原则 -增量开发模式
1.我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。

2.即使到了开发的后期,也欢迎改变需求。

3.经常性地交付可以工作的软件,交付的间隔可以从几周到几个月,交付的时间间隔越短越好

4.在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。

5.围绕被激励起来的个人来构建项目。

6.在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈。

7.工作的软件是首要的进度度量标准。

8.敏捷过程提倡可持续的开发速度。

9.不断地关注优秀的技能和好的设计会增强敏捷能力。

10.简单使未完成的工作最大化。

11.最好的构架、需求和设计出自于自组织的团队。

12.每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。

敏捷开发技术的适用范围
1.项目团队的人数不能太多

2.项目经常发生变更

3.高风险的项目实施

4.开发人员可以参与决策

方法背后的思想
人们掌握过程(process)可以分为3个阶段:
1 following    遵循一个定义好的process
2 detaching   知道不同process的适用范围,在不同的场合使用不同的process
3 fluent         不关心是否遵循特定的process,知道在什么情况下采用什么动作

软件开发是一个充满发明和交流的协作性游戏 (cooperative game of invertion and communication)。软件开发的首要目标是生产出软件,遵循特定的过程和模型只是手段,只要传递了足够的信息,手段是次要的。交流的效果要远远重于交流的形式(Effect of communication is more important than the form of communication)。

 

在软件开发中,人的因素要远远大于过程和技术。人是有缺陷的:
1 容易犯错误,因此必须在错误扩散之前找到并改正错误
2 当觉得可能失去较多的时候,不愿意冒险
3 重新构造而不愿意重复使用已有的东西
4 难于坚持一个习惯

针对个人因素的几个建议:
1 具体的模型较抽象的模型更容易理解
2 从一个例子开始是容易的
3 通过观察他人的成果学习
4 要有足够的不受打扰的时间
5 分配的工作要与个人意向,能力匹配
6 不正确的奖励会有坏作用,从长期看个人兴趣比奖励更重要,培养在工作中的自豪感:
     1) pride in work参与工作的自豪感,通常参与一个重要的工作会有自豪感
     2) pride in accomplishment 完成工作的自豪感,长期未完的工作会使士气低落
     3)pride in contribution 为他人贡献的自豪感
7 鼓励关心其他人的工作和整体的工作

在一个团队之间,交流是最重要的,实践证明面对面的实时的交流是最有效的,对交流的延误会损失信息,白板是最好的交流工具,交流工具的先进并不能提高交流效果。文档的作用是记录和备忘,不能通过文档交流。

敏捷开发方法要避免的过程设计的几个常见错误
1 对所有的项目使用同一种过程
2 没有弹性
3 过于沉重
4 增加不必要的“必须完成”(“should do” is really should?)
5 没有经过实践检验

敏捷开发方法过程设计的几个原理:
1 交互的面对面的交流是代价最小,最迅速的交换信息的方法
2 超过实际需要的过程是浪费的
3 大的团队需要重量级方法
4 处理重大问题的项目需要重量级方法强调
5 增加反馈和交流可以减少中间产品和文档的需求
6 轻量级方法更强调理解(understanding),自律(discipline)和技能(skill),重量级方法更强调文档(documentation),过程(process)和正式(formality)

understanding指整个团队关于项目的全部知识,包括讨论的过程

documentation只能记录其中的一部分

discipline是指个人主动的完成工作

process指个人根据指令完成工作

skill指具有良好技能的人可以省略中间的产品

formality指必须按照规定步骤完成工作

7 确定开发中间的瓶径,提高它的效率

对于瓶径处的工作应该尽量加快,减少重复,(使用更熟练的人,使用更多的人,使用更好的工具,使瓶径处的工作的深入尽量稳定)对于非瓶径处的工作可以多一些重复,在输入还不确定的情况下也可以尽早开始。

这些原理的几个结论:
1 向一个项目增加人员要花费较大代价(constly),因为原有人员和新人员之间的交流要花费大量时间
2 团队的规模经常是跳跃的,例子:需要6个熟练的程序员,但是只有4个,于是增加不熟练的程序员,结果团队的大量时间花费在培训不熟练的程序员上面,最后增加到了20个不熟练的程序员。
3 应该侧重于提高团队的技能而不是扩充团队
4 对不同的项目使用不同的过程
5 在适用的条件下,轻量级的方法优于重量级的方法
6 对不同的项目要裁减过程

敏捷开发方法的原则是“刚刚好”(Light and Sufficient)

posted @ 2008-05-20 11:52 weiwei~ 阅读(17) | 评论 (0)编辑

极限编程与敏捷开发


作者:徐景周



  在按照我的理解方式审查了软件开发的生命周期后,我得出一个结论:实际上满足工程设计标准的惟一软件文档,就是源代码清单。

-- Jack Reeves
简介
  2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作、响应变化能力的价值观和原则,他们称自己为敏捷联盟。敏捷开发过程的方法很多,主要有:SCRUM,Crystal,特征驱动软件开发(Feature Driven Development,简称FDD),自适应软件开发(Adaptive Software Development,简称ASD),以及最重要的极限编程(eXtreme Programming,简称XP)。极限编程(XP)是于1998年由Smalltalk社群中的大师级人物Kent Beck首先倡导的。

极限编程

  设计和编程都是人的活动。忘记这一点,将会失去一切。
-- Bjarne Stroustrup

  极限编程(XP)是敏捷方法中最著名的一个。它是由一系列简单却互相依赖的实践组成。这些实践结合在一起形成了一个胜于部分结合的整体。

下面是极限编程的有效实践:
  1. 完整团队 XP项目的所有参与者(开发人员、客户、测试人员等)一起工作在一个开放的场所中,他们是同一个团队的成员。这个场所的墙壁上随意悬挂着大幅的、显著的图表以及其他一些显示他们进度的东西。
  2. 计划游戏计划是持续的、循序渐进的。每2周,开发人员就为下2周估算候选特性的成本,而客户则根据成本和商务价值来选择要实现的特性。
  3. 客户测试作为选择每个所期望的特性的一部分,客户可以根据脚本语言来定义出自动验收测试来表明该特性可以工作。
  4. 简单设计团队保持设计恰好和当前的系统功能相匹配。它通过了所有的测试,不包含任何重复,表达出了编写者想表达的所有东西,并且包含尽可能少的代码。
  5. 结对编程所有的产品软件都是由两个程序员、并排坐在一起在同一台机器上构建的。
  6. 测试驱动开发编写单元测试是一个验证行为,更是一个设计行为。同样,它更是一种编写文档的行为。编写单元测试避免了相当数量的反馈循环,尤其是功功能能验证方面的反馈循环。程序员以非常短的循环周期工作,他们先增加一个失败的测试,然后使之通过。
  7. 改进设计随时利用重构方法改进已经腐化的代码,保持代码尽可能的干净、具有表达力。
  8. 持续集成团队总是使系统完整地被集成。一个人拆入(Check in)后,其它所有人责任代码集成。
  9. 集体代码所有权任何结对的程序员都可以在任何时候改进任何代码。没有程序员对任何一个特定的模块或技术单独负责,每个人都可以参与任何其它方面的开发。
  10. 编码标准 系统中所有的代码看起来就好像是被单独一人编写的。
  11. 隐喻 将整个系统联系在一起的全局视图;它是系统的未来影像,是它使得所有单独模块的位置和外观变得明显直观。如果模块的外观与整个隐喻不符,那么你就知道该模块是错误的。
  12. 可持续的速度 团队只有持久才有获胜的希望。他们以能够长期维持的速度努力工作,他们保存精力,他们把项目看作是马拉松长跑,而不是全速短跑。 极限编程是一组简单、具体的实践,这些实践结合在形成了一个敏捷开发过程。极限编程是一种优良的、通用的软件开发方法,项目团队可以拿来直接采用,也可以增加一些实践,或者对其中的一些实践进行修改后再采用。
敏捷开发
  人与人之间的交互是复杂的,并且其效果从来都是难以预期的,但却是工作中最重要的方面。
-- Tom DeMacro和Timothy Lister

敏捷软件开发宣言:
  • 个体和交互     胜过 过程和工具
  • 可以工作的软件 胜过 面面俱到的文档
  • 客户合作       胜过 合同谈判
  • 响应变化       胜过 遵循计划
虽然右项也有价值,但是我们认为左项具有更大的价值。
  • 我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
  • 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
  • 经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
  • 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
  • 围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
  • 在团队内部,最具有效果并富有效率的传递信息的方法,就是面对面的交谈。
  • 工作的软件是首要的进度度量标准。
  • 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
  • 不断地关注优秀的技能和好的设计会增强敏捷能力。
  • 简单是最根本的。
  • 最好的构架、需求和设计出于自组织团队。
  • 每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。
当软件开发需求的变化而变化时,软件设计会出现坏味道,当软件中出现下面任何一种气味时,表明软件正在腐化。
  • 僵化性: 很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其它改动。
  • 脆弱性: 对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。
  • 牢固性: 很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。
  • 粘滞性: 做正确的事情比做错误的事情要困难。
  • 不必要的复杂性: 设计中包含有不具任何直接好处的基础结构。
  • 不必要的重复性: 设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一。
  • 晦涩性: 很难阅读、理解。没有很好地表现出意图。
敏捷团队依靠变化来获取活力。团队几乎不进行预先设计,因此,不需要一个成熟的初始设计。他们更愿意保持设计尽可能的干净、简单,并使用许多单元测试和验收测试作为支援。这保持了设计的灵活性、易于理解性。团队利用这种灵活性,持续地改进设计,以便于每次迭代结束生成的系统都具有最适合于那次迭代中需求的设计。为了改变上面软件设计中的腐化味,敏捷开发采取了以下面向对象的设计原则来加以避免,这些原则如下:
  • 单一职责原则(SRP)
    就一个类而言,应该仅有一个引起它变化的原因。
  • 开放-封闭原则(OCP)
    软件实体应该是可以扩展的,但是不可修改。
  • Liskov替换原则(LSP)
    子类型必须能够替换掉它们的基类型。
  • 依赖倒置原则(DIP)
    抽象不应该依赖于细节。细节应该依赖于抽象。
  • 接口隔离原则(ISP)
    不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。
  • 重用发布等价原则(REP)
    重用的粒度就是发布的粒度。
  • 共同封闭原则(CCP)
    包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
  • 共同重用原则(CRP)
    一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
  • 无环依赖原则(ADP)
    在包的依赖关系图中不允许存在环。
  • 稳定依赖原则(SDP)
    朝着稳定的方向进行依赖。
  • 稳定抽象原则(SAP)
    包的抽象程度应该和其稳定程度一致。
  上述中的包的概念是:包可以用作包容一组类的容器,通过把类组织成包,我们可以在更高层次的抽象上来理解设计,我们也可以通过包来管理软件的开发和发布。目的就是根据一些原则对应用程序中的类进行划分,然后把那些划分后的类分配到包中。

下面举一个简单的设计问题方面的模式与原则应用的示例:

问题:
  选择设计运行在简易台灯中的软件,台灯由一个开关和一盏灯组成。你可以询问开关开着还是关着,也可以让灯打开或关闭。

解决方案一:
  下面图1是一种最简单的解决方案,Switch对象可以轮询真实开关的状态,并且可以发送相应的turnOn和turnOff消息给Light。


解决方案二:
  上面这个设计违反了两个设计原则:依赖倒置原则(DIP)和开放封闭原则(OCP),DIP原则告诉我们要优先依赖于抽象类,而Switch依赖了具体类Light,对OCP的违反是在任何需要Switch的地方都要带上Light,这样就不能容易扩展Switch去管理除Light外的其他对象。为了解决这个方案,可以采用ABSTRACT SERVER模式,在Switch和Light之间引入一个接口,这样就使得Switch能够控制任何实现了这个接口的东西,这也就满足了DIP和OCP原则。如下面图2所示:



解决方案三:
  上面图2所示解决方案,违返了单一职责原则(SRP),它把Switch和Light绑定在一起,而它们可能会因为不同的原因而改变。这种问题可以采用ADAPTER模式来解决,适配器从Switchable 派生并委托给Light,问题就被优美的解决了,现在,Switch就可以控制任何能够被打开或者关闭的对象。但是这也需要会出时间和空间上的代价来换取。如下面图3所示:



  敏捷设计是一个过程,不是一个事件。它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程。它致力于保持系统设计在任何时间都尽可能得简单、干净和富有表现力。

参考文献
  1. 设计模式-可复用面向对象软件的基础 -- 李英军等译
  2. 重构-改善既有代码的设计 -- 侯捷等译
  3. 敏捷软件开发-原则、模式与实现 -- 邓辉译
Email: jingzhou_xu@163.net

posted @ 2008-05-20 11:49 weiwei~ 阅读(15) | 评论 (0)编辑

2008年4月29日

用例图

 

用例图(Use Case Diagram)是由软件需求分析到最终实现的第一步,它描述人们如何使用一个系统。用例视图显示谁是相关的用户、用户希望系统提供什么样的服务,以及用户需要为系统提供的服务,以便使系统的用户更容易理解这些元素的用途,也便于软件开发人员最终实现这些元素。用例图在各种开发活动中被广泛的应用,但是它最常用来描述系统及子系统。

当用例视图在外部用户出现以前出现时,它捕获到系统、子系统或类的行为。它将系统功能划分成对参与者(即系统的理想用户)有用的需求。而交互部分被称作用例。用例使用系统与一个或者多个参与者之间的一系列消息来描述系统中的交互。

用例图包含六个元素,分别是:参与者(Actor)、用例(Use Case)、关联关系(Association)、包含关系(Include)、扩展关系(Extend)以及泛化关系(Generalization)

用例图可一个包含注释和约束,还可一个包含包,用于将模型中的元素组合成更大的模块。有时,可以将用例的实例引入到图中。用例图模型如下所示,参与者用人形图标来标识,用例用椭圆来表示,连线表示它们之间的关系。

一.参与者(Actor

         1参与者的概念

         参与者是系统外部的一个实体,它以某种方式参与用例的执行过程。参与者通过向系统输入或请求系统输入某些事件来触发系统的执行。参与着由参与用例时所担当的角色来表示。在UML中,参与者用名字写在下面的人形图标表示。

         每个参与者可以参与一个或多个用例。它通过交换信息与用例发生交互(因此也与用例所在的系统或类发生了交互),而参与者的内部实现与用例是不相关的,可以用一组定义其状态的属性充分的描述参与者。

         参与者有三大类:系统用户、与所建造的系统交互的其它系统和一些可以运行的进程。

         第一类参与者是真实的人,即用户,是最常见的参与者,几乎存在于每个系统中。命名这类参与者时,应当按照业务而不是位置命名,因为一个人可能有很多业务。

         第二类参与者是其它的系统。这类位于程序边界之外的系统也是参与者。

         第三了参与者是一些可以运行的进程,如时间。当经过一定的时间触发系统中的某个事件时,时间就成了参与者。

         2.确定参与者

         在获取用例前首先要确定系统的参与者,开发人员可以通过回答以下的问题来寻找系统的参与者。

(1)         谁将使用该系统的主要功能。

(2)         谁将需要该系统的支持以完成其工作。

(3)         谁将需要维护、管理该系统,以及保持该系统处于工作状态。

(4)         系统需要处理哪些硬件设备。

(5)         与该系统那个交互的是什么系统。

(6)         谁或什么系统对本系统产生的结果感兴趣。

在对参与者建模的过程中,开发人员必须要牢记以下几点。

(1)         参与者对于系统而言总是外部的,因此它们可以处于人的控制之外。

(2)         参与者可以直接或间接的与系统交互,或使用系统提供的服务以完成某件事务。

(3)         参与者表示人和事物与系统发生交户时所扮演的角色,而不是特定的人或者特定的事物。

(4)         每个参与者需要一个具有业务一样的名字,在建模中不推荐使用类似“新参与者”的名字。

(5)         每一个参与者要必须有简短的描述,从业务角度描述参与者是什么。

(6)         一个人或事物在与系统发生交互时,可以同时或不同时扮演多个角色。

(7)         和类一样,参与者可以具有表示参与者的属性和可以接受的事件,但使用的不频繁。

3.参与者之间的关系

因为参与者是类,所以多个参与者之间可以具有与类相同的关系。在用例视图中,使用了泛化关系来描述多个参与者之间的公共行为。如果系统中存在几个参与者,它们既扮演自身的角色,同时也扮演更具一般化的角色,那么就用泛化关系来描述它们。这种情况往往发生在一般角色的行为在参与者超类中描述的场合。特殊化的参与者继承了该超类的行为,然后在某些方面扩展了此行为。参与者之间的泛化关系用一个三角箭头来表示,指向扮演一般角色的超类。这与UML中类之间的返还关系符号相同。

用例(Use Case

         1.用例的概念

         用例是外部可见的系统功能单元,这些系统功能由系统单元所提供,并通过一系列系统单元与一个或多个参与者之间交换的消息所表达。用例的用途是,在不揭示系统内部构造的前提下定义连贯的行为。

         用例的定义包含它所必须的所有行为——执行用例的主线次序、标准行为的不同变形、一般行为下的所有异常情况及其预期反应。从用户的角度来看,上述情况很可能是异常情况;从系统的角度来看,它们是必须被描述和处理的附加情况。更确切地说,用例不是需求或功能的规格说明,但是也展示和体现其所描述的过程中的需求情况。在UML中,用例用一个椭圆表示。

         在模型中,每个用例的执行都独立与其它用例,尽管在执行一个用例时由于用例之间共享对象的原因可能会在用例之间产生隐含的依赖关系。每个用例都表示一个纵向的功能块,这个功能块的执行会和其它用例的执行混合在一起。

         用例的动态执行过程可以用UML的交互来说明,可用用状态图、时序图、协作图或非正式的文字描述来表示。用例功能的执行通过系统中类之间的协作来实现。一个类可以参与多个协作,因此也参与了多个用例。

         在系统层,用例表示整个系统对外部用户可见的行为。一个用例就像外部用户可以使用的系统操作。但是,它不又与操作不同,用例可以在执行过程中持续接受参与者的输入消息。用例也可以被像子系统和独立类这样的系统小单元所应用。一个内部用例表示了系统的一部分对其它部分呈现出的行为。例如,某个类的用例表示了一个连贯的功能块,这个功能块是该类提供给系统内其它有特定作用的类的。一个类可以有多个用例。

 

2.识别用例

         用例图对整个系统建模过程非常重要,在绘制系统用例图前,还有许多工作要做。系统分析者必须分析系统的参与者和用例,他们分别描述了“谁来做”和“做什么”这两个问题。

         识别用例最好的方法就是从分析系统的参与者开始,考虑每一个参与者是如何使用系统的。使用这种策略的过程中可能会发现新的参与者,这对完善整个系统的建模有很大的帮助。用例建模的过程是一个迭代和逐步精华的过程,系统分析者首先从用例的名称开始,然后添加用例的细节信息。这些信息由简短的描述组成,它们被精华成完整的规格说明。

         在识别用例的过程中,通过回答以下几个问题,系统分析者可以获得帮助。

(1)         特定参与者希望系统提供什么功能。

(2)         系统是否存储和检索信息,如果是,由哪个参与者触发。

(3)         当系统改变状态时,是否通知参与者。

(4)         是否存在影响系统的外部事件。

(5)         哪个参与者通知系统这些事件。

 

3.用例与事件流

用例分析处于系统的需求分析阶段,这个阶段应该尽量避免考虑系统实现的细节问题。但是要实际建立系统,则需要更加具体的细节,这些细节写在事件流文件中。事件流的目的是为用例的逻辑流程建立文档,这个文档详细描述系统用户的工作和系统本身的工作。

         虽说事件流很详细,但其仍然是独立于实现的方法的。换句话说,事件流描述的是一个系统“做什么”而不是“怎么做”。事件流通常包括:简要说明、前提条件、主事件流、其它事件流和事后事件流。

(1)         简要说明。每个用例应当有一个相关的说明,描述该用例的作用,说明应当简明扼要,但应包括执行用例的不同类型的用户和通过这个用例要达到的结果。

(2)         前提条件。用例的前提条件列出用例之间必须满足的条件。例如,前提条件是另一个用例已经执行或用户具有运行当前用例的权限。但并不是所有用例都有前提条件。

(3)         主事件流和其它事件流。用例的具体细节在主事件流和其它事件流中描述。事件流是从用户角度描述执行用例的具体步骤,关注系统“做什么”,而不是“怎么做”。主事件流和其它事件流包括:用例如何开始和结束、用例如何与参与者交互、用例的正常流程(主流程)、用例主事件流(其它事件流)的变体和错误流。

(4)         事后条件。事后条件是用例执行完毕后必须为真的条件。例如,可以在用例完成之后设置一个标识,这种信息就是事后条件。与前提条件一样,事后条件可以增加用例次序方面的信息,如果要求一个用例执行完后必须执行另一个用,那么就可以在事后条件中说明这一点。当然,并不是每个用例中都有事后条件。

 

用例间的关系

         用例除了与参与者发生关系外,还可以具有系统中的多个关系,这些关系包括包含关系、扩展关系和泛化关系。应用这些关系的目的是为了从系统中抽取出公共行为和其变体。

         1.关联关系(Association

         关联关系描述参与者与用例之间的关系,它是用于表示类的挂系的关联元类的实例。在UML中,关联关系用箭头来表示。

         关联关系表示参与者与用例之间的通信。不同的参与者可以访问相同的用例,一般说来它们和该用例的交互是不一样的,如果一样的话,说明它们的角色可能是相同的。如果两中交互的目的也相同,说明它们的角色是相同的,就可以将它们合并。

         2.包含关系(Include

         虽然每个用例的实例都是独立的,但是一个用例可以用其它的更简单的用例来描述。这有点像通过继承父类并增加附加描述来定义一个类。一个用例可以简单地包含其它用例具有的行为,并把它所包含的用例行为作为自身行为的一部分,这被称作包含关系。在这种情况下,新用例不是初始用例的一个特殊例子,并且不能被初始用例所代替。爱UML中,包含关系表示为虚线箭头交<<include>>字样,箭头指向被包含的用例。

         包含关系把几个用例的公共步骤分离成一个单独的被包含用例。被包含用例称作提供者用例,包含用例称作客户用例,提供者用例提供功能给客户使用。用例间的包含关系允许包含提供者用例的行为到客户用例的事件中。

         包含关系使一个用例的功能可以在另一个用例中使用,如下所述。

(1)         如果两个以上用例有大量一致的功能,则可以将这个功能分解到另外一个用例中。其它用例可以和这两个用例建立包含关系。

(2)         一个用例的功能太多时,可以用包含关系建模两个小用例。

要使用包含关系,就必须在客户用例中说明提供者用例行为别包含的详细位置。这一点同功能调用有点类似。事实上,它们在某种程度上具有相似的语义。

 

3.扩展关系(Extend

一个用例也可以被定义为基础用例的增量扩展,这被称作扩展关系,扩展关系是把新的行为插入到已有的用例中的方法。同一个基础用例的几个扩展用例可以在一起应用。基础用例的扩展增加了原有的语义,此时基础用例而不是扩展用例被作为例子使用。在UML中,扩展关系表示为虚线箭头加<<extend>>字样,箭头指向被扩展展的用例。

基础用例提供了一组扩展点,在这些新的扩展点中可以添加新的行为,而扩展用例提供了一组插入片片段,这些片段能够被插入到基础用例的扩展点上。基础用例不必知道扩展用例的任何细节,它仅为其提供扩展点。事实上,基础用例即使没有扩展用例也是完整的,这点与包含关系有所不同。一个用例可能有多个扩展点,每个扩展点可以出现多次。但是一般情况下,基础用例的执行不和涉及到扩展用例,只有特定的条件发生,扩展用例才被执行。扩展关系为处理异常或构建灵活的系统框架提供了一种有效的方法。

4.泛化关系(Generalization

         一个用例可以被特别列举为一个或多个用例,这被称为用例泛化。当父用例能够被使用时,任何子用例也可以被使用。在UML中用例泛化与其它泛化关系的表示法相同,用一个三角箭头从子用例指向父用例。

         在用例泛化中,子用例表示父用例的特殊形式。子用例从父用例处继承行为和属性,还可以添加、覆盖或改变继承的行为。如果系统中一个或多个用例是某个一般用例的特殊化时,就需要使用用例的泛化关系。

 

 

用例建模技术

 

一.对语境建模

         对于一个系统,会有一些事物存在于其内部,而一些事物存在于其外部。存在于系统内部的事物的任务是完成系统外部事物所期望的系统行为,存在于系统外部并与其进行交互的事物构成了系统的语境,即系统存在的环境。在UML建模中,用例图对系统的语境进行建模,强调的是系统的外部参与者。对系统语境建模应当遵循以下的方法:

(1)         用以下几组事物来识别系统外部的参与者:需要从系统中得到帮助以完成其任务的组;执行系统功能时所必须的组;与外部硬件或其它软件系统进行交互的组;为了管理和维护而执行某些辅助功能的组。

(2)         将类似的参与者组织成泛化/特殊化的结构层次。

(3)         在需要加深理解的地方,为每个参与者提供一个构造型。

(4)         将参与者放入到用例图中,并说明参与者与用例之间的通信路径。

 

二.对需求建模

         需求就是根据用户对产品功能的期望,提出产品外部功能的描述。需要分析所要做的工作是获取系统的需求,归纳系统所要实现的功能,使最终的软件产品最大限度的贴近用户的要求。对系统需求建模可以参考以下的方法。

(1)         识别系统外部的参与者来建立系统的语境。

(2)         考虑每一个参与者期望的行为或需要系统提供的行为。

(3)         把公共的行为命名为用例

(4)         分解公共行为,放入到新的用例中以供其它的用例使用:分解异常行为,放入新用例中以延伸为主要的控制流。简而言之,就是确定提供者用例和扩展用例。

(5)         在用例视图中对用例、参与者和它们之间的关系进行建模。

posted @ 2008-04-29 14:23 weiwei~ 阅读(73) | 评论 (0)编辑

2008年4月18日

   COS命令:
1.调用命令:Do,Quit,Job,Xecute
2.指配:Set,Kill,New
3.流程控制:If,ElseIf,Else;For;While,Do/While。
4.输入输出:Write;Read;一些I/O命令。
5.命令可以没有、有、或有多个参数。多个参数用“,”隔开;“:”作多个参数分隔符;同一行命令之间必须有两个以上空格。
6.后条件命令用“Command:pc”的形式。
7.Do例程时,例程要有前导“^”符。可以在“^”前加上例程的标签符。调用类方法用##Class。
8.Quit用于返回值。
9.Job运行后台程序,一般没有用户交互的。
10.Xecute,可以一次运行多个命令。
11.IF ElseIf Else类似C语言语法。
12.For ControlVariable = StartValue:IncrementAmount:EndValue {}
13.do {code} while condition
14.while condition {code}
15.Write $$label^routine()调用全程中的子程序。
16.Read中:!回车;#换页;?n换几行。
17.COS中还包括:事物处理命令:Lock,TStart,TCommit,TRollBack;设备相关:Open,Use,Close;调试命令:Break,GoTo;Hang:挂起正在运行的程序。
   COS中的函数:
1.函数可以有或没有返回值,COS支持很多系统函数和用户自定义函数。
2.调用系统函数用$name(parameters)。
3.自定义函数是一种特殊的例程,它有名称、参数、作用域、返回值。
4.COS推荐使用过程(Procedure)来实现自定义函数。过程、例程、子例程、函数、方法是比较相近的但有各自的特点。
5.过程可以是私有或公共的,可以有或没有参数,自动管理其中使用的变量,可以使用和改变外部变量,可以有或没有返回值。
6.子例程总是公共的,不能有返回值。函数也总是公共的,需要显式定义局部变量,必须有返回值。方法是类定义的一部分。例程是COS一个程序,它可以包含一个或多个过程、子例程、函数、及这些的结合。
7.COS还支持在宏中定义用户代码。
8.例程存为*.MAC文件,这样调用:Do ^RoutineName或 Set x = ^RoutineName
9.子例程是*.MAC中的代码块,调用:Do Subroutine^Routine
10.函数这样调用:Do Function^Routine 或 $$Function()
11.过程也可以用DO调用或在表达式中用$$调用。
12.过程中的公共参数使用时,将调用New方法,在过程Quit时,回收。
13.如果过程中需要的参数是给它所调用的子例程使用的,那么这个参数必须定义为公共参数。
14.默认定义的是私有过程。
15.参数可以值传递或地址传递。
16.在同一个过程中,不能有两个相同标签,但在同一例程的不同过程中,可以有相同的标签。过程内定义的过程只能在这个过程中调用。
17.在过程中用Do调用的过程如是没有标签,表示是过程内部定义的过程,有标签,表示过程外部定义的过程。
18.在过程中,如果有GoTo,那么标签必定是在过程内部。
19.在过程中,使用Xecute和间接引用调用的是外部过程。
20.COS中还可以定义函数或子例程,但并不推荐使用。
21.子例程定义以标签开始,Quit结束,可以用Do,GoTo,Quit调用。
22.函数不应该用,使用过程来替换。
  多维数组:
1.多维数组是包括一个或多个元素的可持久变量,每个元素是一个唯一的下标标识,下标可以使用多种字面混合。
2.简而言之,多维数组是可持久化的,通过多个下标表示的多维数据。单个节点也称为“Globals”,它是Cache数据库的基本组成块。它存在于一种树形形式,是稀疏存贮的,有多种设置。
3.稀疏存贮可以不用为数组预留内存,从而节约内存开销。
4.Global可以转变为数组,属性可以转变为数组,变量也可以转变为数组。
5.可以使用Set,Kill,$Order,$Data存取操作数组数据。
   字符串操作:
1.$length,测长度。
2.$Justify,调整长度。
3.$ZConvert,转换大小写。
4.$find,查找子串。
5.$Extract,提取子串。
6.$Piece,截取。
7.$ListBuild,$List,$ListLength,$ListFind。
   调用外部命令:
1.使用%CLI 、$ZF(-1)、$ZF(-2)
2.在Cache Terminal中使用%CLI。
3.Set CallResults = $ZF(-1,command),可以用“!”替换。
4.用$ZF 可在Cache中调用用其它语言(如C)写的例程。
   事物处理:
1.可以在使用SQL语句或COS命令的应用程序中使用事物。
2.使用Lock加锁或解锁。
3.$INCREMENT不受事物控制。
4.%ETN 自动处理回滚。
还有错误处理,例程调试等这里不详细写了!

posted @ 2008-04-18 17:58 weiwei~ 阅读(18) | 评论 (0)编辑

   Cache Object Script语言(简称为COS)。它适于开发1.业务逻辑2.应用集成3.数据处理。COS将被编译成“对象代码”,并在Cache虚拟机内执行。“对象代码”具有字符串操作、数据访问等功能。
   在下面这些情况下使用COS:
1.在Cache Terminal中。
2.作为Cache对象类的方法中使用的语言。
3.创建Cache例程。
4.在Cache SQL中,作为存贮过程和触发器的编写语言。
5.在CSP中作为服务端脚本语言。
   COS的特性:
1.强大的字符串功能。
2.内在的支技对象技术,包括方法、属性、多态性。
3.大量控制应用流程的命令。
4.一套处理设备I/O的命令。
5.支持多维、稀疏数据组:local和Global。
   COS语言概要:
1.没有保留关键字,使用如“$”等字符区分内部命令和用户变量。
2.给变量付值用Set命令。
3.空格在COS也有一定意义:无前导空格的是标签符,命令必须有前导空格。
4.COS由一系列语句组成,每个语句都定义了某些程序功能。语句由命令和参数组成。
5.每个COS命令都有一个长名和一个短名,如“Write”和“W”同。
6.COS中在任何使用表达式的地方都可以使用函数,在对象中调用的函数称为方法。
7.函数一般由系统提供,用户可以自定义函数叫过程(Procedure)。
8.COS支持丰富的表达式。
9.变量是无类型的,可分为:局部变量,Globals变量,数组变量,系统变量,对象属性。
10.COS有多种操作符,如:“+”“-”等。
   COS语法:
1.用户自定义的内容在COS中是大小写敏感的,而系统内建的命令和函数是不敏感的。
2.与类相关的所有名称都是大小写敏感的。但却不能只用大小写来区别类名!
3.调用命令和函数:Write x
4.空格必须出现在一行代码的最前面;命令和参数之间必须有空格;一行可以写多个命令,命令之间一定要有空格;命令与注释间必须有空格。
5.注释用“//”和“;”或“/*”“*/”。
6.编译器编译时会去除注释,用$Text可以保留注释。
7.COS只能认识数字和字符两种字面形式。
8.特殊标识:前导“^”指示为Global名称;前导“%”的标只是“一直可见的”或系统变量,例程名称也可用“%”前导。
9.标签名必须字母开头,最多31字符长度,一行代码只能有一个标签,标签也大小写敏感。
10.虽然COS没有保留关键字,但由于COS支持内嵌SQL语句,所以使用名称时小心于SQL保留字冲突。
    数据类型和值:
1.COS变量没有类型,每个变量都可以是字符,数字或对象值。
2.COS字符串中双引号“"”可以嵌套使用。
3.“_”可以联接字符串。
4.数字可包括0-9和“.”,可以使用前导或后继“0”,不可以用“,”或贷币符号。“E”或“e”必须直接与数字相联,长度大于19位或指数大于130的数字将成为未知数。
5.值为对象值的变量参引到一个内存中的对象。可以用$IsObejct来测试是否对象变量。但不能将Global付给对象变量。一个对象付给一个变量后,其参引数自动加一。
6.一个Global数组变量与其它数组一样,只是有前导“^”,它可以存贮在数据库中。
7.COS中变量不用定义,只需直接使用,可用$Data和$Get函数判断其是否已定义。注:$Get可以返回默认值,但不会设置变量值。
8.在逻辑操作中,字面会转化为0(false)或1(ture),表示布尔值。
9.COS没有日期数据类型,它提供一系日期函数用来操作或把日期显示为特定的字符值。$Horolog、$ZDateTime、$ZH提供了三种日期格式。
   COS中的变量:
1.局部变量,在单个程过程(Procedure block)块中有效。
2.全局变量,在一个例程中有效,除非进入了一个Procedure block。
3.Globals变量,可以自动存贮在数据库中的变量,Global变量可以和一般的变量同样使用。
4.数组变量,可以有一个或多个下标。数据变量可以局部的、全局的或Global。
5.系统变量,系统变量以“$”为前导,提供一些系信息。大部分系统变量是只读的,但$IO是可读写的。
6.对象属性,严格来说,对象属性不是一个变量,但可以和变量一样使用。
7.虽然COS变量无类型,但内部还是对不同的值类型进行自动转换的。
8.对象值对是一个内存对象的引用,这个值不能用来从数据库读取对象!内容对消失时,自动取消变量的引用。
9.全局变量使用%前导,但在程序块以外定义的变量也是全局变量。
   操作符与表达式:
1.COS包含很多操作符,比较特殊的有“[”包含,“]”跟随,“]]”之后排序,“@”间接引用,“?”模式匹配。
2.操作符的顺序可以用括号来改变。
3.表达式可以是数学表达式,字符串表达式,逻辑表达式,对象表达式。
4.逻辑表达式用于:逻辑操作,数字关系操作,字符关系操作,它一般于IF、$Select和条件表达式一起使用。
5.数字操作有:正负+-,加减+-,乘除*/,幂运算**,整除\\,取模#。
6.逻辑操作有:二进制与&、&&,非与\'&,或!、||,非或\'!,非\'。
7.字符操作有:联接“_”。
8.数字关系操作:小于<,大于>,大于等于\'<,小于等于\'>。
9.字符关系操作:相同=,不相同\'=,包括[,不包括\'[,跟随](以ASCII顺序),不跟随\'],之后排序]],非之后排序\']]。
10.模式匹配:?,A表示大小写字母,C表示33个ASCII控制字符,E表示255个ASCII,L表示26个小写字母,N表示10个数据字符,P表示33个ASCII标点字符,U表示26个大写字符。
11.模式中,指定出现次数用n.n形式;用数字加模式符组合多重模式;还有组合模式;模糊模式。
12.可以使用多个模式“或”;模式嵌套;有多种解释方法的,只要有一种就是真。
13.间接引用@,Cache认识5种类型:名称、模式、参数、下标、$TEXT参数。

posted @ 2008-04-18 17:53 weiwei~ 阅读(30) | 评论 (0)编辑

2008年4月8日

     这是使用 win32asm进行数据库编程系列的第一份教程。在如今的99v界,数据库编程变的越来越重要,所以我们不能再忽视它。但如今有很多种数据库在使用,如果我们为了实现win32下数据库汇编语言编程而学习各种数据库文件格式,所花时间大概称得上“永恒”。

    幸运的是,Microsoft的一项技术使得我们得以摆脱这个大麻烦。它被称为ODBC,是开放式数据库互连(Open Database Connectivity)的缩写,这是一族API,与Windows API相似。它主要与数据库打交道。就是说,利用ODBC API,你可通过统一界面和好多各不相同的数据库打交道。

   ODBC是如何工作的?它的结构式怎样的?在使用ODBC之前,你应对它的结构有一个清楚的了解。 ODBC有四个组成部分:

应用程序 (Application,你的程序)
ODBC 管理器 (ODBC manager)
ODBC 驱动程序(ODBC Drivers)
数据源 (Data Sources,数据库)
这四个组件的核心是ODBC 管理器。 你可把它想象成你的监工。你告诉它你希望他作什么,然后它把你的要求传达给它的工人(ODBC 驱动程序)并完成工作。如果工人有什么想告诉你的,它会与监工(ODBC 管理器)说,由监工传达给你。工人们很明白他们应作什么,因此他们会为你很好的完成工作。

    通过这样的模式,我们并不与数据库驱动程序直接通信。你只需告诉数据库管理器你想要做什么。而使用恰当的ODBC驱动程序来实现你的目的则是ODBC管理器的事。每个ODBC 驱动程序对于它所对应的数据库均有足够了解。各部件各司其职,极大的简化了工作量。

    你的程序<----> ODBC管理器<----> ODBC驱动程序 <----> 数据库

    ODBC管理器由Microsoft提供。看一下你的控制面板。如果你正确地安装了ODBC你会找到ODBC数据源(32位) 项目。 至于ODBC驱动程序, Microsoft随他们的产品提供了好几种。并且你总可从数据库提供商那里获得新的ODBC 驱动程序。只要简单地安装新的ODBC驱动程序,你的机器就可使用新的它以前不知道的数据库。

   ODBC APIs 使用很简单,但你需要知道一些关于SQL和数据库的知识。例如字段(field),主键(primary key),记录(record),列(column),行(row)等。我须假定你已知道数据库理论的一些基础知识,这样我才能讨论win32下用汇编语言进行ODBC编程的细节问题。正如你所看到的,ODBC 管理器试图在你的程序里隐藏实现的细节。这意味着它必须提供某些基本界面来与你的程序和ODBC驱动程序进行通讯。 由于ODBC驱动程序在某些性能方面存在着差异,因此必须存在一种方法,以使得我们的程序能够知道某个ODBC驱动程序是否支持某一特性。 ODBC定义了被称为Interface Conformance Levels的三层服务界面。第三层是核心层。任何ODBC驱动程序都要象在第一层和第二层实现功能一样实现核心层表中的所有特性。从我们的程序的眼光来看, ODBC APIs被分割为这样的三层。如果某个函数被标为核心的,就意味着你可放心使用而不必担心它是否为你正使用的ODBC驱动程序支持。如果它是一个第一层或第二层的函数,你就得确认ODBC驱动程序是否支持,然后再使用。你可通过MSDN获得ODBC APIs的详细资料。

    在编写代码之前你应了解一些ODBC的名词。

    环境(Environment). 和字面意思一样,是一个全局文本用来存取数据。如果你熟悉DAO的话,你可把它想象为一个workspace。它包含应用于所有ODBC session的信息,例如一个session的connections句柄。在用ODBC之前你必须从环境中获得这个句柄。
连接(Connection). 指定ODBC驱动程序和数据源(数据库)。你可以在同一环境中同时连接不同的数据库
语句(Statement). ODBC使用SQL作为自己的语言。 因而只要简单的认为语句就是你希望ODBC执行的SQL命令就行了。
以下是使用ODBC编程的一般步骤:

连接数据源
创建并执行一条或多条SQL语句
检查结果记录(如果有的话)
断开数据源
在接下来的教程中我们来学习如何来实现这几步。

posted @ 2008-04-08 15:26 weiwei~ 阅读(22) | 评论 (0)编辑

2008年2月22日

asp调试问题一般用下面的方法可以解决:
1:确认在“配置属性”中的“启用ASP.NET调试"为"True"
2:确认你的"web.config"中的"debug=true"
3:若你安装过wind2000 SP4后,则要在命令行执行"regsvr32 i aspnet_isap.dll"
4:确认"集成Windows身份验证"选项被选中
5:在IE选项->"安全设置"->"自定义级别"里有"用户验",确认选中"自动使用当前用户名和密码登录"
6:运行C:\WINNT\Microsoft.NET\Framework\v1.0.3705\aspnet_regiis.exe -i
7:控制面板--管理工具--计算机管理--本地用户和组--用户,双击ASPNET用户,为其隶属于添加Administrators用户
以上操作最管用的就是第5步和第7步。

无法在WEB服务器上启动调试,未将项目配置为进行调试
一般估计是把项目直接拷过来打开,要重新配置一下IIS
控制面板-〉internet服务管理器-〉默认的web站点-〉你的项目目录-〉属性-〉应用程序设置-〉应用程序名-〉“创建”

调试失败,因为没有启用集成windows身份任证
打开IIS
在“网站”节点上右击
选择“属性”
点击“目录安全性”选项卡
单击“编辑”
勾选页面最下面的“集成Windows身份验证”复选框

posted @ 2008-02-22 15:08 weiwei~ 阅读(22) | 评论 (0)编辑

2008年1月27日

     摘要: Q:请教咖啡兄了,类似调度这种需求怎么描述,比如数据库调度,1天做一次备份。又比如我系统里需要每一分钟做一些数据分析处理,这种需求没有哪个用户来驱动,如何定义它的用户,我开始把定时器作为用户,但发现那已经是实现了,那可以把调度本身作为个用户吗,这样调度做的事情就可以方便的用用例来描述了。我这个系统可能会碰到多种类似情况,比如数据改变而做的事情。缺乏经验阿。


A:象这种情况定时器是actor。
actor的概念并不是人,而是站在系统边界外(系统边界根据分析需要是可以扩大缩小的)驱动系统的一切人,事,物,甚至规则。系统边界划定后,边界以内的,只有用例。边界以外的,向系统主动发出动作的,是为actor,被动的从系统获得消息的,是为接口。

Q:接着上面这个问题,actor是属于系统边界之外的人、事、物,可是定时器应该是属于系统内部的一个物,我可不可以这么理解,认为计算机的时钟是Actor,以一分钟时间间隔调度为例,Actor就是1分钟、2分钟等这些分钟点。

A:我倒不认为定时器是系统内部的一个物。如果是系统内部的,它必须向  阅读全文

posted @ 2008-01-27 19:01 weiwei~ 阅读(54) | 评论 (0)编辑

     摘要: 在了解了系统目标以后,系统分析员最先要做的事情不是去了解业务的细节,而是去发现与这个目标相关的人和物。英文把这种人和物称为Stakeholder,在Rose中,这类模型的类型被定义为Business Actor 。有的资料翻译为干系人,笔者则更喜欢涉众这种翻译方法。这就谈到了业务建模的第一步:发现和定义涉众。

从这一篇开始,笔者将借助一个虚拟的实例来阐述获取用例的方法,以及如何判断用例获取是否完备,粒度选择是否合适。事实上,在做这些工作时,我们正在进行需求分析的第一个阶段,即业务建模阶段。借助这个例子,笔者同样会阐述业务建模到底应该做什么,做到什么地步才能说明业务需求已经完整,可以称为一份完整的需求规格说明书了。

一般来说,只有当以下工作都完成,才能说业务模型建立完成,它们是:

  阅读全文

posted @ 2008-01-27 18:57 weiwei~ 阅读(73) | 评论 (0)编辑

     摘要: 在正式讨论如何获取用例之前,笔者觉得有两个问题还是先解释清楚为好,这对正确获取用例有很大帮助。这两个问题也是初学者最为困惑,也是最难掌握的。一个是各种用例类型之间的区别和用法,另一个是用例的粒度。
在正式讨论如何获取用例之前,笔者觉得有两个问题还是先解释清楚为好,这对正确获取用例有很大帮助。这两个问题也是初学者最为困惑,也是最难掌握的。一个是各种用例类型之间的区别和用法,另一个是用例的粒度。
先说说用例类型的问题。
用例类型,有的资料翻译为版型,英文原文是stereotype。在Rose中默认的类型有business usecase , business usecase realization和use case realization三种。  阅读全文

posted @ 2008-01-27 17:55 weiwei~ 阅读(82) | 评论 (0)编辑