专栏首页C++核心准则原文翻译C++核心准则E4,5:设计并构建不变量

C++核心准则E4,5:设计并构建不变量

E.4: Design your error-handling strategy around invariants

E.4:围绕不变量设计错误处理策略

Reason(原因)

To use an object it must be in a valid state (defined formally or informally by an invariant) and to recover from an error every object not destroyed must be in a valid state.

为了使用对象,它一定要处于有效状态(通过不变量形式化或非形式化定义)并且为了从错误中恢复,所有没有销毁的对象必须处于有效状态。

Note(注意)

An invariant is a logical condition for the members of an object that a constructor must establish for the public member functions to assume.

不变量是一个适用于对象成员的逻辑条件,这个条件必须有构造函数建立,可以作为公有成员函数的前提条件。

Enforcement(实施建议)

???

E.5: Let a constructor establish an invariant, and throw if it cannot

E.5:让构造函数建立不变量,如果不能就抛异常

Reason(原因)

Leaving an object without its invariant established is asking for trouble. Not all member functions can be called.

建立一个对象却没有建立不变量是在找麻烦。不是所有成员函数都是可以被调用的。

Example(示例)

class Vector {  // very simplified vector of doubles
    // if elem != nullptr then elem points to sz doubles
public:
    Vector() : elem{nullptr}, sz{0}{}
    Vector(int s) : elem{new double[s]}, sz{s} { /* initialize elements */ }
    ~Vector() { delete [] elem; }
    double& operator[](int s) { return elem[s]; }
    // ...
private:
    owner<double*> elem;
    int sz;
};

The class invariant - here stated as a comment - is established by the constructors. new throws if it cannot allocate the required memory. The operators, notably the subscript operator, relies on the invariant.

See also: If a constructor cannot construct a valid object, throw an exception

类不变量-这里通过注释声明-通过构造函数建立了。如果不能分配要求的内存,new操作会抛出异常。运算符,特别是下标运算符依靠不变量。参见:如果不能构建有效的对象,就抛出异常。

Enforcement(实施建议)

Flag classes with private state without a constructor (public, protected, or private).

标记那些没有构造函数(公有的,私有的或保护的)却有私有成员的类。

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#e4-design-your-error-handling-strategy-around-invariants

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则Con.2:默认情况下,将成员函数定义为const类型

    A member function should be marked const unless it changes the object's observab...

    面向对象思考
  • C++核心准则C.160:定义运算符主要是为了模仿习惯用法

    Here, the conventional semantics is maintained: Copies compare equal.

    面向对象思考
  • C++核心准则Con.4:如果一个对象在构建之后值不会改变,使用const定义它

    Prevent surprises from unexpectedly changed object values.

    面向对象思考
  • 从日志服务配置到日记审计溯源

    天钧
  • 化腐朽为神奇:简明日志规范

    上周静儿用一天的时间写了一个日志切面,大家都非常支持配合,内部各个模块都使用起来。

    静儿
  • Cypress系列(34)- window() 命令详解

    https://www.cnblogs.com/poloyy/category/1768839.html

    小菠萝测试笔记
  • 使用 Kotlin 和Spring Boot 2.0快速开发REST API客户端 顶

    在上一篇文章使用 Kotlin 和Spring Boot 2.0快速开发REST API接口内介绍了如何使用简单代码快速实现REST API的服务端接口,此文简...

    Michael Chen
  • 【通信】WebSocket

    通常,当客户端访问一个网页时,会向Web服务器发送一个HTTP请求,Web服务器接收该请求,并返回响应,客户端在接收到响应后再将信息呈现出来。

    Html5知典
  • 零基础如何成为代码高手

    编程不是盗墓,不是请客吃饭,不是描画绣花,不能那样儒雅,那样闲庭信步,那样从容不迫。编程是一门技术,一门进行创造的技术。 绝大多数计算机专业的学生是零基础,其中...

    程序员互动联盟
  • 分析一天1000万北京地铁客流,我们发现...

    华章科技

扫码关注云+社区

领取腾讯云代金券