C++中的Clean Code:原则与实践示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么整洁代码对C++很重要

\n\n

C++是一种强大且灵活的语言,既可以编写高效的底层系统代码,也可以构建复杂的应用程序。然而,这种灵活性常常导致混乱:重载函数、隐式转换、手动内存管理和宏可能会在几个月内将项目变成“泥潭”。由Robert Martin推广的Clean Code(整洁代码)概念完全适用于C++,但需要结合该语言的特性。

\n\n

在本文中,我们将分析C++中整洁代码的关键原则,并通过实际示例展示其应用。您将学习如何编写易于阅读、测试和维护的代码。

\n\n

1. 命名与结构:可读性的基础

\n\n

1.1. 有意义的变量和函数名

\n\n

整洁代码的第一条规则是名称应揭示意图。在C++中,由于存在重载和模板,这一点尤为重要。

\n\n

糟糕的示例:

\n\n
int d; // 以天为单位的已用时间\nvoid proc(int a, int b); // a和b是什么?
\n\n

良好的示例:

\n\n
int elapsedTimeInDays;\nvoid processData(const std::vector<int>& inputData, int maxIterations);
\n\n

1.2. 类和命名空间

\n\n

使用命名空间进行逻辑分组。避免使用全局变量——这是一种反模式。

\n\n
namespace network {\n    class TcpConnection {\n    public:\n        void connect(const std::string& host, int port);\n        void send(const std::vector<char>& data);\n    private:\n        int socket_;\n    };\n} // namespace network
\n\n

2. 函数:小而单一职责

\n\n

2.1. 单一职责原则(SRP)

\n\n

一个函数应该只做一件事。如果函数执行多个操作,请将其拆分。

\n\n

糟糕的示例:

\n\n
void processOrder(Order& order) {\n    // 验证\n    if (order.total < 0) throw std::invalid_argument("Negative total");\n    // 保存到数据库\n    database.save(order);\n    // 发送邮件\n    emailService.send(order.customerEmail, "Order confirmed");\n}
\n\n

良好的示例:

\n\n
bool validateOrder(const Order& order);\nvoid saveOrderToDatabase(const Order& order);\nvoid sendConfirmationEmail(const Order& order);\n\nvoid processOrder(Order& order) {\n    if (!validateOrder(order)) return;\n    saveOrderToDatabase(order);\n    sendConfirmationEmail(order);\n}
\n\n

2.2. 避免副作用

\n\n

函数不应在没有明确必要的情况下修改全局状态。使用常量引用并返回值,而不是修改参数。

\n\n
// 糟糕:修改了输入向量\nvoid addPrefix(std::vector<std::string>& words, const std::string& prefix) {\n    for (auto& word : words) {\n        word = prefix + word;\n    }\n}\n\n// 良好:返回一个新向量\nstd::vector<std::string> addPrefix(const std::vector<std::string>& words, const std::string& prefix) {\n    std::vector<std::string> result;\n    result.reserve(words.size());\n    for (const auto& word : words) {\n        result.push_back(prefix + word);\n    }\n    return result;\n}
\n\n

3. 内存管理与RAII

\n\n

3.1. 使用智能指针

\n\n

在现代C++(C++11及更高版本)中,通过new/delete进行手动内存管理已被视为过时。请使用std::unique_ptr和std::shared_ptr。

\n\n
// 糟糕:可能发生内存泄漏\nvoid process() {\n    Resource* res = new Resource();\n    // ... 如果这里发生异常,内存将泄漏\n    delete res;\n}\n\n// 良好:自动释放\nvoid process() {\n    a                

博客

书籍推荐