- 浏览: 495662 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(四)
- 博客分类:
- [发布至博客园首页]
用真实世界检验你的软件-分析 |
引用 |
是时候毕业了,时候去真实世界检验自己的软件了。
上个版本的狗门很是成功,卖的很疯狂。但是越是卖的还要,抱怨就会越多。下面就是一个用户的意见。
“我非常喜欢你的系统,那个语音识别器。但是在我安装了之后,每次邻居家的狗叫的话,门也会自动打开。但是这不是我想要的效果。”
正文 |
你的软件有了一个上下文。到目前为止,我们是在一个真空,没有结合软件运行环境的情况下开发软件。换句话说,我们把软件想象为:运行在完美的世界,在我们预期的情况下运行。每个人都很轻松,周围没有很多条狗。
但是我们的软件终究要运行在真实的世界,而不是一个完美的世界。在真实的世界中,可能会运行错误。周围也会有很多的狗,猫之类的动物。
使得你的软件在真实世界不被搞糟的关键在于分析:在你把软件放到真实世界之前,找出潜在的问题,并且解决这些问题。
1、确定(识别)问题
第一步是找到潜在的问题。我们已经知道,就是邻居家有很多只狗。
使用遥控器没有问题,因为是人工干预。人是可以识别自己家的狗叫的。但是语音识别器好像就差了点,它一听到狗叫就会打开门。意味着,任何一只狗叫都可以打开门。
2、设计一个解决方案
使我们的use case出了问题,在识别器听到狗叫之后没有识别是否是自己家的狗,就打开了门。应该在听到声音之后,需要if判断一下,然后再打开门。
还需要识别器有存储主人家的狗叫声,才可以在收到狗叫之后进行比较。这时候,你就会发现,需要添加一个use case,就是存储狗叫。用例比较简单,就是:
1)主人家的狗叫
2)识别器存储主人家的狗叫声
用例增加之后,就需要我们修改代码。修改的方式有很多种,先看第一种:
在DogDoor中添加一个string类型的字段,用来存储叫声;添加一个方法来设置叫声;添加方法来获取叫声。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class DogDoor
{
private bool _open;
private string _allowBark;
public void SetAllowBark(string bark)
{
_allowBark = bark;
}
public string GetAllowBark()
{
return _allowBark;
}
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;
}
}
}
另外一种做法就是比较面向对象的程序员写的,新建一个类,定义叫声类
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class Bark
{
private string _sound;
public Bark(string sound)
{
_sound = sound;
}
public string GetSound()
{
return _sound;
}
public override bool Equals(object obj)
{
if (obj is Bark)
{
Bark bark = obj as Bark;
if (bark._sound.Equals(this._sound))
return true;
else
return false;
}
return false;
}
}
}
DogDoor类中的叫声字段的类型则变成了新建的Bark类
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class DogDoor2
{
private bool _open;
private Bark _allowBark;
public void SetAllowBark(Bark bark)
{
_allowBark = bark;
}
public Bark GetAllowBark()
{
return _allowBark;
}
public DogDoor2()
{
_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
{
Console.WriteLine("Bark Recognizer: heard a "+bark );
if (_door.GetAllowBark().Equals(bark))
_door.Open();
else
Console.WriteLine("this dog is not allow");
}
识别器2
{
Console.WriteLine("Bark Recognizer: heard a " + bark);
if (_door2.GetAllowBark().Equals(bark))
_door.Open();
else
Console.WriteLine("this dog is not allow");
}
识别器2明显好于识别器1,因为在2中将声音比较的任务委托给了bark类来处理,识别器本身不处理,只是根据处理的结果来做出决定。这样就松散了耦合,解耦了识别器类和叫声类。因为其他叫声也很容可以添加进来,否则每一种叫声都必须配备专用的识别器了。
在分析的时候,需要注意需求或者是用例中的名词和动词。名称经常会需要转换成类,或者是类的一个属性。动词则经常会是一个方法。
继续上面的分析。
狗一般不是叫一声,有可能要叫很多声,只要一个声音匹配成功,就应该打开门。识别器需要存储多个狗叫声。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class DogDoor3
{
private bool _open;
private List<Bark> _allowBark;
public void SetAllowBark(Bark bark)
{
_allowBark.Add( bark);
}
public List<Bark> GetAllowBark()
{
return _allowBark;
}
public DogDoor3()
{
_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;
}
}
}
这时候识别器就需要修改一下了
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.Common.ConApp.Head.First.OO.Design
{
public class BarkRecognizer
{
private DogDoor3 _door3;
public BarkRecognizer(DogDoor3 door)
{
_door3 = door;
}
public void Recognize3(Bark bark)
{
Console.WriteLine("Bark Recognizer: heard a " + bark);
foreach (Bark b in _door3.GetAllowBark())
{
if (b.Equals(bark))
{
_door.Open();
return;
}
}
Console.WriteLine("this dog is not allow");
}
}
}
结论 |
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 547如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 669组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 528本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5915 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 614前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 836企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 624首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 594概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 996概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 803我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8401 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9691、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 777引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 650oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 605经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 633今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 682我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 671题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
深入浅出面向对象的分析与设计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个文件