写点什么

争论:编写可维护的代码

  • 2007-06-26
  • 本文字数:1337 字

    阅读完需:约 4 分钟

在.NET 社区里, Sam Gentile Oren Eini(昵称 Ayende) Frans Bouma 正在就如何编写可维护的代码进行一场争论,还有不少人也加入了战局。争论的焦点集中在一个问题:测试驱动开发(TDD)、对象 / 关系映射(ORM)、Model-View-Presenter/Controller(MVP/MVC)以及其他最佳实践是否有助于提高软件的可维护性。

Jdn 以他对可维护性的一些想法开始了这场争论,Jdn 表达了他对 TDD、ORM 和 MVP/MVC 可能妨碍而不是促进了生产效率和可维护性的担心:

我有一个问题(好吧,其实不只一个)。我清楚知道我将把这个程序交给别人。维护它的人不会是我。我了解将要接手的人,因此我知道他们掌握的技能,我知道他们对编码方式的偏好。

Oren Eini 以一篇《可维护,对谁来说?》作出了回应。他同意对于不熟悉 TDD、ORM、MVP/MVC 的开发者来说,维护一个采用这些实践和框架的系统是很困难的(甚至是不可能的)。但他认为保留坏的实践,而只为了方便别人维护是一个糟糕的借口:

走回头路在我看来是最失败不过的了……。这不过是“我们一直都这样做”的老生常谈。当然,你可以用骡子来耕田,没问题。但一架拖拉机可以做得更好,即便你要先学会驾驶它。

Sam Gentile 赞同 Oren 的说法,他也认为向开发者传授最佳实践,如 TDD、DDD 和 ORM 等,对“真实世界”的项目来说,是值得花的代价。他在博客上总结了这场争论,并对 Frans Bourma 写的《没有坚实的文档行不通》作出了回应。Bouma 认为 TDD 无助于理解软件内部的行为,并且“很可能缺乏有深度的设计文档,以来阐述为什么一段代码要这样写,以及比如为什么不采用 B 和 C 算法等等。这些都是提高软件可维护性的重要信息。” Sam Gentile 回应说:

并不是只有单元测试。这些代码都是经过结对编程高度重构过的。当人们谈论代码的可维护性和“可扩展性”时,并不是在说什么插件。而是持续地改进代码的内部实现,将之重构成简单和可维护的代码。我坚持认为这样开发出来的代码更具可维护性,也为将来的代码增长打下了基础,将来不需要破坏一切再重新开始。让我们换个说法:我可以一个月不去看代码库,只要有单元测试和构造良好的代码,在几分钟之内我就能够了解现在的进展。

Frans Bouma 接受了挑战,并反击到:“要正确地分析代码和完全理解代码需要耗费很多的努力。这是‘代码就是文档’流派经常犯的错误”。他认为“代码不能替代你的文档:它只显示了现在的实现是什么,而没有说明为什么没有采用另外一种实现;而且代码是糟糕的文档:它没有用人类最容易理解的方式来说明代码的工作原理。” Oren Eini再次加入战局并声称他对这个问题的解决办法是“投入很多时间来想出有意义的命名,以及在测试里涵盖基础设施的所有方面”。对于 Bouma 的论点“文档并不是与代码分离的实体:它是用某种 DSL(即人类可阅读和理解的语言)写成的对功能性的描述”,Oren 回应说:

文档不是 DSL,而且在很多情况下几乎可以肯定文档是难以理解的。文档可能有很多模糊不清的微妙之处。代码并不是某种 DSL,这种说法假设了代码与文档存在某种关联,但代码才是实际运行的东西,因此对任何系统来说,代码才是权威的。

虽然这场争论很大程度上是在重复“代码就是文档”的老争论,但仍然提出了许多值得深思的新想法和新论点。您的想法如何?

查看英文原文: Writing Maintainable Code

2007-06-26 01:111329
用户头像

发布了 225 篇内容, 共 75.4 次阅读, 收获喜欢 53 次。

关注

评论

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

SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍

汪子熙

云计算 云原生 SAP abap 6月月更

数据库每日一题---第2天:查找重复的电子邮箱

知心宝贝

数据库 算法 前端 后端 6月月更

给 Print SQL Connector 添加随机取样

JasonLee实时计算

flink 源码 flink 实战

bootstrap深入学习

恒山其若陋兮

6月月更

5分钟了解CDN的功能及原理

穿过生命散发芬芳

CDN 6月月更

Flink 源码:广播流状态源码解析

JasonLee实时计算

flink 源码

IDEA 中使用 Big Data Tools 连接大数据组件

JasonLee实时计算

flink

Android 音视频——NuPlayer的渲染模块

程思扬

音视频 安卓 音视频开发

Redis篇之协议与序列化

邱学喆

redis协议 序列化操作 luttuce

【LeetCode】独特的电子邮件地址Java题解

Albert

LeetCode 6月月更

java可变参数(详解+代码样例)

写代码两年半

面试 javase 可变参数 6月月更

测试的核心竞争力是什么?

老张

软件测试 核心竞争力

如何在 WordPress 中嵌入 iFrame

海拥(haiyong.site)

WordPress 6月月更

vue基本语法使用

小恺

6月月更

ES6集合引用类型Map与WeakMap

大熊G

JavaScript 前端 6月月更

【Spring 学习笔记(三)】Spring Bean 属性注入

倔强的牛角

spring Java EE 6月月更

创业 2 年值得分享的事情

琚致远

创业 apache 社区

如何在项目中直接使用Hystrix?

编号94530

Java spring Hystrix 熔断器

透过华为军团看科技之变(二):机场轨道

脑极体

日本动画发展史简述——动画及日本动画起源

头顶胖次

6月月更

SDN系统方法 | 3. 基本架构

俞凡

架构 网络 sdn SDN系统方法

linux驱动开发_文件系统本地挂载

DS小龙哥

6月月更

React Native 资源更新增量包的优化实践

Shopee技术团队

前端 React Native

leetcode 77. Combinations 组合(中等)

okokabcd

LeetCode 搜索 算法与数据结构

Flutter:创建透明/半透明的应用栏

坚果

6月月更

【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!

冰河

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

Discourse 支持中文用户名

HoneyMoose

网页设计制作要注意哪些问题

源字节1号

JS语言基础

Jason199

js 6月月更

每日一题 | LeetCode 242 有效的字母异位词

武师叔

哈希表 Leet Code 6月月更

拒绝八股文!这篇图解动态路由分分钟爱了

wljslmz

网络工程师 网络技术 动态路由 6月月更 路由协议

争论:编写可维护的代码_Java_Hartmut Wilms_InfoQ精选文章