科普文:11个编程原则助你写出优雅代码

糟糕的代码形式可以千千万,优雅且高质量的代码却是极其的相通,如何写出让人信服的高质量代码?编程是一个看似简单,但是还是有很大学问,特别是编写出高质量的优雅代码,最后我们再总结下本文总结的 11种原则:

  1. DRY,Don't Repeat Yourself

  2. KISS,Keep It Simple And Stupid

  3. Refactor

  4. SOLID

  5. Document Your Code

  6. Creation Over Legacy

  7. YAGNI,You Aren't Gonna Need It

  8. Delegation Principles

  9. Clean Code At All Costs

  10. Encapsulate the Changes

  11. Favor Composition Instead of Inheritance

1. DRY

DRY,全称 Don't Repeat Yourself(不要重复你自己),它是软件开发中的一个重要设计原则,旨在减少代码的重复性,提高代码的可维护性和可读性。遵循 DRY 原则可以使代码更加简洁、易于理解和修改。

DRY 核心思想

DRY 的核心思想是:任何知识在系统中都应该有一个单一、明确、权威的表示,简单来说,就是避免在代码中出现重复的逻辑或数据。

如何实现 DRY?

1. 抽象和封装

  • 将重复的代码抽象为函数、方法或者类。

  • 使用模块化编程,将常用的逻辑封装在独立的模块中,便于复用。

2. 使用常量

  • 如果某个值在代码中多次使用,可以将其定义为常量,避免硬编码。

  • 这样不仅减少了重复代码,还提高了代码的可读性和可维护性。

3. 利用继承和多态

  • 在面向对象编程中,使用继承和多态来减少代码重复。

  • 将通用的功能放在父类中,子类继承并扩展这些功能。

4. 模板和泛型

  • 使用模板和泛型来创建可重复使用的代码结构,适用于多种类型和场景。

5. 配置文件和数据库

  • 将可变的数据和配置项存储在配置文件或数据库中,而不是硬编码在程序中。

DRY 的优势

1. 提高代码质量

  • 避免代码重复,使代码更加简洁和易于理解。

  • 减少了出错的可能性,因为同一个逻辑只需要维护一处。

2. 便于维护

  • 代码修改时只需更改一个地方,减少了维护成本。

  • 提高了代码的一致性和可靠性。

3. 增强代码复用性

  • 通过抽象和封装,提高了代码的复用性,减少了重复工作。

2. KISS

KISS,全称 Keep It Simple And Stupid(保持简简单),旨在提醒开发人员尽量保持代码的简洁性和易读性。

KISS 核心思想

KISS原则的核心思想是尽量避免不必要的复杂性。这意味着在设计和编写代码时,应尽量选择简单、直接的解决方案,而不是过度设计或引入不必要的复杂性。

如何实现 KISS?

1. 避免过度设计

  • 不要为了显示自己的编程技巧而编写复杂的代码。

  • 简单的代码更容易理解、调试和维护。

2. 使用明确的命名

  • 变量、函数和类的命名应尽量清晰、明确,能够反映其用途。

  • 避免使用晦涩难懂的缩写或不相关的命名。

3. 分解问题

  • 将复杂的问题分解为多个简单的小问题,每个小问题用一个简单的函数或方法来解决。

  • 避免在一个函数或方法中处理过多的逻辑。

4.遵循单一职责原则

  • 每个函数或类应只负责一个职责或任务。

  • 这样可以避免代码过于复杂,并提高代码的可维护性。

5.重用现有工具和库

  • 不要重复发明轮子,尽量使用现有的工具和库来解决问题。

  • 这不仅可以减少代码量,还可以提高代码的可靠性和可维护性。

3. Refactor

Refactor(重构)是指在不改变代码外部行为的前提下,对代码内部结构进行调整,以提高代码的可读性、可维护性和性能。

重构核心思想

重构的核心思想是通过逐步改进代码结构,使其更易于理解和维护,重构不是一次性的大改动,而是通过一系列的小步骤逐步优化代码。

重构的好处

  • 提高代码可读性:重构后的代码更加简洁、清晰,便于理解。

  • 提高代码可维护性:减少代码中的重复和冗余,使得修改和扩展代码更加容易。

  • 减少错误:通过清晰的代码结构和逻辑,减少潜在的错误和Bug。

  • 提高开发效率:重构后的代码更易于测试和调试,从而提高开发效率。

重构常见技巧

1. 提取方法

  • 将一段复杂的代码提取到一个独立的方法中,使原方法更加简洁。

  • 有助于提高代码的可读性和复用性。

2. 重命名

  • 使用有意义的命名来替代晦涩难懂的命名。

  • 提高代码的可读性和理解性。

3. 内联方法

  • 如果一个方法的实现非常简单,可以将其直接替换到调用处。

  • 减少不必要的方法调用,提高代码的简洁性。

4. 替换魔法数字

  • 将代码中的硬编码数值替换为有意义的常量。

  • 提高代码的可读性和可维护性。

5. 提取类

  • 将一个类中职责过多的部分提取到一个新的类中。

  • 遵循单一职责原则,使类的职责更加明确。

6. 合并重复代码

  • 将重复的代码提取到一个独立的方法或类中。

  • 遵循DRY(Don't Repeat Yourself)原则,提高代码的复用性。

4. SOLID

SOLID是 Robert C. Martin(也称为Uncle Bob)提出或者总结出来的经典之作。它可以适用于各种编程语言,通常会用来衡量一个模块,系统设计的是否合理。

SOLID是什么?

在 架构整洁之道 这本经典的书籍中有一套关于软件设计的 SOLID 原则,SOLID 实际上是五个设计原则首字母的缩写,它们分别是:

  • 单一职责原则(Single responsibility principle, SRP)

  • 开放封闭原则(Open–closed principle, OCP)

  • Liskov 替换原则(Liskov substitution principle, LSP)

  • 接口隔离原则(Interface segregation principle, ISP)

  • 依赖倒置原则(Dependency inversion principle, DIP)

详细文章参考:

  • 单一职责到底是什么?十分钟带你掌握![1]

  • 开闭原则:如何对扩展开放,对修改关闭?[2]

  • 接口隔离原则,到底什么需要隔离?[3]

  • 里氏替换原则,替换的依据是什么?

  • 依赖倒置原则,究竟什么被倒置了?[4]

5. Document Your Code

Document Your Code(记录你的代码,简称 DYC),旨在提高代码的可读性、可维护性和可扩展性。通过在代码中添加注释和文档,可以帮助自己和他人更好地理解代码的意图、逻辑和功能。

DYC 核心思想

DYC 的核心思想是通过详细的注释和文档,使代码更加易于理解和维护。这不仅对当前的开发工作有帮助,对于未来的维护、调试和扩展也至关重要。

如何实现 DYC?

1. 添加注释

  • 在代码的关键部分添加注释,解释代码的意图和逻辑。

  • 注释应简洁明了,避免冗长和重复。

2. 编写文档

  • 为复杂的模块、类和方法编写详细的文档,解释它们的功能、用途和使用方法。

  • 文档可以包括设计文档、API文档、用户手册等。

3. 使用自解释代码

  • 通过使用有意义的变量名、函数名和类名,使代码自解释。

  • 尽量减少对注释的依赖,但在必要时仍应添加注释。

4. 保持文档更新

  • 在修改代码时,及时更新相关的注释和文档。

  • 确保文档与代码保持一致,避免文档过时。

5. 使用工具

  • 使用文档生成工具(如 Java 的 Javadoc)自动生成API文档。

  • 使用版本控制系统(如 Git)来跟踪文档的变化。

6. Creation Over Legacy

Creation Over Legacy(创建优于继承,简称 COL)原则主要应用于面向对象编程(OOP)中,强调通过对象的组合和创建来实现复杂行为,而不是通过继承。

COL 的核心思想

COL的核心思想是通过对象的组合和创建来实现复杂行为,而不是依赖继承。这有助于保持系统的灵活性、可维护性和可扩展性。

为什么选择 COL?

1. 减少复杂性

  • 继承层次结构过深会导致系统复杂性增加,难以理解和维护。

  • 通过组合,可以将复杂行为分解为多个独立的、易于理解的小对象。

2. 提高灵活性

  • 组合比继承更灵活,可以在运行时动态地改变对象的行为。

  • 通过依赖注入,可以轻松替换和扩展对象的功能。

3. 增强可测试性

  • 组合和依赖注入使得单元测试更加容易,因为可以轻松地模拟和替换依赖对象。

  • 避免了继承层次结构中常见的耦合问题。

如果你用面向对象编程(OOP)来编写代码,你会发现这个规则非常有用,创建优于继承的规则主要是关于具有复杂行为的对象由具有不同行为的对象实例组成,它们不应添加新行为并继承一个类。

依赖继承会导致两个主要问题

  • 首先,如果你尝试快速实现,继承层次结构会变得复杂。

  • 其次,你在定义不同或特殊行为时灵活性较差。假设你需要实现共享行为:

7. Clean Code At All Costs

Clean Code At All Costs(始终保持代码清洁)原则强调代码的清晰、简洁和可维护性。无论在何种情况下,都应尽量保持代码的清洁。这不仅使得代码更易于理解和维护,还能提高软件的质量和开发效率。

Clean Code 的核心思想

Clean Code 的核心思想是:编写易于阅读、理解和维护的代码。这意味着代码应该尽量避免复杂性、重复和不必要的冗长,同时保持逻辑的清晰和一致性。

如何实现 Clean Code?

1. 使用有意义的命名

  • 变量、函数和类的命名应尽量清晰、明确,能够反映其用途。

  • 避免使用晦涩难懂的缩写或不相关的命名。

2. 函数应简洁

  • 每个函数应只做一件事,并且尽量短小。

  • 如果函数过长或过于复杂,应考虑将其拆分为多个更小的函数。

3. 避免重复代码

  • 遵循DRY(Don't Repeat Yourself)原则,将重复的代码提取为独立的函数或模块。

  • 这样不仅减少了代码量,还提高了代码的可维护性。

4. 保持代码一致性

  • 代码风格应保持一致,无论是命名、缩进还是注释风格等。

  • 可以使用代码风格检查工具来确保一致性。

5. 注重代码结构

  • 代码应有清晰的结构,逻辑应尽量直观和易于跟踪。

  • 使用适当的注释和文档来解释复杂的逻辑和设计决策。

6. 避免深层嵌套

  • 避免过深的嵌套结构,如过多的if-else或循环嵌套。

  • 可以通过提前返回、使用卫语句等方式来简化嵌套结构。

7. 注重错误处理

  • 错误处理应尽量明确和简单,不应隐藏错误或忽略异常。

  • 使用适当的异常处理机制,并提供有意义的错误信息。

8. YAGNI

YAGNI,全称 You Aren't Gonna Need It(你不需要它),它是极限编程(Extreme Programming,XP)中的一项重要原则,旨在提醒开发人员不要编写那些当前不需要的功能或代码。YAGNI原则的核心思想是:只实现当前需求所必须的功能,不要为未来可能需要的功能编写代码。

YAGNI 原则的核心思想

YAGNI原则的核心思想是:避免过度设计和过早优化,只实现当前需求所必须的功能。这样可以减少代码的复杂性、提高开发效率和代码质量。

为什么选择 YAGNI 原则?

1. 减少复杂性

  • 过多的功能和代码会增加系统的复杂性,难以理解和维护。

  • 只实现当前需求,可以使代码更加简洁和易于管理。

2. 提高开发效率

  • 实现不必要的功能会浪费时间和资源,降低开发效率。

  • 专注于当前需求,可以更快地交付功能和产品。

3. 减少错误

  • 不必要的功能和代码会引入更多的错误和 Bug,增加测试和调试的难度。

  • 只实现当前需求,可以减少潜在的错误和 Bug。

4. 增强灵活性

  • 未来的需求可能会变化,过早实现的功能可能会变得不再适用。

  • 只实现当前需求,可以保持系统的灵活性,便于将来根据实际需求进行调整。

9. Delegation Principles

委托原则(Delegation Principles)强调将任务或职责委托给适当的对象或方法来完成,而不是由当前对象直接实现。这种方式可以提高代码的灵活性、可维护性和可复用性。

委托原则的核心思想

委托原则的核心思想是:将任务或职责委托给最适合处理它的对象或方法。通过这种方式,可以减少代码的耦合度,增强代码的灵活性和可复用性。

为什么选择委托原则?

1. 提高灵活性

  • 委托可以让对象在运行时动态地决定由谁来处理任务。

  • 这使得系统更具适应性和扩展性。

2. 减少耦合

  • 通过委托,类之间的依赖关系减少,降低了耦合度。

  • 这使得代码更容易理解和维护。

3. 增强可复用性

  • 委托可以让不同的对象共享相同的行为,从而提高代码的复用性。

  • 这减少了代码的重复,提高了开发效率。

4. 提高测试性

  • 通过委托,可以轻松地替换或模拟被委托的对象,增强了代码的可测试性。

  • 这使得单元测试更加容易。

10. Encapsulate the Changes

在软件领域,唯一不变的就是变化。所以,总是将你认为将来可能需要编辑的代码封装起来。

Encapsulate the Changes(封装变化),旨在将可能变化的部分隔离和封装起来,使得系统的其他部分不受这些变化的影响。通过封装变化,可以提高代码的可维护性、可扩展性和稳定性。

封装变化核心思想

封装变化的核心思想是:将变化的部分封装在一个独立的模块、类或方法中,使得系统的其他部分不依赖于这些变化。这样可以减少代码的耦合度,提高系统的灵活性和可维护性。

为什么选择封装变化?

1.提高可维护性

  • 通过封装变化,代码的修改只需在一个地方进行,减少了维护的复杂性。

  • 这使得代码更容易理解和管理。

2.提高可扩展性

  • 封装变化使得添加新功能或修改现有功能变得更容易,而不会影响系统的其他部分。

  • 这有助于系统的扩展和演进。

3.减少耦合

  • 通过封装变化,可以减少代码之间的依赖关系,使得系统更加模块化。

  • 这有助于提高代码的复用性和灵活性。

4.提高稳定性

  • 封装变化可以减少因修改代码而引入的错误,提高系统的稳定性。

  • 这有助于确保系统的可靠性和可预测性。

Java中的许多设计模式使用封装。封装的一个例子是工厂设计模式。该设计模式封装了对象创建的代码,使你在以后引入新应用程序或网站时更灵活,而不会影响当前代码。

11. Favor Composition Instead of Inheritance

Favor Composition Instead of Inheritance(优先使用组合而不是继承)原则是软件设计中的一个重要原则,特别是在面向对象编程(OOP)中,该原则强调优先使用对象组合来实现功能,而不是通过继承来扩展类的功能。

优先使用组合核心思想

Favor Composition Instead of Inheritance 的核心思想是通过组合多个对象来实现复杂功能,而不是通过继承来扩展类的功能。这种方式可以提高代码的灵活性、可维护性和可复用性。

为什么选择优先使用组合?

1.减少耦合

  • 继承会导致子类与父类之间的强耦合,子类高度依赖父类的实现。

  • 组合可以减少这种耦合,使得对象之间的依赖关系更加松散。

2.提高灵活性

  • 通过组合,可以动态地改变对象的行为,而继承则是在编译时决定的。

  • 组合使得系统更具适应性和扩展性。

3.增强可复用性

  • 组合可以将多个小对象组合成更复杂的行为,从而提高代码的复用性。

  • 这减少了代码的重复,提高了开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源消息队列比较

目录 1. Apache Kafka 1.1安装步骤 1.1.1使用Docker安装 1.1.1手动安装 1.2 C#使用示例代码 1.2.1 安装Confluent.Kafka 1.2.2生产者代码示例 1.2.3消费者代码示例 1.3特点 1.4使用场景 2. RabbitMQ 2.1安装步骤 2.1.1使用Docker安装 2.1.2手动安装 2.2 C#使用示…

【STM32】SysTick定时器

SysTick定时器 前言一、介绍最大计时时间 固件库函数体现用途 总结 前言 参考一下猫咪博主的文章,作为补充学习⇨【STM32】Systick滴答定时器 当然我主要还是跟着金善愚老师学的,我觉得他真的有种高中班主任的亲切感。那个1812的名号往那里一放&#x…

ChanCMS是一款基于Express和MySQL研发的高质量实用型CMS管理系统

系统介绍:ChanCMS 基于expressmysql的一款轻量级高质量cms管理系统 ChanCMS是一款基于Express和MySQL研发的高质量实用型CMS管理系统。它具备多种类型网站开发,如公司,企业,学校,政府,图片,下载…

【vluhub】elasticsearch漏洞

Elasticsearch介绍 是Apache旗下的一个开源的、分布式、RESTful的搜索和分析引擎,适用于java语言项目 默认端口9200 kali中搭建ElasticHD, 即可未授权绕过ES可视化界面 直通车 https://github.com/360EntSecGroup-Skylar/ElasticHD/releases/download/1.4/elas…

吃肉的刷题记录2-贪心

文章目录 贪心贪心算法的特点:贪心算法的应用场景:贪心算法的设计步骤:实现注意事项: 例题: leetcode.322.零钱兑换例题: leetcode 5.最长回文字符串 贪心 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08…

Csrf复习(pikachu靶场和防御手段)

CSRF漏洞简介 CSRF又称跨站请求伪造,是指攻击者在用户登录的状态下(浏览器保存了用户的cookie)通过伪造恶意url诱导用户点击,借助用户的cookie网站权限(冒充用户身份来进行非法操作,对于服务器来说是合法的…

视觉SLAM第二讲

SLAM分为定位和建图两个问题。 定位问题 定位问题是通过传感器观测数据直接或间接求解位置和姿态。 通常可以分为两类:基于已知地图的定位和基于未知地图的定位。 基于已知地图的定位 利用预先构建的地图,结合传感器数据进行全局定位。SLAM中的全局…

如何利用开源Bug管理系统提高团队效率

国内外主流的10款开源bug管理系统对比:PingCode、Worktile、Trac、WebIssues、MantisBT、Bugzilla 、Fossil、The Bug Genie、TestLink 、OpenProject。 在软件开发的复杂世界中,Bug管理可能是一个令人头疼的问题,尤其是当工具不足以捕捉和解…

这才是做项目的正确打开方式

基于大数据的推荐机制,对于没有接触到信息的人而言,会认为获取行业外的信息会很困难,对于已经接触到信息的人而言,又会出现选择困难症。当系统对你锁定标签后,就会频繁的给你推荐跟标签对应的信息,信息一多…

[PM]面试题-能力问题

你在公司里面主要做什么? 负责产品的全生命周期的管理, 包括产品调研, 需求整理, 产品设计,文档产出, 产品评审, 项目推进, 产品迭代等工作 你是怎么做需求分析的? 首先我们要收集需求, 然后把需求放到需求池里进行管理, 需求管理首先要对需求进行优先级划分, 在根据需求设…

DjangoRF-8-9-modules和interfaces接口

1、接口编写顺序,同6–7一样。

quicgo

quic-go/quic-go 简介: Go语言实现的QUIC协议。(QUIC是一个兼顾TCP连接的可靠性,同时大幅降低延迟的通用网络传输层协议) | GitHub 中文社区 https://www.github-zh.com/projects/55637575-quic-go quic-go 是 Go 中 QUIC 协议(…

Kafka面试三道题

针对Kafka的面试题,从简单到困难,我可以给出以下三道题目: 1. Kafka的基本概念与优势 问题:请简要介绍Kafka是什么,并说明它相比传统消息队列的优势有哪些? 答案: Kafka定义:Apa…

【传知代码】智慧医疗:纹理特征VS卷积特征(论文复现)

在这个无处不在的技术革新的时代,计算机视觉和机器学习成为了医疗领域中不可或缺的力量。在这篇文章中,我们将探讨两种突出的技术:纹理特征和卷积特征。它们如何在医学影像分析中竞争与协作,为医生提供更深入、更精确的诊断信息&a…

iOS基础---常用三方库:Masonry、SDWebImage

系列文章目录 iOS基础—多线程:GCD、NSThread、NSOperation iOS基础—Category vs Extension iOS基础—常用三方库:Masonry、SDWebImage 文章目录 系列文章目录一、Masonry1.Masonry简介2.使用示例3.源码剖析 二、SDWebImage1.SDWebImage简介2.主要功能…

不同WEB下的的ApplicationContext的选择

依赖 ApplicationContext类型选择 默认情况下,spring通过选择的web端的框架来选择使用哪个ApplicationContext子类,默认情况下我们一般使用spring mvc框架,这个时候AC的实现类为 org.springframework.boot.web.servlet.context.AnnotationC…

在 LCD 上显示 png 图片-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

在 LCD 上显示 png 图片 PNG 简介 无损压缩:PNG 使用 LZ77 派生算法进行无损压缩,确保图像质量不受损,且压缩比高 体积小:通过高压缩比,PNG 文件体积小,适合网络传输 索引彩色模式:PNG-8 格式…

ChatGPT对话:关于训练模型h5格式和SavedModel格式的问题

【编者按】有几天没有更新,一直在学习和调试程序,其中有大量与ChatGPT的对话,遇到的每一个问题都找ChatGPT,再也没有用到百度和google。在ChatGPT的帮助下已完成Python下的花卉识别训练与预测,部署到网站,也…

计划外投料

计划外领料通过A07 R10发料/其他,进行计划外投料。移动类型仍然是261。 在科目分配页签。维护计划外投料的工单号。 在实际业务中,有的企业也会单独复制出一个移动类型。进行区分。 在COOIS中,有张表可以看出物料是计划内投料还是计划外。 …

MySQL查询执行(三):显示随机消息

假设有如下表结构&#xff1a; -- 创建表words CREATE TABLE words (id int(11) NOT NULL AUTO_INCREMENT,word varchar(64) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB;--数据生成存储过程 delimiter ;; create procedure idata() begindeclare i int;set i0;while i<…