软件设计首先要整理用户的业务模型,然后以此为参照,结合环境条件,建立软件系统模型。在这个过程中,很重要的一点是:要剔除软件模型中多余的概念。
哪些是“多余的概念”呢?如果一个概念是从用户的业务模型中无法直接观察到的,而是设计者推想出来的,那么这个概念就是多余的概念。
我们想象一个铁路公司,经营着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
......
如果我一开始就这样设计的话,接到铁路公司的电话后,心里就会舒服多了。
分享到:
相关推荐
《一种下落式条包剔除装置》是针对工业生产中的包装流程进行优化设计的专业文档。该装置的设计旨在提高生产效率,确保产品质量,并减少浪费。本文将深入解析这一装置的核心概念、工作原理以及其在实际应用中的优势。...
综上所述,这个压缩包中的内容很可能详细介绍了这种剔除移栽包裹式夹持末端执行器的设计原理、工作流程、技术优势以及在实际应用中的性能表现。对于农业机械化、机器人技术和自动化领域的从业者来说,这是一个深入...
内容概要:本文介绍了一个基于C语言编写的程序设计,用于处理含有九个八位无符号整数的序列,在计算其成员平均数值之前,需先行剔除最高和最低两项数据。主要涉及创建队列存储对象、往队列填充资料、排除最大和最小...
此外,剔除机制的设计也十分重要,它必须能够在高速生产线上准确无误地剔除不合格产品,而不会影响到其他正常产品。 卷筒纸模切在线检测剔除装置的实施还涉及到系统的集成与调试。设备需要与现有的生产线无缝对接,...
虚节点(Virtual Nodes)是一致性哈希中的一个重要概念,它是为了增加哈希表的槽位数,从而更好地分散负载。每个实际节点可以映射到多个虚节点,这样即使节点数量较少,也能保证哈希结果的均匀性。在Nginx的一致性...
同时,系统开发中还涉及到了专业指导和参考文献,这表明研究团队在设计和实现过程中参考了相关领域的专业知识和技术成果。 此外,文章中提到了信息化工业,这暗示了该系统可能融入了工业4.0或者智能制造的概念,...
集成电路测试与功能验证是两个不同的概念,前者是为了剔除生产过程中产生的废品,而后者是用于证明所设计电路在性能上是否满足指标要求。 2. 集成电路测试概述 集成电路测试是针对集成电路芯片成品而言,目的是...
综上所述,"基于在线稀疏的红外图像冗余信息剔除方法与装置"是一个旨在提升电信设备图像处理效率和质量的创新技术,它结合了在线稀疏表示理论和实际的硬件、软件设计,对于优化通信系统中的红外图像处理具有重要意义...
数据结构课程设计中,约瑟夫环(Josephus Problem)是一个经典的理论问题,它涉及到算法设计和数据结构的应用。约瑟夫环问题源于一个古老的传说,讲述的是在战争中,一群士兵围成一个圈,按照一定的规则每经过一定...
半整数分频器的设计方法有多种,如模 N+1 计数,然后翻转触发时钟扣除半个脉冲,脉冲周期剔除法进行 n+0.5 分频。其基本设计思想是:首先进行模 n 的计数,在计数到 n 时,将输出时钟赋为 '1',而当回到计数 0 时,...
综上所述,XNA三维设计简明教程涉及了三维设计中的多个核心知识点,包括三维坐标系的概念,世界矩阵、视图矩阵、投影矩阵的运用,前后剪裁面和可视区域的定义,背面剔除的原理,向量和矩阵的基本操作,简单3D图形的...
通过这样的课程设计,学生不仅能掌握基本的计算机图形学概念,还能锻炼编程实践能力,为将来在IT领域的发展打下坚实基础。 这个压缩包文件中的“3D”很可能包含源代码、项目文件和可能的演示程序,供学习者参考和...
这个算法在数据结构课程设计中常常被用作练习,以帮助学生理解和应用链表、循环和计数等基本概念。 首先,我们来深入了解一下Joseph环的实现。在数据结构中,通常会使用单向循环链表来模拟这种环形结构。链表由一...
在机械设计的学习过程中,了解和掌握机械设计的基本理论、基本方法和基本技能,对于培养学生的创新意识和解决实际工程问题的能力至关重要。 机械设计第七版教材由蒲良贵主编,并由纪名刚主编参与编著,该教材是普通...
比如,在频谱分析仪中带通滤波器可作为选频装置,低通滤波器在数字信号分析系统中用于抗混叠滤波,高通滤波器则常用于剔除检测仪中的低频干扰噪声,带阻滤波器在电涡流测振仪中充当陷波器等。 数字滤波器的设计指标...
《测量平差程序设计》是宋力杰编著的一本专著,主要涵盖了测量学中的平差理论及其在计算机程序设计中的应用。该书通过源代码的形式,将复杂的数学理论转化为可执行的程序,帮助读者深入理解测量平差的方法和技术。这...
在IT行业中,软件开发是一项严谨且系统的工作,其中需求分析和设计阶段是至关重要的步骤。本文将基于"需求分析/软件设计文档国家标准"的主题,详细阐述相关知识点。 首先,需求分析是软件工程的第一步,其目标是...
本文将围绕数据库设计的基本流程和关键环节进行阐述,主要涉及系统设计与开发的过程,包括系统需求分析、概念结构设计、逻辑结构设计、物理结构设计及系统实现等方面。 首先,系统设计与开发是信息技术领域中的重要...