DRY编码原则

news2024/9/22 11:30:24

基本情况

DRY,Don’t repeat yourself,就是不要重复你自己的意思。
不要重复,是多么简单的意思了,重复就是多了一个一样的东西,为什么多一个呢,一个就可以了,这样才简单,这是一个常识。
光说常识不行,得把常识变成你的意识,让你意识得这样做,融到编码当中去。
重复的代码,这是程序当中最容易出现的情况了,并不是说,都不允许重复,比如两个不同的知识,但是同样的代码,这是应该的。
如果一过程重复了十几遍,你修改的时候,就得修改十几处,这一个原则,对程序员大大的友好啊,一定要记住这个原则,
程序员修炼之道中这样说:

作为程序员,我们做的就是收集、组织、维护以及治理知识。我们
把知识文档化,写进规范;通过运行代码赋予知识以活力;在测试过程
中,运用知识去知道应提供哪些检查。
不幸的是,知识并不稳定。知识会改变——通常频率还很高。可能
只要和客户开个会,对需求的理解马上就变了。政府改了条规定,一些
业务逻辑就过时了。也可能是测试提示之前选的算法行不通。所有这些
不稳定因素意味着,在维护模式下,重新组织和表达知识将会花掉大部
分的时间。
大多数人认为维护始于程序发布,这里的维护指修复Bug和增强特
性。我们觉得这些人搞错了。程序员一直处于维护模式下,从未间断。
我们的理解每天都在变化。当我们在项目中埋头工作时,新的需求会不
断出现,已有的需求也会发展。也可能是环境发生了变化。不管具体原
因是什么,维护从来不是个离散的活动,而是整个开发过程中的常态。
当我们进行维护时,必须找到并变更事物的表达——那些嵌入程序
的知识胶囊。问题是,在规范、流程、开发的程序中复制知识太容易
了,一旦我们动手这么做,就会招致维护的噩梦——这个噩梦在程序发
布前就会开始。
我们认为,想可靠地开发软件,或让开发项目更容易理解和维护,
唯一的方法是遵循下面这条被称为 DRY 的原则:
在一个系统中,每一处知识都必须单一、明确、权威地表达。

说的再多,不如举例,下面以实例说明:
比如如下的C++代码:

StudentScore::StudentScore()
{
    m_scoreLanguage = {"语文", 60};
    m_scoreMath = {"数学", 60};
}

void StudentScore::printScore()
{
    if(m_scoreLanguage.score >= 60)
    {
        qDebug()<< "语文合格";
    }
    else
    {
        qDebug() << "语文需要补考";
    }

    if(m_scoreMath.score >= 60)
    {
        qDebug()<<"数学合格\n";
    }
    else
    {
        qDebug()<<"数学需要补考\n";
    }
}

为了更明白代码,加上头文件:

#ifndef STUDENTSCORE_H
#define STUDENTSCORE_H
#include <string>
#include <iostream>
using namespace std;

typedef struct _Score
{
    string course;
    int score;
}Score;
class StudentScore
{
public:
    StudentScore();
    void printScore();
private:
    Score m_scoreLanguage;
    Score m_scoreMath;
};

运行情况:

image.png

上面有重复的就是判断成绩是否合格,语文,数学这方面的判断逻辑一样的,根据不要重复自己的原则,因此,可以更改如下:

string StudentScore::productResult(string course, int score)
{
    string result;
    if(score >= 60)
    {
       result = course + "成绩合格";
    }
    else
    {
       result = course + "需要补考";
    }
    return result;
}
void StudentScore::printScore()
{
      qDebug()<<productResult(m_scoreLanguage.course, m_scoreLanguage.score).c_str();
      qDebug()<<productResult(m_scoreMath.course, m_scoreMath.score).c_str();

运行情况:

image.png

总结

DRY原则,就是不要重复自己,要求:在一个系统中,每一处知识都必须单一、明确、权威地表达。
这一点不仅在代码过程当中,在数据结构,甚至文档当中都需要遵守这一原则。
比如:这一个数据结构:

typedef struct _Exam
{
    int beginTimeSec;
    int endTimeSec;
    int duration;
}EXAM;

有了开始,结束时间,就不需要时长了。
最后,以一张图来说明:
在这里插入图片描述

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

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

相关文章

【报错】arXiv上传文章出现XXX.sty not found

笔者在overleaf上编译文章一切正常&#xff0c;但上传文章到arxiv时出现类似于如下报错&#xff1a; 一般情况下观察arxiv的编译log&#xff0c;不通过的原因&#xff0c;很多时候都是由于某一行导入了啥package&#xff0c;引起的报错&#xff1b;但是如果没有任何一个具体的…

AppSmith(安装与练习4套)

AppSmith官网文档&#xff1a; https://docs.appsmith.com/getting-started/setup/installation-guides/docker安装前需要已经安装好docker&#xff0c;需要版本如下&#xff1a; Docker ( 20.10.7或者更高) Docker-Compose ( 1.29.2或者更高) 安装Appsmith&#xff1a; 准备…

【Linux】第二站:Linux基本指令(一)

文章目录 一、操作系统OS概念1.OS是什么&#xff1f;2.为什么要有OS?1.一个好的操作系统&#xff0c;他的衡量指标是什么&#xff1f;2.操作系统的核心工作 3.理解我们在计算机上的操作4.Linux和Windows的特点 二、Linux基本指令1. 指令概述2.ls指令1> ls -l2> ls -a3&g…

ChatGPT其实并不想让开发人员做这5件事情

前言 ChatGPT已经火爆了快半年了吧&#xff0c;紧接着国内也开始推出了各种仿制品&#xff0c;我甚至一度怀疑&#xff0c;如果人家没有推出ChatGPT&#xff0c;这些仿制品会不会出现。而很多人也嗨皮得不行&#xff0c;利用各种方法开始科学上网&#xff0c;用ChatGPT做各种觉…

不得不说的行为型模式-解释器模式

解释器模式&#xff1a; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言&#xff0c;用于解释执行特定的操作&#xff0c;例如正则表达式、查询语言、数学表达式等。该模式通过定义一个解释器来解释语言中的表达式…

分治与减治算法实验:题目6 淘汰赛冠军问题

目录 前言 实验内容 实验流程 实验分析 实验过程 流程演示 写出伪代码 实验代码 运行结果 改进算法 总结 前言 淘汰赛冠军问题是一个经典的算法设计与分析的问题&#xff0c;它要求我们在给定的n个参赛者中&#xff0c;通过一系列的比赛&#xff0c;找出最终的冠军…

nginx负载均衡+RabbitMq集群及镜像队列(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nginx是什么&#xff1f;二、搭建步骤1.软件和环境2.安装nginx3.负载均衡配置nginx.conf4.应用程序配置 总结 前言 提示&#xff1a;这里可以添加本文要记…

Linux套接字编程-3

在之前的套接字编程内容中&#xff0c;我们讲述完了UDP和TCP的主要内容&#xff0c;但是对于TCP通信中具体的实现还存在一些问题没有解决&#xff0c;所以我们本篇博客将对进行分析和解决。 目录 1.引入 2.多进程 3.多线程 1.引入 在上一篇博客中&#xff0c;当我们使用T…

sed进阶之模式替换

shell脚本编程系列 &符号可以代表替换命令中的匹配模式&#xff0c;不管模式匹配到了什么样的文本&#xff0c;都可以使用&符号代表这些内容。这样就能处理匹配模式的任何单词了。 echo "The cat sleeps in his hat." | sed s/.at/"&"/g&…

告别低效繁琐的Prometheus告警管理,Nightingale助你快速响应故障!

Prometheus的告警规则、记录规则都是采用配置文件管理&#xff0c;适合奉行Infrastructure as Code的公司或团队内部使用。但如果要把监控能力开放给全公司&#xff0c;就要支持协同操作的 UI&#xff0c;让各个团队互不干扰的同时共享成果。 开源方案&#xff1a; Grafana 擅…

No.053<软考>《(高项)备考大全》【冲刺7】《软考之 119个工具 (5)》

《软考之 119个工具 &#xff08;5&#xff09;》 84.文档审查:85.信息收集技术:86.核对表分析:87.假设分析:88.图解技术:89.SWOT 分析:90.风险概率和影响评估:91.概率和影响矩阵(包含在风险管理计划中):92.风险数据质量评估:93.风险分类(包含在风险管理计划中):94.风险紧迫性评…

快速多关键字统计

实例需求&#xff1a;在每个章节中统计关键字&#xff08;“√”, “”, “〇”, “空缺”&#xff09;的个数&#xff0c;B列中的章节编号作为章节划分的标识&#xff0c;例如1.1.1 ~ 1.1.5为第1.1章节&#xff0c;对应工作表的12 ~ 16行&#xff0c;其中黄色列为需要统计的数…

【软考数据库】第五章 计算机网络

目录 5.1 网络功能和分类 5.2 OSI七层模型 5.3 TCP/IP协议 5.4 传输介质 5.5 通信方式和交换方式 5.6 IP地址 5.7 IPv6 5.8 网络规划和设计 5.9 其他考点补充 5.10 网络安全技术 5.11 网络安全协议 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff…

从张鑫旭的demo中,我学到了图像拉伸的原理

文章收录&#xff1a; 个人网址&#xff1a;http://linglan01.cn/Github仓库&#xff1a;https://github.com/CatsAndMice/blog/issues 产品经理又有新需求啦&#xff0c;其中有一个图片上传后用户拉伸图像宽高的功能&#xff0c;评估后因要卡上线时间来不及砍掉了。保不准下一…

Java 基础进阶篇(四)—— 抽象类与模板方法设计模式

文章目录 一、抽象类、抽象方法概述二、抽象类的特征三、模板方法设计模式3.1使用场景3.2 实现步骤3.3 写作文案例 补充&#xff1a;final 和 abstract 是什么关系? 一、抽象类、抽象方法概述 在 Java 中 abstract 是抽象的意思&#xff0c;可以修饰类、成员方法。 abstract …

【LeetCode股票买卖系列:122. 买卖股票的最佳时机 II | 贪心 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

基于 GS232 搭建的 SoC_up 说明

1.1 GS232 开源版本简介 GS232 开源版本不包含 DSP、浮点部件等。 TLB 大小为 32 项。 指令和数据 Cache 为 4 路组相连,每路大小为 4KB,Cache 行大小为 32 bytes。 对外接口为 32 位 AXI 接口。 1.2 1,soc_up结构 SoC_up 如上图所示。开源 GS232 对外有一个 AXI 接口,连…

「Codeforces」771-div2 E. Colorful Operations

E. Colorful Operations https://codeforces.com/contest/1638/problem/E 题目描述 给你一个数组&#xff0c;默认初始元素为 0 &#xff0c;颜色为 1&#xff0c;有三种操作&#xff1a; Color l r c&#xff1a;将 [l, r] 区间内的颜色修改为 cAdd c x&#xff1a;将所有颜…

Human Pose as Compositional Tokens 阅读笔记

人体姿态作为合成 token —— CVPR2023 论文链接 代码链接 摘要&#xff1a; 人体姿态常由身体关节的坐标向量或其热图embedding表示。虽然数据易于处理&#xff0c;但由于身体关节间缺乏依赖建模&#xff0c;即使是不现实的姿态也被接受。本文提出了一种结构化表示&#xff1…

el-form-renderer 使用指南

目录 前言 起步 使用 update-form && getFormValue 表单项动态显示或隐藏(hidden) 表单数据联动(on) 输入/输出格式化(inputFormat/outputFormat) set-options el-form-renderer 实践案例 案例一 案例二 自定义组件接入指南 前言 el-form-renderer是基于e…