关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

  自上而下(Top Down)开发模式是指从一个应用的最高点开始开发。从最高点逐步往下层编码,直到开发完所有的任务。一旦写完了最下层的代码,开发任务就完成了。使用这种方式,你需要设计、编写出所有你需要的但还没有实现模拟接口、服务、伪代码。

  自下而上(Bottom up)开发模式是指从一个应用的最底层开始开发。这种方式的考量在于认为最底层是应用中最复杂的部分,或者认为是最重要的部分。这种模式下系统将从一个个小模块做起,最终构建起整个系统。

  我在上大学之初就听说了自上而下开发模式和自下而上开发模式。当时我并没有在意它们的区别——因为就是一个彻头彻尾的自下而上开发的程序员。

  然而,随着阅历的积累,我慢慢的完全改变了我的立场。我认为,是敏捷开发和TDD让我发生了这样的变化。我非常强烈的感觉到,我想对每个人大声说:在一个敏捷开发团队里,自下而上开发是反模式的。

  假设有一个四个人的开发团队,要完成一个Web应用中的下列这些任务。

  • 创建控制层(controller) – 主访问入口,请求映射表。
  • 创建服务层(service) – 服务层,简单业务逻辑。
  • 数据库查询 – 复杂的数据库查询

  按照自下而上的开发方法,两个程序员将负责开发复杂的数据库查询功能。当这部分代码可以使用后,另外两个程序员将开始开发控制层和服务层。

  这种开发模式的问题来自痛苦的集成过程。开发服务层的程序员写代码时很有可能无法遵守最初计划时团队制定的接口规范,这样,复杂数据库查询开发的程序员就不得不修改他们的查询接口。

// 数据库接口和服务层要求不一致
query.Execute(id);// 数据库层的实现是这样的。
query.Execute(id, typeId);

  这是一个很简单的例子,但你可以想象一个含有30多个小任务的story的情况,有更多的程序员参与,更复杂的业务,这时自下而上的模式就很麻烦了。

  经过过去这些年的开发,我开始转变成使用自上而下的开发模式。我的第一步开发动作是用假方法模拟出流程中需要的底层接口、服务实现。里面没有真正的逻辑,只实现了对象间交互需要的部分。在这个开发阶段里没有测试,没有TDD。因为里面没有逻辑。代码非常简单,很方便让同伴进行代码审查和计划实现。

// 控制器方法
public Result Index(IncomingRequest incomingRequest)
{var res = service.Invoke(incomingRequest.X, incomingRequest.Y);return new Result(res);
}// 服务层方法
public QueryResult Invoke(int x, int y)
{return query.Execute(x, y);
} // 数据库查询方法
public QueryResult Execute(int id, int typeId)
{// 这里没有数据库查询逻辑,这是只是一个空的模拟接口。return new QueryResult();
}

  这样一来,任何一个程序员都可以自由选择开发任何一项任务。如果接口需要改变,则不会发生自下而上模式中的那种依赖另外一组程序员修改进度的情况。另外一个好处是,从一开始,任何一个功能点都是可以做用户测试的。

  自上而下的开发方便每一步都采用TDD开发。每一阶段开发有各自的测试程序,这保证了各个对象间协作逻辑的正确,保证了业务逻辑实现的正确。之前我说过最初的底层模拟阶段是没有测试的。但这不意味着我们没有对它们做TDD开发,我们的测试代码最终会驱动对这些模拟功能的真实实现。顶层的业务逻辑的确定决定了底层的数据服务接口,如果在底层需要增加一个新类,这很容易,它只是底层的实现,不会影响上层的业务流程。

  这种自上而下的开发方法并不是一个新事物,然而有很多人仍然没有看到它的好处。我计划在随后几个月里对这种实用主义风格的TDD做进一步的讨论。

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

自上而下的软件开发和自下而上软件开发相关推荐

  1. [架构之路-131]-《软考-系统架构设计师》-软件工程-1-软件工程方法大全(软件开发过程方法、软件开发过程模型、逆向工程、净室软件工程)

    前言: 第3章 软件工程 3.1 软件开发过程方法 3.1.1 什么是软件工程 软件工程是一门研究用工业硬件生产的工程化方法构建和维护有效.实用和高质量的软件的学科. 它涉及程序设计语言.数据库.软件 ...

  2. 软件工程,开发模型,软件开发流程

    软件工程 (Software Engineering,简称为SE)是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模 ...

  3. 一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...

    接触软件行业很多年有些年头了,展望过去的岁月,总想写点儿东西,总结总结,我也 不怕拍砖了,曾经也换过很多公司.跳过很多槽,现在想想,总结出来:"天下的乌鸦 是一样黑的",没有理想的 ...

  4. 软件开发向大数据开发过渡_如果您是过渡到数据科学的开发人员,那么这里是您的最佳资源...

    软件开发向大数据开发过渡 by Cecelia Shao 邵Ce It seems like everyone wants to be a data scientist these days - fr ...

  5. 软件技术基础_软件技术(游戏软件开发)专业介绍

    软件技术(游戏软件开发)专业 核心课程 C++程序设计.Java程序设计.C#程序设计.Cocos2d-x游戏开发.Unity3D游戏开发.Android游戏开发.IOS游戏开发.游戏框架设计.游戏服 ...

  6. 4 年开发 43 款软件,这位乡村教师火了

    整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 今天,一则#乡村教师自学编程4年开发43款软件#的话题冲上微博热搜.主人公彭龙是四川泸州一名乡村数学教师,4年多来他自学编程,开 ...

  7. rp软件app流程图_如何开发app软件,流程怎样

    好的APP开发公司有哪些 手机app开发分为Android客户端开发.iOS客户端开发.Symbian客户端开发.Windows Phone和BlackBerry OS等定制开发.如果找公司做的话,和 ...

  8. 在Linux下开发多语言软件(gettext解决方案)

    最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言 ...

  9. 软件的复用技术及开发方法

    软件的复用技术及开发方法 2.1软件的复用技术 软件复用是指在开发新的软件系统时,对已有的软件或软件模块重新使用,该软件可以是己经存在的软件,也可以是专门的可复用组件[8].软件可复用性的高低影响到生 ...

最新文章

  1. 网关是个啥?为什么电脑不设置网关就没法上网?笔记本为啥不用设置网关?
  2. 使用Dockerfile定制镜像-定制Tomcat为例
  3. 归属地的判断规则有吗_IPO|创业板注册制规则-详解股权激励新规
  4. Discuz!X安装配置
  5. tcp与ip协议的区别
  6. 物化视图VS普通视图
  7. android过滤html标签,Android中处理TextView带超链接HTML标签的点击事件处理方法
  8. 大厂必备!不断提升自己创造溢价的能力
  9. linux 常用头文件,(常用头文件详解.doc
  10. 用jquery模仿的a的title属性
  11. css table设置边框_table布局的一些总结
  12. c++篇 vc++2010设置和c#一样的代码段,vs2010 两下tab设置
  13. php配置mysql集群_【mysql集群】mysql集群配置
  14. MySQL安装详细图解
  15. atitit 完整的知识体系表 学科体系表 v2
  16. PGIS 天地图主题颜色背景修改 图片 filter 蓝色 HTML CSS IMG filter 颜色矩阵在线计算 RGBA转换 SVG  feColorMatrix
  17. excel函数公式大全
  18. 求一堆点中的最大点集合(边界点)
  19. oracle中同义词的用法,Oracle中定义以及使用同义词的方法
  20. 细胞分裂(洛谷 P1069)

热门文章

  1. 日政府阻止东芝卖半导体业务 后者考虑卖别的业务
  2. ansible-playbook mysql剧本
  3. java uuid jug实例(采用开源jug)
  4. 2022中国可信链大赛初赛赛题全解
  5. 全球与中国超高纯度热交换器市场深度研究分析报告
  6. 卡方线性趋势检验_统计学第七章 卡方检验【R语言实现】
  7. 《网络空间安全概论》学习笔记
  8. igs网站里爬o文件和广播星历和tkinter使用
  9. 九州贯连:智能体重秤为什么卖得贵,是因为考研英语二会考嘛?
  10. sublime的reopen with encoding和reload with encoding区别