什么是C++中的DRY原则?

来源:Android社区作者:长沙GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《什么是C++中的DRY原则?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是C++中的DRY原则?》有用,将其分享出去将是对创作者最好的鼓励。

DRY原则是Don't Repeat Yourself的缩写,意思是不要重复你自己,是软件开发中通用的核心设计原则之一,在C++项目开发中同样有着重要的指导作用。该原则的核心目标是消除代码中的重复逻辑,让每一段知识、每一个业务逻辑在系统中只有唯一的表示,从而降低代码维护难度,减少因重复修改带来的错误风险。

什么是C++中的DRY原则?

违反DRY原则的常见C++场景

很多C++开发者在开发过程中会无意间违反DRY原则,最常见的场景就是复制粘贴相同的代码片段到多个地方。比如下面这段计算圆和矩形面积的代码,就存在明显的重复逻辑:

#include <iostream>
using namespace std;

int main() {
    // 计算圆面积的逻辑
    double radius = 5.0;
    double pi = 3.1415926;
    double circleArea = pi * radius * radius;
    cout << "圆面积:" << circleArea << endl;

    // 计算矩形面积的逻辑
    double width = 4.0;
    double height = 6.0;
    double rectArea = width * height;
    cout << "矩形面积:" << rectArea << endl;

    // 后续如果要计算三角形面积,可能会继续复制类似的计算和输出逻辑
    return 0;
}

如果后续需要修改面积输出的格式,比如在所有输出前加上"面积结果:",就需要逐个修改每一处输出代码,很容易出现遗漏,这就是违反DRY原则带来的典型问题。

C++中践行DRY原则的方法

1. 函数封装重复逻辑

对于重复的计算或者操作逻辑,可以将其封装成独立的函数,需要使用时直接调用即可。比如上面的面积计算逻辑,可以封装成通用的输出函数:

#include <iostream>
using namespace std;

// 封装输出面积的函数,避免重复写输出逻辑
void printArea(const string& shape, double area) {
    cout << shape << "面积:" << area << endl;
}

int main() {
    double radius = 5.0;
    double pi = 3.1415926;
    double circleArea = pi * radius * radius;
    printArea("圆", circleArea);

    double width = 4.0;
    double height = 6.0;
    double rectArea = width * height;
    printArea("矩形", rectArea);
    return 0;
}

后续如果需要修改输出格式,只需要修改printArea函数即可,所有调用该函数的地方都会同步生效,避免了重复修改的问题。

2. 使用模板处理类型相关的重复逻辑

如果重复逻辑只是涉及不同的数据类型,可以使用C++模板来消除重复。比如需要计算不同数值类型的两个数的和,不需要为int、double、float分别写求和函数:

#include <iostream>
using namespace std;

// 模板函数,支持任意数值类型的求和
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    int intSum = add(1, 2);
    double doubleSum = add(1.5, 2.3);
    float floatSum = add(1.2f, 3.4f);
    cout << "int求和结果:" << intSum << endl;
    cout << "double求和结果:" << doubleSum << endl;
    cout << "float求和结果:" << floatSum << endl;
    return 0;
}

模板让同一套逻辑可以适配多种类型,避免了为不同类型重复编写几乎相同的代码。

3. 通过继承复用类级别的重复逻辑

在面向对象开发中,如果多个类存在相同的属性和方法,可以通过继承来复用这些逻辑。比如多个图形类都有颜色属性和获取颜色的方法,就可以把这部分逻辑放到基类中:

#include <iostream>
#include <string>
using namespace std;

// 图形基类,封装公共的属性和方法
class Shape {
protected:
    string color;
public:
    Shape(const string& c) : color(c) {}
    string getColor() const {
        return color;
    }
};

// 圆形类继承Shape,不需要重复定义color和getColor
class Circle : public Shape {
private:
    double radius;
public:
    Circle(const string& c, double r) : Shape(c), radius(r) {}
    double getArea() const {
        return 3.1415926 * radius * radius;
    }
};

// 矩形类继承Shape,同样复用基类的逻辑
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(const string& c, double w, double h) : Shape(c), width(w), height(h) {}
    double getArea() const {
        return width * height;
    }
};

int main() {
    Circle circle("红色", 5.0);
    Rectangle rect("蓝色", 4.0, 6.0);
    cout << "圆形颜色:" << circle.getColor() << endl;
    cout << "矩形颜色:" << rect.getColor() << endl;
    return 0;
}

继承让子类可以直接复用父类的逻辑,避免了在多个类中重复编写相同的代码。

践行DRY原则的注意事项

需要注意的是,DRY原则并不是要求完全消除所有重复,而是消除那些代表相同业务逻辑、相同知识的重复。有些重复是表面上的相似,实际逻辑并不相同,这种情况下强行合并反而会让代码变得复杂难懂。另外,过度追求DRY可能会导致代码抽象层级过高,增加理解成本,需要结合项目实际情况平衡复用和可读性。

DRY原则C++代码复用重复代码修改时间:2026-07-14 10:03:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。