当前位置:首页>java>【C++编程哲学妙喻】- 契约编程:先签协议,再合作

【C++编程哲学妙喻】- 契约编程:先签协议,再合作

  • 2026-10-21 13:26:43
【C++编程哲学妙喻】- 契约编程:先签协议,再合作
函数与调用者之间,最好先签一份'合作协议'。函数声明:要我执行可以,但你必须满足这些条件。同时承诺:事成之后,我保证达成这些结果。

契约编程本质是"先签协议再合作"的工程思维。C++26提案将条件检查从函数体移至接口声明,让代码实现更干净,错误检测更前置。就像银行取款,规则写在合同里,执行时只需专注业务逻辑。

【代码演示】

#include <iostream>#include <stdexcept>// 🆕 C++26 真正的契约语法(提案中)class ModernBankAccount {    int balance{1000};public:    // 契约作为函数接口的一部分,不是函数体内的检查    void withdraw(int amount)         [[expects: amount > 0]]           // 前置条件:编译期可检查        [[expects: balance >= amount]]    // 前置条件:运行期检查          [[ensures: balance == old(balance) - amount]]  // 后置条件        [[ensures: balance >= 0]]                      // 不变量    {        // 干净的实现:不需要手动检查参数        balance -= amount;    }    void deposit(int amount)        [[expects: amount > 0]]        [[ensures: balance == old(balance) + amount]]    {        balance += amount;    }    int getBalance() const {         return balance;     }};// 🔍 对比:传统方式需要手动检查class TraditionalBankAccount {    int balance{1000};public:    void withdraw(int amount) {        // 这些检查应该由语言自动处理!        if (amount <= 0) throw std::invalid_argument("金额必须为正");        if (amount > balance) throw std::runtime_error("余额不足");        balance -= amount;        // 这些断言应该由语言自动验证!        assert(balance >= 0);    }    int getBalance() const { return balance; }};int main() {    std::cout << "=== 真正的契约编程 ===\n";    // 使用契约的代码看起来更干净    ModernBankAccount account;    // 编译器/运行时会自动检查契约    account.withdraw(100);  // ✅ 正常    // account.withdraw(-50);  // ❌ 编译期或运行期自动报错    std::cout << "余额: " << account.getBalance() << "\n";    std::cout << "💡 契约在接口中声明,不在实现中检查!\n";    return 0;}
AI大师Karpathy最新访谈:AGI还需十年
不惑之年,我重拾经典
“万事俱备”的陷阱,会毁掉你的可能性
年龄只是个数字?别再自欺欺人了
从代码小白到架构与管理的蜕变
研发转管理会失去能力护城河?
迈向架构师与技术领袖【程序员的蜕变之路】
工欲善其事,必先利其器
一个普通IT人的20年奋斗:从小白到编程教育布道者
AI什么都会了,我们还要学习吗?
Andrej Karpathy最新演讲:AI时代的软件
小朋友学编程早,真能“赢在起跑线”?
普通人如何应对AI带来的变革
抱歉,只能为30人开放!AI+真人护航学编程
AI时代为何还要学习编程?
为简化编程入门,我费尽思量

最新文章

随机文章