剔除设计中多余的概念
来源:互联网 发布:软件构成 编辑:程序博客网 时间:2024/05/01 08:12
软件设计首先要整理用户的业务模型,然后以此为参照,结合环境条件,建立软件系统模型。在这个过程中,很重要的一点是:要剔除软件模型中多余的概念。
哪些是“多余的概念”呢?如果一个概念是从用户的业务模型中无法直接观察到的,而是设计者推想出来的,那么这个概念就是多余的概念。
我们想象一个铁路公司,经营着ABCD四个城市之间的路线。这几个城市的位置如下:
铁路公司的老板想做一个售票系统,他找到一家软件公司。假设我就在这个软件公司工作,担任这个项目的负责人。铁路公司的老板这么对我说:从A到B的票价是50元,从B到C的票价是60元,从C到D的票价是30元,如下:
在这个基础上,两个城市之间的票价是各段之和。比如:从A到C的票价是AB+BC,就是110元。
于是,回到办公室里,我开始设计这个系统。我想:这个系统很简单,以A城市作为起点,把从A城市到各个城市之间的票价记录下来。就像这样,我设计了一个数据表,保存票价,他是这样的:
SQL>SELECT * FROM TICKET_PRICE;
CITY PRICE
---------------
A 0
B 50
C 110
D 140
当旅客来买票,要从B到C去的时候,我们就用C的票价减去B的票价,得到从B到C的票价,得到60元。想从D到B,就用D的票价减去B的票价,得到90元。
这个设计非常简洁,看上去没什么问题。按照这样的想法,我们开始写代码了。但是,很快我就遇到了麻烦。
铁路公司的老板打来一个电话,他说:我们正在对票价做一些调整,从A到B的票价保持50元,B到C保持60元,但是从A直接到C的票价现在调整到100元。并且从C到A的票价要打一个8折,就是80元。
现在麻烦了,TICKET_PRICE这个表面临着重大的变动,所有基于这个表的业务逻辑都要改了。
烦恼的由来是什么呢?原因在于,这个设计是基于我的一个推论,而不是可以直接观察到的业务事实。直接观察到的业务事实是:A到B的票价是50元,B到C的票价是60元,A到C的票价是110元……而我在这个基础上做了一个推断:A到C的票价是AB+BC。当然,我做出这个错误的推断,有铁路公司老板的一部分“功劳”。无论怎样,变更不可避免,铁路公司和我,都必须承担这个错误的后果。铁路公司要追加项目投资,我们的开发成本要上升,而我自己,肯定要加班了。
这个设计中有一个多余的概念:A城市是一个基准点。这是一个在业务过程中无法直接观察到的概念,而我错误的将他作为整个系统的基础,让所有城市之间的票价以他们到A城市的票价为基准。
从业务中能够直接观察到的是什么呢?只有两个城市之间的票价。一个乘客来到铁路公司买票,从A到B是50元,从B到D是90元……他能观察到的只有这些,而没有作为某个基准点的A城市。系统的设计应该基于坚实的业务基础,而不是任何推断。“基准”这个概念需要从设计中剔除掉。
重新设计这个系统,应该用下面这样的形式描述城市之间的票价:
A B C D A 0 50 110 140 B 50 0 60 90 C 110 60 0 30 D 140 90 30 0
当然,我可以用这样的数据表来保存这样的票价:
SQL>SELECT * FROM TICKET_PRICE;
START DESTINATION PRICE
---------------------------------
A B 50
B A 50
A C 110
C A 110
B C 60
......
如果我一开始就这样设计的话,接到铁路公司的电话后,心里就会舒服多了。
哪些是“多余的概念”呢?如果一个概念是从用户的业务模型中无法直接观察到的,而是设计者推想出来的,那么这个概念就是多余的概念。
我们想象一个铁路公司,经营着ABCD四个城市之间的路线。这几个城市的位置如下:
铁路公司的老板想做一个售票系统,他找到一家软件公司。假设我就在这个软件公司工作,担任这个项目的负责人。铁路公司的老板这么对我说:从A到B的票价是50元,从B到C的票价是60元,从C到D的票价是30元,如下:
在这个基础上,两个城市之间的票价是各段之和。比如:从A到C的票价是AB+BC,就是110元。
于是,回到办公室里,我开始设计这个系统。我想:这个系统很简单,以A城市作为起点,把从A城市到各个城市之间的票价记录下来。就像这样,我设计了一个数据表,保存票价,他是这样的:
SQL>SELECT * FROM TICKET_PRICE;
CITY PRICE
---------------
A 0
B 50
C 110
D 140
当旅客来买票,要从B到C去的时候,我们就用C的票价减去B的票价,得到从B到C的票价,得到60元。想从D到B,就用D的票价减去B的票价,得到90元。
这个设计非常简洁,看上去没什么问题。按照这样的想法,我们开始写代码了。但是,很快我就遇到了麻烦。
铁路公司的老板打来一个电话,他说:我们正在对票价做一些调整,从A到B的票价保持50元,B到C保持60元,但是从A直接到C的票价现在调整到100元。并且从C到A的票价要打一个8折,就是80元。
现在麻烦了,TICKET_PRICE这个表面临着重大的变动,所有基于这个表的业务逻辑都要改了。
烦恼的由来是什么呢?原因在于,这个设计是基于我的一个推论,而不是可以直接观察到的业务事实。直接观察到的业务事实是:A到B的票价是50元,B到C的票价是60元,A到C的票价是110元……而我在这个基础上做了一个推断:A到C的票价是AB+BC。当然,我做出这个错误的推断,有铁路公司老板的一部分“功劳”。无论怎样,变更不可避免,铁路公司和我,都必须承担这个错误的后果。铁路公司要追加项目投资,我们的开发成本要上升,而我自己,肯定要加班了。
这个设计中有一个多余的概念:A城市是一个基准点。这是一个在业务过程中无法直接观察到的概念,而我错误的将他作为整个系统的基础,让所有城市之间的票价以他们到A城市的票价为基准。
从业务中能够直接观察到的是什么呢?只有两个城市之间的票价。一个乘客来到铁路公司买票,从A到B是50元,从B到D是90元……他能观察到的只有这些,而没有作为某个基准点的A城市。系统的设计应该基于坚实的业务基础,而不是任何推断。“基准”这个概念需要从设计中剔除掉。
重新设计这个系统,应该用下面这样的形式描述城市之间的票价:
A B C D A 0 50 110 140 B 50 0 60 90 C 110 60 0 30 D 140 90 30 0
当然,我可以用这样的数据表来保存这样的票价:
SQL>SELECT * FROM TICKET_PRICE;
START DESTINATION PRICE
---------------------------------
A B 50
B A 50
A C 110
C A 110
B C 60
......
如果我一开始就这样设计的话,接到铁路公司的电话后,心里就会舒服多了。
- 剔除设计中多余的概念
- 剔除路径名中多余的斜杠
- 剔除集合中多余的相同的值
- DX中关于背面剔除概念的澄清!
- DX中关于背面剔除概念的澄清!
- DX中关于背面剔除概念的澄清!
- C++中利用CString的Format函数时,剔除浮点数后多余的零
- 关于背面剔除的概念。
- 剔除多余的SQL代码(Getting rid of SQL Code)
- cqbzoj 1158 剔除多余括号
- 剔除多余括号 解题报告
- 关于Android应用设计中多余的“退出”功能
- 项目经理应该知道的97件事--剔除多余的流程
- 剔除多余括号(CTSC94-1) c++
- 转:剔除多余括号(二分法)
- iOS app打包剔除多余文件
- shader中面的剔除 (cull)
- 剔除matlab中NaN
- asp.net发邮件
- Google Service大全
- 追MM与Java的23种设计模式
- 20050425 新增两个小论坛
- NMS的MediaMask
- 剔除设计中多余的概念
- 我的状态
- 解析Linux内核获取当前进程指针的方法
- wap开发FAQ
- 今天正式报名参加SOA了
- what is SOA?
- 本次大赛需要提交的文档
- Q.931呼叫流程
- CSDN Blog支持专区开通