【编者按】本文作者为来自 SoftwareYoga.com 的软件架构师、敏捷与 DevOps 开发流程践行者 Deepak Karanth,文章主要介绍了 DRY 原则的诸多优点。
本文系国内 ITOM 管理平台 OneAPM 编译呈现。以下为正文:
“避免重复代码”(DRY) 是软件发展的一项原则,其主旨是减少代码重复现象。
“所有内容写两遍”(WET) 则是上述原则的反义缩写,意指不遵守 DRY 原则的代码。
开发人员应当以其中哪个原则为目标本应是显而易见的。但是,也许这个时候已经有人开始拿出证据来证明我是错的。
在本文中,我们会逐一讨论编写代码时遵循 DRY 原则的好处。首先,我们先举一个简单的例子来说明 DRY 原则的基本优势。
DRY 原则 - 简单例子
假设你的代码中有很多地方需要根据当前用户的角色来执行。比如:只有编辑或管理员才可以执行 createPage()
函数,只有管理员才可执行 deletePage()
函数。
在creatPage(创建页面)和 deletePage(删除页面)函数检查用户的角色时,我们可以使用下面这个 isPermitted() 单一函数,而不是分别开展用户角色检查的逻辑。
//get the current Subject Subject currentUser = context.getSubject(); if (isPermitted(currentUser)) { //allow execution of deletePage} else { //block execution }
将 isPermitted() 的逻辑固定在一个地方,就可以避免重复,同时反复利用代码。另外一个优势就是逻辑的独立性,即 createPage() 和 deletePage() 无需知道如何检查权限。
当然,DIY 原则的优势远不止这样。
DRY 原则的优势
可维护性
DRY 原则的最大优势是可维护性。如果检查权限的逻辑在整段代码中重复很多次,在重复代码中出现的问题将很难修复。修复一段代码中的某个问题后,很容易忘记修复其他重复代码中同样存在的问题。同样,如果需要修改逻辑,就得四处复制粘贴。如果使用不重复的代码,只需在一处维护代码即可。新的逻辑和漏洞修复都只需在一处进行,不必再四处徘徊。通过这种方式开发的软件既稳定又可靠。
可读性高
大多数情况下,遵循 DRY 原则的代码更容易阅读。这并不是因为 DRY 原则本身,而是因为开发人员在代码中投入了更多精力,让它符合一定的原则(比如 DRY 原则)。
重复使用
DRY 原则始终提倡二次利用代码,这是因为我们会将2个或2个以上重复代码实例并入一个代码块。可重用代码缩短了开发时间,因此从长远看,可重用代码是有回报的。
成本合理
如果想说服管理层用更多的时间来提高代码质量,就可以用“成本”这个理由。代码越长,成本越高。代码越长,维护代码、修复漏洞所需的人手和时间也越多。代码越长,开发时间和漏洞也越多,结果就是客户非常不满。无庸赘述。
测试方便
这里我们讨论的是模块测试和集成测试,而不是手动测试。测试时需要覆盖的路径和功能越多,为测试而编写的代码就会越长。如果代码不重复,就只需要测试一个主路径。当然,不同的行为仍然需要接受测试。
注意事项
虽然 DRY 原则好处多多,但还是有几个小缺陷。
- 不是所有代码都需要整合成一段。有时候2段代码看上去差不多,但却存在细微差异。什么时候应当将代码段整合成一段,什么时候又应当让它们保持分离状态,都需要仔细斟酌。
- 如果代码太过简略,会让人难以理解。我曾见过开发人员在只有一个代码块实例时,还要贯彻 DRY
原则。虽然我欣赏他们希望让代码更出色、可重用率更高的想法和远见,但是我只有在需要二次利用代码时才会去遵循 DRY 原则。 - 人们经常会忽略的是,DRY 原则并不仅仅适用于代码,它还可以同等地应用到数据库设计、文档编写、代码测试等方面。
OneAPM 能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
原文地址:https://dzone.com/articles/is-your-code-dry-or-wet
相关推荐
除了实现逻辑的重复,还有其他两种类型的代码重复需要考虑:功能语义重复和代码执行重复。功能语义重复是指尽管代码结构不同,但实现的功能相同或相近。例如,多个函数执行类似的计算或数据处理。这时,可以考虑使用...
Simian,全称Similarity Analyser,是一款强大的源代码重复检测工具,专为各种编程语言设计,包括Java、C#、C++、C、VB.NET、JavaScript等。它的主要功能是扫描软件项目,识别并报告其中的相似或重复代码段,帮助...
在代码库中,可能有一个名为"MyApplication"的文件或项目,它可能包含了实现这些策略的具体代码示例。通过研究和理解这些代码,你可以更好地掌握如何在自己的项目中优雅地处理重复点击问题。记得在实现时考虑性能和...
在软件开发过程中,经常会出现代码重复的情况。这不仅使得项目变得臃肿、难以维护,而且增加了出错的可能性。因此,有效地管理和组织代码成为提升开发效率和软件质量的关键。本文将详细介绍如何在IntelliJ IDEA...
在C++中,有多种工具可以帮助开发者进行代码重复性测试。例如,CPPLint是一个用于检查C++代码风格的工具,虽然它不直接检测重复性,但可以通过检查代码规范性帮助减少冗余。PMD和Cppcheck是两个更全面的静态代码分析...
你的磁盘是不是保存了很多重复的文件?分散在各个目录,不好找吧?找到了,为了保证目录的完整性,你又不能删除它? 你知道Linux的文件硬链接吗?就是给文件一个别名,多个文件名指向同一个文件内容,不重复占用空间...
"Xcode搜索代码中重复名字的文件"这个主题正是关于如何利用Xcode或者第三方工具来识别并处理项目中可能存在的重复文件名的问题。这有助于减少冗余,优化资源使用,提升应用性能,并避免潜在的冲突和错误。 首先,...
这是一个有效发分页源码,直接调用代码就行,代码量特少,希望能对大家有帮助.
输入一个字符串,字符串由字母、数字组成,可能包含重复的字符。生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于...
本文将深入探讨使用C语言实现的重复数据删除技术,主要基于提供的1.4.1版本源代码。 1. **基本概念**:重复数据删除是通过比较数据块的哈希值来识别重复内容,而不是比较整个文件。这种方法可以快速定位相似或完全...
利用工厂模式 + 模板方法模式,消除 if…else 和重复代码 代码重复的3种处理方法1-用工厂模式 + 模板方法模式 利用注解 + 反射消除重复代码
你是否不喜欢代码生成插件的重复代码? 你是否渴望一个没有冗余代码的项目? 你是否渴望一行代码都不用写就能完成一个简单的模块? 如何不写代码就完成一个简单的模块 当一些单表的增删改查时你只需要告诉前端来调用...
总结来说,这个开源工具为.NET开发者提供了一种有效检测近似重复代码的解决方案,有助于提高代码质量和维护性,同时也展示了.NET平台在构建工具和实用程序方面的灵活性和实用性。通过深入研究和使用,开发者不仅可以...
有了超人气表单重复代码生成器,大家就可以轻松应对大数量字段表单问题。 使用方法: 1,可以将字段名从数据库表中直接复制成表格样式,根据需要复制替换A列或B列... 2,根据表单情况把代码拆分后复制在各个文本框...
3. **结构体与枚举**:通过结构体可以将相关数据组织在一起,枚举则可以为一组相关的整数值提供友好的名字,这两者都能帮助减少代码重复。 4. **动态内存分配与数据结构**:如果数据的大小或数量在运行时不确定,...
标题中的“oracle 代码?数据库”表明这可能是一个与Oracle数据库相关的编程示例或工具集。Oracle数据库是全球广泛使用的数据库管理系统,它提供了丰富的SQL扩展和PL/SQL编程语言,用于存储、管理和检索数据。 在...
Java中的Map允许有重复元素吗? 在Java中,Map是一种常用的数据结构,它允许我们根据键值对来存储和查找数据。那么,Java中的Map允许有重复元素吗?答案是否定的。Map的键不可以重复,因为Map的定义是键和值是一一...
SonarQube 不仅可以提供基本的代码行数统计,还可以进行代码质量分析,包括检测潜在的代码缺陷、重复代码、代码复杂度等。 总的来说,统计源代码行数及有效代码是一项重要的软件工程任务,可以帮助开发者了解项目...