今天我们说一下需求变更,也就是需求变化了。。。。。。。。。。。。。。。。。。
这恐怕是我们最头疼的了。
接着上回说,因为开发了一个狗门,使得我们可以舒服一阵子了。这时候,电话来了。一个客户打来电话说:“你们的狗门工作的很好,很不错,只是我们想要有一点变化。我们需要一直听小狗是否叫了,是否需要出去。可是有时候我们会听不见,小狗就会尿在家里。能否让门在小狗叫的时候自动打开呢?而不需要我们的参与呢?”
肯定有人会说,我们已经让狗门工作的很好,而且客户也说很不错。为什么就是因为他们有了新的想法,我们就需要对门进行修改呢?
用户永远是对的。The Customer is always right.
在需求发生变化的时候,你必须要修改软件,使得它可以像客户期望的一样运行。在客户有新想法的时候,就是你改变系统满足新需求的时候。
无论你的软件设计的多么好,随着时间的推移,系统需要升级和变化。你会发现新的问题,编程语言将会进化,或者是你的客户会提出新需求来让你满足他。
针对用户的新需求,我们需要对上次得出的use case做一点修改。需要添加一个叫声识别装置,当听到狗叫的时候,发送开门的命令来打开门。
新的use case单
1、小狗叫了,他想出去
2、声音识别器“听到”声音(可选路径:用户听到狗叫的声音)
3、识别器发送开门的命令给门(可选路径:用户按下遥控器的按钮)
4、狗门打开
5、小狗出去
6、在外面玩
6.1 狗门自动关闭
6.2 小狗又叫了,想要回来
6.3 声音识别器“听到”声音(可选路径:用户听到狗叫的声音)
6.4 识别器发送开门的命令给门(可选路径:用户按下遥控器的按钮)
6.5 狗门再次打开
7、小狗回来了
8、门自动关闭
每一次修改use case都要验证用户的需求是否被满足,也就是要检查需求是否在use case中得到满足。
这次用户的requirements有了新的东西
1、狗门的高度至少要12英寸
2、使用遥控器就可以打开、关闭狗门
3、门要在打开之后,可以自动关闭
4、在狗叫的时候,识别器应该可以识别
5、在狗叫的时候,识别器应该可以打开门
我们来添加一个recognizer的类
代码
<!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class BarkRecognizer
{
private DogDoor _door;
public BarkRecognizer(DogDoor door)
{
_door = door;
}
public void Recognize(string bark)
{
Console.WriteLine("Bark Recognizer: heard a "+bark );
_door.Open();
}
}
}
调用代码就变成了
代码
<!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--> Head.First.OO.Design.DogDoor door = new Head.First.OO.Design.DogDoor();
Head.First.OO.Design.BarkRecognizer recognizer = new Head.First.OO.Design.BarkRecognizer(door);
recognizer.Recognize("bark");
对了,我们差点忘记了。还要求门再打开之后要自动关闭。
我们可以将remote类的代码copy一份,放在recognizer中。等等,copy,一出现copy我们就需要好好的思量了。为什么要copy,这样的话,就会给下次的修改造成很大的麻烦,要找到所有的副本,进行修改,少了一个地方都会报错。
那我们在哪里关闭门呢?关闭门应该是属于门的一部分,是门的职责,不应该受到外部的影响。为什么我们不让门自己关闭呢?这不就是自动关闭了吗?
下面是修改了的DogDoor类,在open方法的后面加上自动close,删除其他类中的关闭门的操作。
代码
<!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class DogDoor
{
private bool _open;
public DogDoor()
{
_open = false;
}
public void Open()
{
Console.WriteLine("the dog door opens");
this._open = true;
System.Threading.Thread.Sleep(5000);
Close();
}
public void Close()
{
Console.WriteLine("the dog door closes");
this._open = false;
}
public bool IsOpen()
{
return _open;
}
}
}
1、你的需求会不断变化
2、应对的方式就是封装变化
encapsulate the varies.
分享到:
相关推荐
深入浅出面向对象的分析与设计Head.First.Object-Oriented.Design.and.Analysis这本书以较轻快的语气为我们讲述了面向对象的分析与设计,适合精读,多读,仔细揣摩其中的思想
深入浅出面向对象的分析与设计,Head.First.Object-Oriented.Design
深入浅出面向对象的分析与设计Head.First.Object-Oriented.Design.and.Analysis 从自己做起 OOAD真正应用在你的项目中
“《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。” ...
Head.First.Object-Oriented.Design.and.Analysis.part5
“《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。” ...
Head.First.Object-Oriented.Design.and.Analysis.part4
Head.First.Object-Oriented.Design.and.Analysis.part1
Head.First.Object-Oriented.Design.and.Analysis.part2
Head.First.Object-Oriented.Design.and.Analysis.part3
Head.First-深入浅出面向对象分析与设计-中文.part08
“《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。” ...
Head.First 面向对象编程原汁原味英文版
《Head First 对象导向分析与设计》是一本旨在帮助读者深入理解对象导向分析与设计(Object-Oriented Analysis and Design,简称 OOA&D)核心概念的专业书籍。该书通过丰富的图形和实例来阐述复杂的理论知识,使学习...
Head First Object-Oriented Design and Analysis 英文版,共3个文件