温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++如何封装必要的违反

发布时间:2021-11-26 14:20:46 来源:亿速云 阅读:132 作者:iii 栏目:大数据

这篇文章主要介绍“C++如何封装必要的违反”,在日常操作中,相信很多人在C++如何封装必要的违反问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何封装必要的违反”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

I.30: Encapsulate rule violations(封装必要的违反)

Reason(原因)

为了保证代码简单和安全。有些时候,因为逻辑或者性能上的原因,难看的,不安全,或者易错的技术也是必要的。如果(必须)这样,将它们限定在局部,而不是传染给接口从而导致更多的程序员必须小心处理它们。实现层面的复杂性应该尽可能的不用通过接口影响到用户的代码。

译者注:面向对象的第一个特性:封装的目的之一就是隔离实现和接口。如果实现影响到接口,一个根本原因就是对封装的理解有问题。

Example(示例)

考虑依赖某种形式的输入(例如main函数的参数)的程序,假设其输入来自文件,命令行或者标准输入,代码可能这样写:

bool owned;owner<istream*> inp;switch (source) {case std_in:        owned = false; inp = &cin;                       break;case command_line:  owned = true;  inp = new istringstream{argv[2]}; break;case file:          owned = true;  inp = new ifstream{argv[2]};      break;}istream& in = *inp;

这段代码违反了针对未初始化变量的准则,针对忽略所有权的准则和针对魔术常量的准则。通常,某人必须记着在某些写下:

if (owned) delete inp;

我们可以使用带有特殊删除器的unique_ptr来处理这段常见的示例代码,这个删除器对cin不做任何事情,但是这个技术对初学者(很容易遭遇这个问题的人)是有困难的。另外这段示例代码只是某个应该被认为是静态的属性(这里是所有权)需要在执行时处理的更普遍问题的一个例子。一般来说,更多的情况,最安全的示例可以被静态处理,因此我们不想增加额外的代价和复杂性。但是我们也必须处理不常见的,不够安全的和必要的高代价的情况。这样的例子在[Str15]中被讨论。

So, we write a class

因此我们写了一个类:

class Istream { [[gsl::suppress(lifetime)]]public:    enum Opt { from_line = 1 };    Istream() { }    Istream(zstring p) :owned{true}, inp{new ifstream{p}} {}            // read from file    Istream(zstring p, Opt) :owned{true}, inp{new istringstream{p}} {}  // read from command line    ~Istream() { if (owned) delete inp; }    operator istream& () { return *inp; }private:    bool owned = false;    istream* inp = &cin;};

现在,作为istream动态特性的所有权已经被包装了。实际的代码可能还需增加一点关于潜在错误的检查。

译者注:删除也好,不删除也好,调用者都不需要关心了。

Enforcement(实施建议)

  • Hard, it is hard to decide what rule-breaking code is essential

    困难,很难判断哪种违反规则的代码是必要的。

  • Flag rule suppression that enable rule-violations to cross interfaces

    标记那些导致规则违反的影响透过接口传播的规则抑制行为。

到此,关于“C++如何封装必要的违反”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI