Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(三)


  

引言

今天我们说一下需求变更,也就是需求变化了。。。。。。。。。。。。。。。。。。

  这恐怕是我们最头疼的了。

  

正文

接着上回说,因为开发了一个狗门,使得我们可以舒服一阵子了。这时候,电话来了。一个客户打来电话说:“你们的狗门工作的很好,很不错,只是我们想要有一点变化。我们需要一直听小狗是否叫了,是否需要出去。可是有时候我们会听不见,小狗就会尿在家里。能否让门在小狗叫的时候自动打开呢?而不需要我们的参与呢?”


  

  

  肯定有人会说,我们已经让狗门工作的很好,而且客户也说很不错。为什么就是因为他们有了新的想法,我们就需要对门进行修改呢?

  用户永远是对的。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的类

代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;

namespaceBeautyCode.Common.ConApp.Head.First.OO.Design
{
publicclassBarkRecognizer
{
privateDogDoor_door;
publicBarkRecognizer(DogDoordoor)
{
_door
=door;
}
publicvoidRecognize(stringbark)
{
Console.WriteLine(
"BarkRecognizer:hearda"+bark);
_door.Open();
}
}
}

调用代码就变成了

代码
Head.First.OO.Design.DogDoordoor=newHead.First.OO.Design.DogDoor();
Head.First.OO.Design.BarkRecognizerrecognizer
=newHead.First.OO.Design.BarkRecognizer(door);
recognizer.Recognize(
"bark");

对了,我们差点忘记了。还要求门再打开之后要自动关闭。

我们可以将remote类的代码copy一份,放在recognizer中。等等,copy,一出现copy我们就需要好好的思量了。为什么要copy,这样的话,就会给下次的修改造成很大的麻烦,要找到所有的副本,进行修改,少了一个地方都会报错。

那我们在哪里关闭门呢?关闭门应该是属于门的一部分,是门的职责,不应该受到外部的影响。为什么我们不让门自己关闭呢?这不就是自动关闭了吗?

下面是修改了的DogDoor类,在open方法的后面加上自动close,删除其他类中的关闭门的操作。

代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;

namespaceBeautyCode.Common.ConApp.Head.First.OO.Design
{
publicclassDogDoor
{
privatebool_open;
publicDogDoor()
{
_open
=false;
}
publicvoidOpen()
{
Console.WriteLine(
"thedogdooropens");
this._open=true;

System.Threading.Thread.Sleep(
5000);
Close();
}
publicvoidClose()
{
Console.WriteLine(
"thedogdoorcloses");
this._open=false;
}
publicboolIsOpen()
{
return_open;
}
}
}

结论

1、你的需求会不断变化

2、应对的方式就是封装变化

encapsulate the varies.

优质内容筛选与推荐>>
1、java生成静态页面
2、红楼情思
3、查看LINQ Expression編譯後的SQL語法(转)
4、python for symbian6
5、Man简单介绍


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn