`

代码之 DRY

 
阅读更多

直到得知 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!

分享到:
评论

相关推荐

    21丨理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?1

    DRY(Don't Repeat Yourself)原则是软件开发中的一个核心原则,它强调的是避免代码的冗余,确保每个知识在程序中只存在一处。DRY原则的实施有助于提高代码的可维护性和可读性,因为它减少了修改一处逻辑时可能需要...

    前端开源库-json-dry

    “json dry,不要重复”这句话是对DRY(Don't Repeat Yourself)原则的引用,这是一个软件开发的基本原则,鼓励代码重用,避免重复。在JSON-dry库中,这一原则体现在减少JSON数据中的冗余信息,提高数据存储和传输的...

    Python 装饰器实现DRY(不重复代码)原则

    DRY原则是软件开发中的重要原则之一,它建议每一个程序逻辑都应当位于系统的唯一位置。如果某段代码在多处出现,就应当将其抽象出来,只在一处维护。 在Python中,装饰器本质上是一个函数,它能够接收另一个函数...

    读代码整洁之道幻灯片笔记

    9. **DRY原则**:Don't Repeat Yourself,避免重复代码。如果一段代码在多处出现,考虑抽象为函数或模块,以提高代码复用性和可维护性。 10. **设计模式**:运用设计模式可以解决常见的编程问题,如单例模式、工厂...

    重构java代码简洁之道

    3. **消除重复代码(DRY)**:遵循“Don't Repeat Yourself”原则,避免代码冗余,将重复的逻辑抽象成公共方法或类。 4. **引入参数对象**:当一个方法接收过多的参数时,可以考虑创建一个包含这些参数的对象,提高...

    Ruby-dryrun直接从命令行中尝试任何Android库在你的手机上

    "0bc2c80" 可能是Git仓库中的一个特定提交ID,代表了这个版本的代码状态。 使用 `dryrun` 的步骤可能包括: 1. 安装Ruby和`dryrun` gem:首先,确保你有一个有效的Ruby环境,然后使用`gem install dryrun`命令安装...

    代码之美中文版

    此外,还涉及了DRY(Don't Repeat Yourself)原则,避免重复代码,提高代码复用。 4. **重构与优化**:《代码之美》强调了重构的重要性,通过改善代码结构而不改变其外在行为,提升代码质量。同时,书中也讨论了...

    中粮我买网代码规范

    - **DRY原则**:代码复用应尽量避免重复。 - **SHY原则**:指的是在代码复用中要慎用继承。 - **可变与不可变分离**:分离程序中的可变和不可变部分,以提高代码的灵活性和可维护性。 - **对象组合与类继承**:优先...

    优雅的代码风格

    此外,遵循DRY(Don't Repeat Yourself)原则,避免重复代码。当发现多处代码相似时,考虑抽象出通用的方法或类。使用代码重构技术,使代码结构更加合理。 最后,代码风格的一致性也非常重要。团队应制定统一的编码...

    微软一站式代码示例编程规范.rar_微软代码规范_编码规范

    5. **代码复用**:遵循DRY(Don't Repeat Yourself)原则,避免重复代码。合理使用继承、封装和多态性来实现代码的重用。 6. **单元测试**:强调编写单元测试,确保代码的功能正确,并在后续修改时作为回归测试的...

    dry_ex-master.rar

    【标题】"dry_ex-master.rar" 是一个压缩文件,很可能包含了一个名为 "dry_ex-master" 的项目的源代码。这个名称暗示可能是一个关于干燥或者湿度控制相关的项目,因为 "dry" 通常与干燥有关,而 "ex-master" 可能...

    《重构——改善既有代码的设计》第一个案例代码

    1. **消除重复代码 (DRY原则)**: 如果代码中有多个地方执行相同或相似的任务,那么应该考虑提取出公共部分,创建一个单独的函数或方法。这有助于减少错误,提高可维护性,并使代码更易理解。 2. **简化条件表达式**...

    快速format规范代码

    同时,了解并学习行业内的最佳实践,比如SOLID原则、DRY(Don't Repeat Yourself)原则等,这些都能提升代码质量。 最后,代码规范的持续更新和优化也是必要的。随着编程语言的发展和最佳实践的变化,规范应随之调整...

    几个写代码的好习惯,对写好代码很用帮助

    5. **避免重复代码(DRY原则)**:尽可能重用代码,不要复制粘贴。创建函数或方法来封装重复的逻辑,以提高代码复用性和可维护性。 6. **使用合适的字符集和编码**:确保代码文件使用统一的字符集,如UTF-8,并且在...

    ActionScript3代码规范

    8. **代码重复(DRY原则)**: - 避免代码重复,尽可能地将重复的代码抽取为函数或方法。 9. **访问修饰符**: - 正确使用`public`,`private`,`protected`修饰符,确保数据和方法的可见性。 10. **代码格式化*...

    简明代码和代码重构思维导图

    - **DRY(Don't Repeat Yourself)原则**:防止知识在系统中的重复,确保每一项知识在系统中有且仅有一个表示。 2. **重构** - **识别坏味道**:如过长函数、重复代码、复杂的条件表达式等,这些都是需要重构的...

    架构设计最佳实践之DRY

    大多数的开发人员在讲DRY(Don'tRepeatYourself)的时候大多认为DRY是功能和代码的重复,也就是OAOO(OnceAndOnlyOnce),其实不尽然。面向对象设计提倡的OAOO,强调的是利用面向对象的继承、组合等特性尽量让一个功能点...

    代码坏味道整理

    1. **重复代码(DRY原则)**:如果相同的代码片段在多个地方出现,那么就违反了“Don't Repeat Yourself”的原则。应该将重复的代码提取到一个单独的函数或模块中,以实现代码重用。 2. **过长方法**:当一个方法...

    dryrun能够直接运行github上项目的工具.rar

    dryrun能够直接运行github上项目的工具.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    go-dry:Go的DRY(不要重复自己)软件包

    在编程领域,DRY(Don't Repeat Yourself)原则是一项重要的设计准则,它强调避免代码冗余,以提高代码的可维护性和复用性。在Go语言的世界里,`go-dry`是一个专门遵循这一原则的软件包,它提供了工具和模式来帮助...

Global site tag (gtag.js) - Google Analytics