自上而下、自下而上的软件开发

首先说明本文是软件开发方面,不是什么心理学、社会主义形态。

自上而下(top-down):也称逐步设计,指从一个应用的最高点开始开发。从最高点逐步往下层编码,直到开发完所有的任务。一旦写完了最下层的代码,开发任务就完成了。使用这种方式,你需要设计、编写出所有你需要的但还没有实现模拟接口、服务、伪代码。相对于“黑匣子”,自上而下的设计方法更容易操作,“黑匣子”可能无法阐述基本的构成要素和模型。

自下而上(bottom-up):指从一个应用的最底层开始开发。这种方式的考量在于认为最底层是应用中最复杂的部分,或者认为是最重要的部分。这种模式下系统将从一个个小模块做起,最终构建起整个系统。小模块之间是基于访问-处理而进行相互通讯,彼此间相互联系组成一个大的系统。

程序员中有些人有一些洁癖、强迫症的偏好,这并不是表示你写的代码有多强,这是一种不好的习惯,如果你养成了这种习惯,你会发现自己很难阅读别人的代码,而自己每天只能写一些小功能、小demo,同时自己写的小功能、小demo别人一样也看不懂。

假设有一个四个人的开发团队,要完成一个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开发,我们的测试代码最终会驱动对这些模拟功能的真实实现。顶层的业务逻辑的确定决定了底层的数据服务接口,如果在底层需要增加一个新类,这很容易,它只是底层的实现,不会影响上层的业务流程。

即使是以后自己写框架,往往很多事情不是一步到位,我们需要什么,可能是未知的,我们就用一个“假的”对象或者接口作为代替,当大部分东西都凑齐了,再来编写那些“假的”对象或接口。

时间: 2024-08-01 05:49:04

自上而下、自下而上的软件开发的相关文章

QT开发(二十三)——软件开发流程

QT开发(二十三)--软件开发流程 一.软件开发流程简介 软件开发流程是通过一系列步骤保证软件产品的顺利完成,是软件产品在生命周期内的管理学. 软件开发流程的本质是软件开发流程与具体技术无关,是开发团队必须遵守开的规则. 二.常见软件开发流程模型 常见的软件开发流程模型包括即兴模型.瀑布模型.增量模型.螺旋模型.敏捷模型. 1.即兴模型 即兴模型的特点: A.与用户交流后立即进行开发 B.没有需求分析和需求发掘过程 C.没有整体设计和规划 D.没有软件文档,可维护性差 2.瀑布模型 瀑布模型的特

小议敏捷软件开发与传统软件工程

敏捷软件开发与传统软件工程 一.前言 随着社会和科技的不断发展,信息产业己经和人们的生活息息相关,成为不可或缺的一部分.软件工程作为信息产业的核心部分发生了翻天覆地的变化.传统的软件工程思想己经越来越不适应快速变化的信息社会,为此一种新软件工程思想-----敏捷软件开发进入了我们的视野. 二.软件工程 (一)概述 Software engineering is the application of engineering to the design, development, implement

敏捷软件开发简述

前言:由于我读了邹欣老师的<构建之法:现代软件工程(第二版)>,因此对敏捷软件开发有了比较大的兴趣.于是我在网上找了一些论文,比如Requirements Engineering and Agile Software Development.A decade of agile methodologies: Towards explaining agile software development.在读了这些论文之后,对敏捷软件开发有了大致的了解.这篇博文主要是简单介绍敏捷软件开发,重点集中在主

华为软件开发云测评报告一:项目管理

体验环境 体验方式:PC端 系统:Windows 64位 浏览器类型:Chrome浏览器 浏览器版本:49.0.2623.110 m 体验时间:2017.05.11 测试目的 了解华为软件开发云的项目管理服务功能,分析其优缺点: 瀑布化开发到敏捷开发的转型分析,以及未来软件开发模式的发展方向: 产品简介 产品名称:华为软件开发云 定位:软件开发云(DevCloud)是集华为研发实践.前沿研发理念.先进研发工具为一体的研发云平台,面向开发者提供研发工具服务,让软件开发简单高效. 产品slogan:

软件开发-MSF方法(《构建之法》读书笔记2)

MSF-微软解决方案框架,是一套大型系统开发指南,它描述了如何用组队模型.过程模型和应用模型来开发Client/Server结构的应用程序,是在微软的工具和技术的基础上建立并开发分布式企业系统应用的参考.在现在的软件开发项目中每一个软件开发项目都要经过 一个生命周期.MSF过程模型是从传统的软件开发瀑布模型和螺旋模型发展而来的,它瀑布模型中基于里程碑的规划与螺旋模型中的增量迭代的长处结合起来.MSF作为现在流行的软件开发思路,其有自己的基本原则. MSF基本原则: 1:推动信息共享和沟通 2:为

软件工程:传统软件工程 vs 敏捷软件开发

前言 软件工程(Software Engineering): 是一种层次化技术. 将系统化的.规范的.可量化的方法应用于软件的开发.运行和维护,即将工程化的方法应用于软件. 研究"建立和使用一套合理的工作原则,以便经济地获得可靠的.可以在实际机器上高效运行的软件"的方法. 敏捷软件开发(Agile software development): 一种应对快速变化的需求的一种软件开发方法.基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作. 一.传统软件工程 (一)产生背景 随着

阅读作业中软件开发书籍阅读后的一些体会

No Silver Bullet: Essence and Accidents of Software Engineering(Frederick P. Brooks, Jr.) 在这篇文章中,作者将内容分成了三大部分,第一部分介绍了软件开发中根本的——软件特性中固有的困难,而这些困难是:软件实体的复杂性.软件和其它接口的一致性.软件实体的可变性以及软甲本身的不可见性.这是这些根本的特性导致了软件开发的困难. 第二部分讲了次要的——出现在目前生产上的那些困难.作者列举了软件领域中取得的最富有成效

软件开发工作量的估算方法

在讨论软件工作量估算方法前,首先要清楚什么事软件工作量估算. 我理解的工作量估算,就是估算软件项目所耗费的资源数,这个资源包含人力和时间,一般用人天.人月的形式来衡量.(而软件的成本=耗费的资源*资源的单价).而且我个人觉得软件工作量与软件规模是不等的,规模是指大小是固定的,而一个软件开发的工作量与许多因素有关,如公司的效率啊,参与开发人员的编程水平等. 从估算单位角度来说,工作量估算的方法分为两类:直接估算法和间接估算法.直接法指基于WBS的工作量估算方法,直接估算出人天工作量:间接估算法是先

敏捷软件开发VS.传统软件工程

敏捷软件开发 VS. 传统软件工程 本文主要介绍敏捷软件开发与传统软件工程分别是什么,并讨论二者各自的优缺点. 一.传统软件工程 1.传统软件工程的由来 进入上个世纪60年代,人们开始逐渐认识到了确实存在着"软件危机" 这样一个事实.例如: ·软件生产不能满足日益增长的需要 ·软件开发成本和开发进度估计往往不准确 ·软件开发人员和用户之间信息交流不充分,用户对完成的软件满意度很低 ·软件价格昂贵,软件成本在整个计算机系统中所占的比例急剧上升,软件已成为许多计算机系统中花钱最多的项. ·