直到得知 D-R-Y 这个词并不仅仅是干燥的意思,终于找到一个比模块化更好的形容词。对于你或者团队,DRY 是几乎是你代码看起来达到效果的一切。为什么?看一下这段 JS 代码,对于不同领域的人回答将会相差很多:
// 代码返回函数 prototype_vs_literal 所传入的参数
function prototype_vs_literal() {
return Array.prototype.slice.call(arguments);
// 或者
return [].slice.call(arguments);
}
对于熟悉 JS 的同学来说,可能会考虑究竟是直接引用 prototype
快呢,还是使用字面显快。事实上他们相差无几;对于喜欢简洁的同学或者网速优化的同学来说,可能更喜欢字面量,因为节省了特别多的字符;对于喜欢代码看起来就像读语句的同学,可能更喜欢 prototype
的写法具语义。说到最后,无论是从代码本身的性能,还是其对网站所产生的网速影响来说,都是微乎其微的。这相当于说,无可挑惕,只有内行人或者我们自己才会去深入。
但,让我们来看看这样的代码:
if(condition_a) {
var str = condition_a.trim().replace(/^{(\w+)}$/, function(match){
// ...
});
} elseif(condition_b) {
var str = condition_b.trim().replace(/^{(\w+)}$/, function(match){
// ...
});
} elseif(condition_c) {
var str = condition_a.trim().replace(/^{(\w+)}$/, function(match){
// ...
});
} else {
var condition = defaultValue;
str = condition.trim().replace(/^{(\w+)}$/, function(match){
// ...
});
}
你可以同样改成 switch,改成任何一种写法,很多情况下,分支还是必要的。但如果分支内的还是重复着自己已经写过的代码,那么再怎么写,无论是谁,看到都会觉得或许还值得优化,让我们尝试一下修改?
修改之前说一下:DRY,是 Dont Repeat Yourself 的缩写。WikiPedia 的一个解释:
In software engineering, Don’t Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of information of all kinds, especially useful in multi-tier architectures. … When the DRY principle is applied successfully, a modification of any single element of a system does not require a change in other logically unrelated elements.
那么,看看这段代码是否更 DRY 一点?
function dry(condition) {
condition = condition || defaultValue;
condition.trim();
return condition.replace(/^{(\w+)}$/, function(match){
// …
});
}
if(condition_a) {
dry(condition_a);
} elseif(condition_b) {
dry(condition_b);
} elseif(condition_c) {
dry(condition_c);
} else {
dry();
}
把重复的逻辑抽象成一个函数,在分支中只调用函数,而不再一次定义一个新的函数内部逻辑。当然,通常情况,我们还是会认为这是不够的。为什么要重复这么多分支?那么是还可以根据情况来优化一下?当然!而原则是 DRY。
细心一点,其实关于从大方面(多行/多模块/多系统)上来说,DRY 几乎是一切。看看我们的代码,想象一下 OOP 思想,是不是也都是为了 DRY?那么,单从这点上:
一、继承
扩展父模块,获得其所拥有的方法和属性,而不用再写一次:
class Module {
public function hello(){}
public function dry(){…}
…
}
class Special_Module extends Module {
// 默认已经拥有 Module 的属性和方法
// 比如 hello() 方法
public function dry(){
// 我们已经拥有 dry,有必要时我们还可以重写
}
public function specific_something_special(){}
}
二、封装
就拿我们上面提到过的函数来说,提供抽象的接口,并隐藏它们的具体实现。最终使用只需要调用,而不是直接再重写一遍:
function dry(condition) {
condition = condition || defaultValue;
condition.trim();
return condition.replace(/^{(\w+)}$/, function(match){
// …
});
}
dry(‘传入的条件’);
想像一下 php 中的 is_array()
,jQuery 插件,NodeJS 的 npm 包,他们都在做这样的事,提供接口,隐藏具体实现,最终提供你一个可以重用的方法、文件或者模块。像 jQuery 插件,你可以直接在页面上使用,而不用每次都复制进去一段代码:
<script src="fish.plugin.js"></script>
<script>
$('#sofish').fish()
</script>
哈哈,那么你的代码够 DRY 么?写了这么些字,也只是想说一句:Dont repeat yourself,you’re a hacker!
分享到:
相关推荐
实际上,重复的代码不一定违反 DRY 原则,而且有些看似不重复的代码也有可能违反 DRY 原则。除此之外,DRY 原则与代码的复用性也有一些联系,所以,今天,我
大多数的开发人员在讲DRY(Don'tRepeatYourself)的时候大多认为DRY是功能和代码的重复,也就是OAOO(OnceAndOnlyOnce),其实不尽然。面向对象设计提倡的OAOO,强调的是利用面向对象的继承、组合等特性尽量让一个功能点...
dryrun能够直接运行github上项目的工具.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
测试驱动开发JAVAscript商业软件内容简介:《编写可靠的Javascript代码 测试驱动开发Javascript商业软件》分为5个部分:第Ⅰ部分“奠定坚实的基础”涵盖了软件工程的关键概念,例如SOLID和DRY原则...
这是一款android名片识别的源码,希望可以帮助那些想学习名片识别的童鞋!
vuex-dry有助于使您的vuex代码保持干燥。 它没有介绍使用vuex的任何全新方法。 它仅需最少的代码即可帮助您构建模块,并添加一些便捷的getter,变异和操作。 vuex-dry是用TypeScript编写的,因此对TypeScript友好。...
本书分为5个部分: 第Ⅰ部分“奠定坚实的基础”涵盖了软件工程的关键概念,例如SOLID和DRY原 则,还讨论了单元测试和测试驱动开发的优点。 在第Ⅱ部分“测试基于模式的代码”中,我们描述并使用测试驱动开发创建了 ...
dry_crud 帮你生成简单和可扩展的控制权、视图以及助手类 (Ruby on Rails),用以实现符合DRY(Don't Repeat Yourself)原则的CRU代码。
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和内置类 ...
让您的应用程序代码,干燥,copypasta免费与Ember.js 1.13.x和更高的计算性能MAC一个RO妮S(宏)。 为什么 计算属性宏(CPM)非常适合干燥代码,Ember.js附带了。 此附加组件添加了更多的功能样式的宏,可以将其视...
dryrun Try any android library hosted online directly from the command line <!-- --> <!-- --> Install gem install dryrun Usage dryrun ...
python的装饰器就是一种代码简洁的手段,在函数和方法有改动时,使得改动量最小。这篇文章给大家介绍了Python 装饰器实现DRY(不重复代码)原则,感兴趣的朋友一起看看吧
matlab代码 已提交 Chan、Hassanzadeh 和 Kuang 中显示的数据。 引文:(接受后补充) 该存储库包括: 论文中的数字*.pdf 绘图脚本*.ncl和必要的 netCDF 数据文件ensemble-wise/*.nc 强制、名称列表和其他文件来驱动...
DRY(Dont Repeat Yourself) DRY(Dont Repeat Yourself) DRY(Dont Repeat Yourself) DRY(Dont Repeat Yourself) DRY(Dont Repeat Yourself) - 保持代码清晰高效,这个一直是我喜欢 rails railsrailsrails的原因之一 ...
leetcode卡重复自己,DRY 编码和其他技能一样是一种技能,例如弹吉他,因此需要专门的练习才能进行编码。 这个项目是让我计划和跟踪我的编码实践。 所以这个想法是, Do Repeat Yourself ,又名,干!! (是的,...
干碎屑 dry_crud生成简单且可扩展的控制器,视图和帮助器,以支持您在Rails项目中干燥CRUD代码。 只需5分钟即可列出,搜索,排序,显示,创建,编辑和销毁任何模型条目。 从这些工件开始,并建立一个干净的基础,以...
大多数的开发人员在讲DRY(Don'tRepeatYourself)的时候大多认为DRY是功能和代码的重复,也就是OAOO(OnceAndOnlyOnce),其实不尽然。面向对象设计提倡的OAOO,强调的是利用面向对象的继承、组合等特性尽量让一个功能点...
MATLAB计算日尺度旱涝急转指数(Dry-wet abrupt alternation index,DWAAI) 读取Excel数据,方便替换数据。 2.代码说明:注释清晰,参数和变量说明清晰,方便更改、方便初学者使用。 3.适用对象:计算机、电子...
BusinessAdminstration:此项目的内容包含DDD,TDD,代码优先,异步任务,KISS,DRY,CLEAN CODE Y SOLID