zoukankan      html  css  js  c++  java
  • Head.First.ObjectOriented.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的类

    代码
    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();
            }
        }
    }

          调用代码就变成了

    代码
              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,删除其他类中的关闭门的操作。

    代码
    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;
            }
        }
    }
    结论

    【Blog】http://virusswb.cnblogs.com/

    【MSN】jorden008@hotmail.com

    【说明】转载请标明出处,谢谢

         

          1、你的需求会不断变化

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

          encapsulate the varies. 

  • 相关阅读:
    chapter2——习题
    chapter2 算法——程序的灵魂
    物理数据库设计 读书笔记
    从visio数据库脚本生成添加 MS_Description 的sql脚本
    SSIS包中CASE与NVARCHAR的恩怨
    又到年末
    delicious备份文件转入firefox书签,delicious2firefox 原创、开源
    软件架构设计 温昱著 读书笔记
    重构 读书笔记
    再遇SSIS包与MSSQL问题
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1783424.html
Copyright © 2011-2022 走看看