代码之 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!

架构设计最佳实践之DRY 大多数的开发人员在讲DRY(Don'tRepeatYourself)的时候大多认为DRY是功能和代码的重复,也就是OAOO(OnceAndOnlyOnce),其实不尽然。面向对象设计提倡的OAOO,强调的是利用面向对象的继承、组合等特性尽量让一个功能点只存在一个地方,所以OAOO强调的是面向对象设计,以及功能代码方面。而DYR的范围比OAOO要广泛得多。DYR更多的是一种架构设计思想,在软件开发过程中的万事万物均可能重复,大到标准、框架、开发流程;中到组件、接口;小到功能、代码均纯存在自我重复。而DYR提倡的就是在软件开发过程中应消除所有这些自我重复。在软件过程中的自我重复,总的来说有五种类型 立即下载

相关推荐

KG²RAG框架:知识图谱增强大模型检索生成技术解析

知识图谱(Knowledge Graph)作为结构化知识表示的重要方式,与向量检索技术结合形成了新一代检索增强生成(RAG)框架。其核心原理是通过图神经网络编码器提取子图特征,并与文本向量空间对齐,实现结构化与非结构化知识的协同检索。这种技术显著提升了专业领域问答的事实准确性,在医疗诊断、金融分析等需要高可靠性响应的场景中具有重要价值。KG²RAG框架创新性地采用双通道处理架构,结合Neo4j等图数据库与Milvus向量数据库,通过动态检索调度器智能选择最优检索路径。实测表明该方案能降低40%以上的事实错误

weixin_29306875的博客 104

设计原则--DRY原则

DRY原则,英文名Don't Repeat Yourself 。中文直译:“不要重复自己”。很多人可能会对这条原则会有误解,认为长得一样的两段代码违反了DRY原则。其实不然,重复的代码不一定违反DRY原则,而不重复的代码也可能违反DRY原则。 DRY原则三种典型的代码重复情况:实现逻辑重复、功能语义重复和代码执行重复 1、实现逻辑重复,但语义不重复,并不违反DRY原则。 2、实现逻辑不重复,但语义重复,也算是违反了DRY原则 3、如果代码重复执行,那我们也认为它违反了DRY原则 注:实现...

铭 1889

官网下载STM32系列芯片的产品选型手册

官方提供了产品选型手册,便于工程师们进行产品选型。 那么,在哪下载"产品选型手册"呢?请看下文。

Weber Zhou 的博客 1万+

DRY 原则--设计模式

由于代码长度的过短,实现的相关的功能过于简单,使得我们没有感觉到dry的简单性,但是当我们所实现的功能真的变的强大的时候,这样的调用方法真的很减少很多我们敲代码的数量,这样的会使得我们的代码变得简单的很多。在这个例子里面我们就去调用这个相关的函数,把这个原本应该去输出两遍的这个输出的相关的函数,保证我们去调用我们实现的这个方法就会使得我们的代码调用的变得更加简练和美观。是符合某些原则的,在其他场景下就是不符合的,我们学习了dry原则,不能狭隘的。然而,并不是所有看起来相似的代码都违反了 DRY 原则。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 1423

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1073

Oracle11g下载与安装(windows)

一、Oracle11g下载 二、安装准备 三、执行安装步骤 四、测试连接 附:Oracle11g服务说明

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 2万+

设计模式学习笔记 - 设计原则 - 7.DRY 原则及提高代码复用性

DRY 原则,英文描述为: Don't Repeat Yourself。中文直译:不要重复自己。将它应用在编程中,可理解为:不要写重读的代码。

chenjian723122704的专栏 1816

如何用python自己复现worldquant brain中的回测结果

本文介绍了在Python中复现WorldQuant Brain平台上alpha 101因子1和4的回测框架构建要点。重点分析了Brain平台的策略设置:使用TOP 3000高流动性股票(可用中证1000/2000替代);delay=1表示t日信号在t+1日开盘调仓;详细解释了market/sector/industry/subindustry四级中性化方法;说明了decay参数控制持仓权重线性衰减;以及TRUNCATION参数限制单股仓位风险。文章还探讨了不同调仓时点的实现差异,为自主构建量化回测系统提供了

夏之微风的博客 731

编写代码中的 DRY 原则

DRY 原则来自于《Pragmatic Programmer》即《务实的程序员》这本书。DRY 是英文 Don’t Repeat Yourself 的缩写,从字面上理解就是不要重复你的代码,但是作者其实说的是知识,更准确的定义是”每一份知识都必须在系统中拥有单一的,无歧义的,权威的代表“。 很抽象是不是,我们可以举例来说明这个问题,假设我们的系统中有一个业务逻辑是付款 (payment),那么付款业务的代码应该只能在你的系统中出现一次,也就是说在系统中只能有一个付款模块。我们关于如何付款,付款方式,付款的流

surfirst的博客 1143

车载软件架构 -- SOA服务分层设计原则

摘要: 本文系统阐述了车载SOA(面向服务架构)的核心价值与分层设计原则。传统汽车软件架构因功能耦合度高、升级困难等问题难以适应智能汽车发展需求,而SOA通过服务化设计实现模块化解耦,支持跨域协同与生态开放,显著提升开发效率和可维护性。文章详细解析了服务分层策略(原子服务、基础服务、应用服务)及其设计原则:原子服务作为最小功能单元实现硬件抽象;基础服务整合原子服务提供通用能力;应用服务面向具体业务场景。分层架构有效降低了系统复杂度,使各层可独立演进,为智能汽车软件生态建设提供了方法论支撑。

Soly_kun的博客 727

倾斜摄影数据转换为3DTile格式的方法:基于CesiumLab GIS

通过使用CesiumLab GIS,倾斜摄影数据可以方便地转换为3DTile格式,并在CesiumJS等3D地理信息可视化工具中进行展示和分析。一旦成功导入3DTile数据,就可以在CesiumLab GIS中利用其强大的可视化和分析功能进行进一步的处理。转换完成后,可以将生成的3DTile数据导入到CesiumLab GIS中进行可视化和分析。启动CesiumLab GIS应用程序,并按照界面上的指导导入转换后的3DTile数据。脚本将开始执行,并将倾斜摄影数据转换为3DTile格式。

ObDjango的博客 1076

DRY 原则:相同的两段代码就一定违反 DRY 原则吗?

DRY 原则(Don't Repeat Youself)翻译成中文是:不要编写重复的代码。很多人对其中的“重复”二字有误解,认为项目中存在两段相同的代码就是重复,实际上,相同的两段代码未必违反 DRY原则,相反,不同的两段代码也未必就不违反DRY 原则。本节我们就重点来讲一下怎么才算是“重复”。

红军不怕远征难,万水千山只等闲 1238

深度学习+遥感:2025最新土地利用分类资源大全(数据集/论文/代码)

近年来,深度学习在遥感影像土地利用分类领域取得了突破性进展,从传统的农田、森林识别,到复杂的城市功能区划分,AI正在重新定义我们对地表覆盖的认知。无论是科研还是工程应用,高质量数据集、前沿算法和开源工具都是成功的关键。本文精心整理了2024年最值得关注的土地利用分类资源,包括:✅ 10+个权威数据集(覆盖全球、多分辨率、多光谱/雷达)✅ 15+篇顶会论文(CNN/Transformer/自监督学习等SOTA方法)✅ 6大开源工具箱(PyTorch/Keras实现,即拿即用)

hanfeng5268的博客 1312

重构我们的代码_遵循DRY原则

在JavaScript中,DRY原则是指"Don’t Repeat Yourself",即不要重复自己的代码。它是一种编程原则,强调避免在代码中出现重复的逻辑、功能和结构。● 例如我们之前猜游戏的代码出现了很多的重复代码,这节课我们就来重构它。

分享学习网络的点点滴滴 303

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

本文深入探讨了提高代码复用性的关键原则和方法。通过实际代码示例,分析了逻辑重复与功能语义重复对DRY(Don't Repeat Yourself)原则的影响,并提出了具体的解决方案。文章强调了统一实现思路、将功能抽象成细粒度函数,以提高代码的可维护性和可读性。为了实现高代码复用性,文章提出了减少代码耦合、遵循单一职责原则、模块化设计、业务逻辑与非业务逻辑分离等方法。此外,还介绍了继承、多态、抽象、封装以及设计模式在提高复用性中的应用。文章同时提醒,避免为复用而过度设计,遵循“Rule of Three”原则

想起来就更新 1720

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

DRY原则-用函数和模块化来避免重复代码

遵循DRY(Don't Repeat Yourself)原则是编程中的一个重要准则,它鼓励我们避免重复代码,通过抽象和函数化来复用代码。这样不仅可以让代码更加简洁、易于理解,还可以减少维护成本和出错率。下面是一个示例,展示如何应用DRY原则来重构一段有重复代码的Python程序。

少说,多做。 8281

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

DRY原则CleanArchitecture:代码重复消除策略

在软件开发中,DRY(Don't Repeat Yourself,不要重复自己)原则是提高代码质量、降低维护成本的核心准则。Clean Architecture通过其清晰的分层结构和依赖倒置原则,为实施DRY原则提供了天然的优势框架。 本文将深入探讨Clean Architecture中实现DRY原则的多种策略,通过具体代码示例展示如何避免重复代码、提升代码重用性,并构建更加健壮和可维护的应用程...

gitblog_00817的博客 1039

设计模式之美21-理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?

我们首先来区分三个概念:代码复用性(Code Reusability)、代码复用(Code Resue)和DRY原则。代码复用表示一种行为:我们在开发新功能的时候,尽量复用已经存在的代码。代码的可复用性表示一段代码可被复用的特性或能力:我们在编写代码的时候,让代码尽量可复用。DRY原则是一条原则:不要写重复的代码。从定义描述上,它们好像有点类似,但深究起来,三者的区别还是蛮大的。首先,“不重复”并不代表“可复用”。

fegus的博客 518

《设计模式之美》理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?

王争《设计模式之美》学习笔记 DRY 原则(Don’t Repeat Yourself) DRY 原则,英文描述为:Don’t Repeat Yourself。中文直译为:不要重复自己。将它应用在编程中,可以理解为:不要写重复的代码。 三种典型的代码重复情况,它们分别是:实现逻辑重复、功能语义重复和代码执行重复。 实现逻辑重复 文中举例,用户身份验证类 UserAuthenticator,其...

玲珑巫女的学习笔记 585

设计模式:DRY原则,提高代码的复用性

DRY 原则 那就是 DRY 原则。它的英文描述为:Don’t RepeatYourself。中文直译为:不要重复自己。将它应用在编程中,可以理解为:不要写重复的代码。 你可能会觉得,这条原则非常简单、非常容易应用。只要两段代码长得一样,那就是违反DRY 原则了。真的是这样吗?答案是否定的。这是很多人对这条原则存在的误解。实际上,重复的代码不一定违反 DRY 原则,而且有些看似不重复的代码也有可能违反 DRY 原则。 有三种典型的代码重复情况,那就是:实现逻辑重复、功能语义重复、代码执行重复。三种代码重复,

OceanStar的博客 1420

php 将相同代码,别写重复代码 (DRY)

别写重复代码 (DRY)试着去遵循DRY 原则尽你最大的努力去避免复制代码,它是一种非常糟糕的行为,复制代码 通常意味着当你需要变更一些逻辑时,你需要修改不止一处。试想一下,如果你在经营一家餐厅并且你在记录你仓库的进销记录:所有 的土豆,洋葱,大蒜,辣椒等。如果你有多个列表来管理进销记录,当你 用其中一些土豆做菜时你需要更新所有的列表。如果你只有一个列表的话 只有一个地方需要更新。通常情况下你复制...

weixin_29216957的博客 193

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

isValidlp() 和 checklftpValid()两个函数,尽管两个函数命名不同,实现逻辑不同,但功能是相同的,都是用来判定 IP 地址是否合法的。除非的非常明确的复用需求,否则,为了暂时用不到的复用需求,花费太多的时间、精力,投入太多的开发成本,并不是一个值得推荐的做法。这是因为,代码中存在“执行重复”。这个例子中,尽管两段代码的实现逻辑不重复,但语义重复,也就是功能重复,我们判定它违反了 DRY 原则。代码“可复用性”是从代码开发者的角度来讲的,“复用”是从代码使用者的角度来讲的。

Balance 785

转:靠谱的代码和DRY

http://www.cppblog.com/vczh/archive/2014/07/15/207658.html 靠谱的代码和DRY 上次有人来要求我写一篇文章谈谈什么代码才是好代码,是谁我已经忘记了,好像是AutoHotkey还是啥的专栏的作者。撇开那些奇怪的条款不谈,靠谱的 代码有一个共同的特点,就是DRY。DRY就是Don't Repeat Yourself,其实已经被人谈...

weixin_33811539的博客 86

设计模式:DRY原则要求不要写重复代码

一、DRY原则:Don't repeat yourself 不要写重复代码

qq_24074771的博客 656

DRY 原则再思考:消除知识重复,而非代码相似

**DRY 中的 “Yourself”是关键**:它强调的是对自己所写系统的责任——不要让你自己(未来的你,或你的队友)陷入“一处修改、处处遗漏”的泥潭。DRY也是容易被误读的原则之一。很多人将其简化为“消灭视觉重复”,结果为了消除几行结构相似的 `if` 语句,硬造出泛型工具类、抽象基类甚至运行时反射机制,最终导致: - 代码耦合度上升; - 调试路径变长; - 业务语义被稀释。 我们必须区分 **“知识重复”** 与 **“代码巧合相似”** ——前者必须消除,后者不妨容忍。

码到三十五 2625
上一篇: 6个常见的 PHP 安全性攻击
下一篇: 21非常有用的htaccess的方法与技巧
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值