




















需求变化往往是一个项目中不可避免的,当然也是常常是使开发者头痛的。用户在使用软件后常常会出现这样或那样的想法。目前的软件虽然已经满足了他们先前提出的要求。但是要知道,结束意味着新的开始。还记得上一篇文章中的那个客户吗?他们又回来了!
上一篇中我们为他们开发了一个Dog Door。在使用中都很好,但现在他们有了一些新的建议。他们常常乱放遥控器,以至于当小狗要出去或者近来时,不得不去找一下遥控器放在那里了。(有点头大,但是用户往往是对的,需求经常变化即使你有一个好的用例,你常常要快速改变你的软件以适应那些新的需求。)
根据他们的需求,我们需要相应的修改我们的用例:看到需求后,感觉我们只需要在小狗barking的时候加一个声音识别装置来接收声音信号,然后再开门。
public class BarkRecognizer
{
private DogDoor _door;

public BarkRecognizer(DogDoor door)
{
this._door = door;
}

public void recoginze(String StrBark)
{
Console.WriteLine(" BarkRecognizer heard a '" + StrBark + "'");
_door.Open();
}
}

然后我们在对测试代码进行修改:
static void Main(string[] args)
{
DogDoor door = new DogDoor();
BarkRecognizer recognizer = new BarkRecognizer(door);
Remote remote = new Remote(door);
Console.WriteLine("The dog is barking, he wanna
");
//remote.pressButton();
recognizer.recoginze("Woof");
Console.WriteLine("The dog is outside and
");
Thread.Sleep(10000);
//remote.pressButton();
Console.WriteLine("The dog is barking, he wanna inside");
//remote.pressButton();
recognizer.recoginze("Woof");
Console.WriteLine("The dog is inside");
//remote.pressButton();
Console.Read();
}

测试结果如下:
这次修改中发生了一个问题:Dog door 无法自动关闭了!在实际开发中,需求变化导致的修改往往会让我们的程序千疮百孔,对于这样一个小的程序都会出现这种问题,何况我们的项目呢?但是,这种情况不是不能避免,问题也许是由于原先的设计,也许在于后来的开发上,及时调整,避免问题到了后面,不可收拾。
我原来把自动关闭的代码写在了Remote中,现在可以同样在BarkRecognizer中贴入同样的代码,但是这并不是一个好的主意。想想如果说今后对于自动关闭的方法有修改时,那么需要修改所有贴有这个代码的地方,如果客户又要加入一种开门的方式,就又要粘贴一下这段代码,显然这与面向对象原则是背道而驰的。相对较好的解决方式应该是修改DogDoor类型,因为自动关闭是DogDoor本身的行为。修改代码如下:
public class Remote
{
private DogDoor _door;

public Remote(DogDoor door)
{
this._door = door;
}

public void pressButton()
{
if (_door.IsOpen)
{
_door.Close();
}
else
{
_door.Open();
}
}
}

public class DogDoor
{
private Boolean _isOpen;

Timer time;
TimerCallback callback;

public Boolean IsOpen
{
get { return _isOpen; }
set { _isOpen = value; }
}

public DogDoor()
{
_isOpen = false;
}

public void Open()
{
_isOpen = true;
Console.WriteLine("The dog door is opened.");
callback = new TimerCallback(this.Close);
time = new Timer(callback, this, 1000, 0);
}

public void Close()
{
_isOpen = false;
Console.WriteLine("The dog door is closed");
}

public void Close(object source)
{
this.Close();
}
}


现在正常了:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。