在软件开发过程中,首先应当把设计放在首位,一个好设计可以解决很多问题。
软件设计可以使开发人员思路清晰,亦能给出确切需求的详细内容。
在本文中,我们就讨论自顶向下的设计方法,在中间,我们也将举例来渐次说明。
一个问题需要以多个层面来考量,对每个维度的角色都有好益处。软件设计与开发的不同层次列表如下:
1、大图景或主题
2、模块/系统
3、子模块/子系统
4、特征
5、子功能
6、商业规则
大图景
从总体上看,这其实就是一个业务目标。以终为始,业务目标非常重要,我们要做的是为了实现更好的业务目标。因此,它具有最高的优先级,你做的所有决定都必须在业务目标中反映。
为了理解自上而下的设计的,我们这一个例子来进行深入探讨。
拿计算机或电子课程学习为例,这个专业与设计联系也比较密切。在电子专业中,为学生生成进度报告可能是被要求的主题。
但是,这些学生需要何种进度要足够公平,它将人们的进度报靠足够开放,这会把人们带入新高度。
该报告的模型将启动你要定义模块的过程。
模块
在更广泛的层别上定义报告的类型,从而定义和构成模块。这些模块被标识为以下:
1、教师报表
2、学生报表
当我们定义了宽泛的模块后,然后对这些模块定义相应的子模块。
子模块
我们来对这些模块思考,确定可能有的子模块:
1、教师报表模块
1)课程报表
2)智能分配报表
3)智能学生报表
4)结果报表
2、学生报表模块
1)智能课程报表
2)智能分配报表
特征
一旦确实了子模块,需要使用功能列表对其进行详细说明。以下示例:
1、课程报表
1)教师可能为一门或多门课程生成一份报表(报告)
2)可以自定义日期选择范围
3)可以将课程中所有学生提供成绩以及“考试”做为视图选项
2、作业报表
1)用户可以选择一个或多个任务
2)用户可以按日期获取报表的灵活性
3)指定一门或多门课程的作业报表
这些功能亦可以细分为子功能。
用例和业务规则
对于这些类型报表,我们需要标识业务实体。在本例中,业务实体将是:
1)课程
2)学生
3)教师
4)考试
5)得分
6)年级
这些实体将有效帮助架构师设计API,这些API应该基于域的实体进行设计。
同时它们还可以帮助我们识别哪些是系统和子系统。比如上面的列表中,有用户,课程,考试,成绩,这些都属于不同的系统。
报表模块将与这些系统交互,以获取相关所需的数据。
当我们对以上步骤定义完毕后,那么是时候进一步研究系统功能和子功能了。
我们需要对每个功能或子功能提供一个业务规则清单,这个清单列出了功能里必须要实现的业务规则。
这个清单便是开发和测试人员执行任务的列表。开发者负责将这些业务规则完整实施,确保没有与业务规则相冲突和缺少等错误,这也是开发过程中最重要的部分。
测试人员依照用户故事和业务规则来设计测试用例,人们的思路会特别清晰。
非功能性需求
我们确定了功能需求并通过自上而下的设计,进行了深入研究和设计。
此外,在每个阶段还需要考虑非功能性需求,比如安全性和性能,这些特性将确保系统在设计之初就能够在高负载大并发等极端条件下运行无阻,而保证系统安全。
举个例子,我们生成学生成绩报表,先要知道在课程中的学生人数,接下来系统会为课程中的学生生成报表。如果课程允许自修,学生可以报名并参加该课程,注册班籍。
可能会员从一下升到3万甚至30万,这个功能就是非功能性需求,以此来帮助人们必须采取必要的措施,以支撑这样的场景需求。
该需求必须在设计开始时进行,以便正确完成,达到预期目标。
比如用户和会员信息,这些内容也需要从另一个子系统中获取。同样的道理,这对资料安全和性能有着严格的要求,这也是非功能性需求范围内。
在进行系统设计时,除了明显的功能性需求,还有这些非功能性需求,需要有足够的时间考量并实现。我们需要从自上而下的设计中确定这些非功能需求,当设计完成后,它会给我们正确且精确的时间等工程估计。
总结自上而下设计的优点:
1、它有助于识别系统与子系统
2、两个或两个以上子系统通信会更加清晰
3、功能与子系统,包括所有业务规则的清单更完整
4、在实施用户需求时错误有效消灭,达到高质量
5、确保给出正确的项目交付时间
6、明确定义了各个级别的期望,易于代码编写
7、非功能性特性将满足系统安全和性能
本文将对开发者,系统架构师有帮助。欢迎补充评论。
作者:佚名
相关阅读:
软件也是战斗力:细品美*“宙斯盾”系统人机界面设计
写过25W行代码,3个操作系统:我如何做架构设计,来降低代码复杂度?
阿里技术专家:“双11”亿级流量背后的API网关、微服务架构实践!
21CTO学院PHP全栈工程师隆重开营啦,报名获得一线互联网公司就业机会!21CTO赞赏作者,我们会有更好的分享。