DRY(Don’t Repeat Yourself)是架构设计中经常用到的一句话,这一原则应用非常广泛,在程序设计中同样会用到,不少代码或许不知不觉中违反了这一定义,如《程序员修炼之道》一书中就有如下一题,重构下面一段代码
if (state == TEXAS) {
rate = TX_RATE;
amt = base * TX_RATE;
calc = 2 * basis(amt) + extra(amt) * 1.05;
} else
if ( (state == OHIO || (state == MAINE)) {
rate = ((state == OHIO) ? OH_RATE : ME_RATE);
amt = base * rate;
calc = 2 * basis(amt) + extra(amt) * 1.05;
if (state == OHIO)
points = 2;
} else {
rate = 1;
amt = base;
calc = 2 * basis(amt) + extra(amt) * 1.05;
}
可能很多人读此代码都有似曾相识之感,不错,我们身边不少程序员就是如此编程的。这段代码就是由于太多Repeat造成罗嗦难懂,结构复杂,维护困难。大家可能都会迅速想到两点重构方法
1. amt, calc 可以移出来
2. 第2个if可以拆分
但是这样就完美了吗?4个if/else是否让人闻到一股不对劲的气味?这段程序是否还是传统结构化编程思维?if条件中state再增多程序会怎样?因此虽然是一段很短的代码,但是重构优化实际是无止境的。
再谈巧合编程(Don’t Programmer by Coincidence),在很多项目中其实也很常见,巧合编程就是有问题的代码在开发过程中恰好能运行通过,但是运行在别的环境很容易就出问题,比如下面的C++代码
a = 2;
b = 3;
if (a + b != 5) exit(1);
什么情况会exit(1)?
传统智慧认为,项目一旦进入编码阶段,工作主要就是机械的把设计转换成可执行语句。这种态度是许多程序低效、不可维护的最大原因。
⋯
我们大多数人都能够几乎自动地驾驶汽车,我们不用明确的命令我们的脚踩刹车,或是命令手动方向盘,我们只是想“减速并右转”。但是,可靠的司机会不断查看周围的情况,检查潜在的问题,并且让自己在万一发生意外时处在有利的位置上。编码也是这样。
因此开发过程质量问题非常重要, 有经验的程序员懂得如何避开前进过程中的各种雷区。Code review就是在你的驾驶过程中,由另外一名有经验的驾驶员坐在副驾的座位上,帮你纠正各种危险的驾驶习惯,避免在当时或以后踏入各种已知的雷区。
- 大小: 19.3 KB
分享到:
相关推荐
dryrun - 直接从命令行中尝试任何Android库在你的手机上
开源项目-moncho-dry.zip,Dry v0.8b1 released: featuring Docker Swarm support
前端开源库-json-dryjson dry,不要重复,json:添加对(循环)引用、类实例等的支持。
资源来自pypi官网。 资源全名:stem-dry-run-1.5.4.tar.gz
Android-dryrun.zip,尝试任何android库的演示项目,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
JSON-dry允许您对包含循环引用,日期,正则表达式等的对象进行字符串化处理。 它也可以用于序列化和恢复您自己的类的实例。 目录 安装 $ npm install json-dry 用法 基本例子 这是一个字符串对象(包含对同一对象...
干 -干(不重复)的Go软件包 -文档: ://godoc.org/github.com/ungerik/go-dry
vuex-dry有助于使您的vuex代码保持干燥。 它没有介绍使用vuex的任何全新方法。 它仅需最少的代码即可帮助您构建模块,并添加一些便捷的getter,变异和操作。 vuex-dry是用TypeScript编写的,因此对TypeScript友好。...
一种基于格子Boltzmann理论的干湿边界处理方法,刘海飞,丁禹,本文基于一维浅水方程的格子Boltzmann模型,开发了一种干湿边界处理方法。通过Chapman-Enskog和泰勒展开公式,将干网格和湿网格联系起来�
nco matlab代码 已提交 Chan、Hassanzadeh 和 Kuang 中显示的数据。 引文:(接受后补充) 该存储库包括: 论文中的数字*.pdf 绘图脚本*.ncl和必要的 ...强制、名称列表和其他文件来驱动模型( ...使用fms-output/*/...
逻辑回归、感知机、深度神经网络、支持向量机等模型训练数据。
节点DRY pg 用于我们的节点微服务的可重用utils库,引入了pg作为依赖项并提供了辅助功能! 这些程序包不包含任何业务知识,但是包含可重复使用于所有服务的纯可重用功能。 主要存储库可以在这里找到: 如何使用 像...
gem 'activeadmin-dry-validation' 用法 ActiveAdmin . register SomeResource do permit_params :title , :announcement , :some_attr schema do required ( :announcement ) . filled ( :str? ) required ( :...
18f-dryrun-示例这是一个在 Rails Asset Pipeline 中使用 Webpack 和 React 的入门工具包。 为什么? 因为必须将您在 Ruby Gem 中找到的每个 NPM 模块都包装起来是浪费时间。 还可以更好地确定您的 JS 依赖项! 这...
电影浏览器应用 入门 分叉和克隆此回购 确定选择的技术: jQuery的 React 在index.html取消注释相应的脚本部分 编译应用程序
20.10.0以下载代理二进制文件或使用--dryrun选项获取下载 URL ./get-agent.sh download sun-java -v 20.6.0 --dryrun 支持的代理类型 如果您需要不在列表中的代理,您可能会创建一个问题 代理类型 描述 sun-java或...
名称mimi - dbi 迁移概要 mimi migrate --dsn=<dsn> --schema=<directory> [--verbose] [--dry-run]mimi setup --dsn=<dsn> [--verbose] [--dry-run]mimi fix --dsn=<dsn> [--verbose] [--dry-run]mimi set --dsn=...
5.3.8 编程中的DRY规则 5.3.9 用hash对象传参 5.4 面向对象编程 5.4.1 面向过程编程和面向对象编程 5.4.2 JavaScript的面向对象编程 5.4.3 用面向对象方式重写代码 5.5 其他问题 5.5.1 prototype和内置类 ...
dry-configurable, 一个简单的mixin使 ruby 类可以配置 干可以配置 概要class App extend Dry::Configurable # Pass a block for nested configuration (works to any