免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

重构并非设计的替代品

  • 2009-02-10
  • 本文字数:1135 字

    阅读完需:约 4 分钟

Stack overflow 社区有人问了这样一个问题:“现在设计是重构的一个子集吗?”这个问题凸显了大家经常误解自然设计这种敏捷方法。敏捷中一个常用的信条是:“测试,编码,重构。如此反复!”然而这个方法并没有替代设计,只是把项目生命周期中的这种工作推广开来。

Phil H. 这样提出了他的问题:

新方法看上去是这样的:全心投入,把需要的东西编写出来,以完成特定范围内目标的第一阶段,然后根据需要重构,让解决方案显得优雅。代码库逐渐增加,永远 不会有很大的计划 / 分层设计这样的阶段。对我来说,这意味着软件设计被包含在重构之中,因为优雅的代码来自于重构的过程,而不是增量实现功能的过程。 难道我错了吗?

预先做大量的设计本身不是设计,它只是实现设计的一种方式。而敏捷实践者更倾向于另外一种方式,即当前的设计来自于实际要做的功能。设计是对系统需求的反应和适应,而系统需求本身会随着客户的需要在不断地发展和变化。

敏捷方法采用测试驱动,逐渐增加功能并演化系统设计,可以这样来表达:

  • 给新功能创建测试。
  • 运行测试,发现测试失败,因为功能还没有实现。
  • 编写恰好够用的代码实现需要的功能。
  • 运行测试,测试通过。
  • 重构代码,直到系统(包括新增的代码)变得优雅。

这种方法的本质是设计满足需要的功能就够了,不要受累去支持那些我们认为某天可能需要的功能。

Fabian Steeg 引用了 Kent Beck 的话,如此说道:

最终目标就是能够工作的简洁代码。[…] 首先我们解决“能够工作”这一部分,然后再解决“简洁代码”部分。这与架构驱动的开发恰恰相反,架构驱动的开 发中你首先解决“简洁代码”部分,然后当你解决“能够工作”的问题时,要从头开始,设法把你知道的东西集成到设计之中。

从字面意思上很容易让人误解这段话。有人就给了这样一个例子:

我在项目前期而不是中间就做很多决定,因为这时的成本最低。举例来说,如果早期我们使用平台依赖的技术开发程序,那么想替换该技术的话代价很高。如果开始编码前花时间考虑一下需要支持的平台,成本就低多了。

这个人就误解了“自然设计”的意思,认为敏捷开发人员预先根本不做思考。当前的设计需要综合考虑我们知道的所有信息。如果我们知道需要支持多个平台,就在设计中考虑到它。然而,如果确信只需要支持一个平台,我们不会因为‘某一天我们可能想移植’而更改设计。

敏捷的一些指导原则包括:

值得注意的是这些都是指导原则,不是值得盲目遵守的规则。之所以有这些原则是为了帮助熟练的开发人员做出决定,而不是告诉开发人员去做什么样的决定。

你是使用什么方法设计的呢?你怎样给代码和编码人员做架构的呢(没有毫无必要地限制它们)?欢迎留言与大家分享你的观点。

查看英文原文 Refactoring Not a Substitute for Design

2009-02-10 02:131655
用户头像

发布了 37 篇内容, 共 10.6 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

阿里云CIPU下笔惊雷,方寸间书写中国算力故事

脑极体

2023年广州美博会-2023年春季广州美博会

Geek_0b38bb

美博会 2023年广州美博会 春季广州美博会 3月份广州美博会

java就业培训 | 面试官如何判断应聘者能力的,这一篇就够了

@零度

JAVA开发

时序数据是如何被压缩的?具体有哪些可选择的压缩算法?

TDengine

数据库 tdengine 时序数据库

uni-app进阶之Weex/nvue【day6】

恒山其若陋兮

6月月更

人才一站式服务平台开发,高层次人才管理系统

a13823115807

科创人·酷渲科技创始人华少:用双赢思维做产品、连生态,实现规模化发展

科创人

帮助中心应该怎样设计?

小炮

基于深度学习的水冷工作站加速遥感测绘应用研发

蓝海大脑GPU

JDK8 HashMap如何实现?

源字节1号

软件开发

技能速成!教你10分钟内在电脑上配置运行Hive Metastore和Presto

Alluxio

presto 技能 Alluxio hive metastore 初学者

Javascript API自动代码生成需求征集

百家饭隐私计算平台创业者

JavaScript OpenAPI axios

web前端培训如何提高React界面性能

@零度

前端开发 React

转转统一权限系统的设计与实现(前端实现篇)

转转技术团队

前端开发 umijs 权限设计

特定MPC问题包含哪些常见技术,有什么作用,什么场景需要用到?

Jessica@数牍

隐私计算 安全多方计算 特定mpc问题

大数据系统包含哪些组件?需要过等保吗?

行云管家

大数据 数据 过等保

Neat Syntax Design of an ETL Language (Part 1)

Bright

数据开发 ETL 大数据开发 EasySQL

如何使用物联网低代码平台进行数据分析?

AIRIOT

物联网 低代码开发

多年亿级流量下的高并发经验总结,我毫无保留的写在了这本书中

冰河

并发编程 多线程 高并发 异步编程 6月月更

个推TechDay直播预告 | 6月22日,开启大数据降本提效的破局之道!

个推

大数据 分布式计算 分布式存储 标签

ABAP-调用WebService服务

桥下本有油菜花

abap

华为云携手鸿蒙,培养创新型开发者

华为云开发者联盟

云计算 鸿蒙 华为云

为什么不建议你用 MongoDB 这类产品替代时序数据库?

TDengine

数据库 tdengine 时序数据库

探索质量外延 - 质量安全故事

QualityFocus

质量管理 软件质量与安全

Vue-12-条件渲染(可重复元素)

Python研究所

6月月更

java程序员培训 | 10年后程序员的薪资会怎么样

@零度

JAVA开发

Flink框架中的时间语义和Watermark(数据标记)

百思不得小赵

大数据 flink 6月月更

云堡垒机单机部署的优缺点讲解-行云管家

行云管家

网络安全 堡垒机 云堡垒机 堡垒机部署

重构并非设计的替代品_敏捷_Chris Sims_InfoQ精选文章