【问题标题】:How should I decide whether to build a "protected interface"?我应该如何决定是否构建“受保护的接口”?
【发布时间】:2012-02-26 15:57:24
【问题描述】:

发件人:http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.9

三个关键:ROI、ROI 和 ROI。

您构建的每个界面都有成本和收益。每一个可重复使用的 您构建的组件有成本和收益。每个测试用例,每个 结构清晰的东西-a-ma-bob,任何类型的每一项投资。你 不应该在任何事情上投入任何时间或金钱 该投资的正回报。如果您的公司花费更多 比它节省的,不要这样做!

并不是每个人都同意我的观点;他们有权犯错。 例如,离现实世界足够远的人会采取行动 就像每一项投资都是好的。毕竟,他们推理,如果你等待 足够长的时间,它可能有一天会为某人节省一些时间。可能是。我们希望。

整个推理过程是不专业和不负责任的。你 没有无限的时间,所以要明智地投资。当然,如果你住在 象牙塔,你不用担心那些讨厌的东西叫 “时间表”或“客户”。但在现实世界中,你在一个 安排,因此您必须只将时间投入到您将 获得良好的回报。

回到最初的问题:你应该在什么时候投入时间建设 受保护的接口?回答:当你得到好的回报时 投资。如果要花一个小时,请确保节省 有人超过一个小时,并确保储蓄不是“总有一天 越过彩虹。”如果您可以在当前项目中节省一个小时, 这很简单:去吧。如果它要保存其他项目 一个小时也许有一天我们希望,然后不要这样做。如果它在 之间,您的答案将取决于您公司的交易方式 以未来对抗现在。

要点很简单:不要做会损害你的 日程。 (或者如果你这样做,请确保你永远不会和我一起工作;我会 你的头在盘子上。)如果有回报,投资是好的 那个投资。不要天真幼稚;长大并意识到 有些投资是不好的,因为总的来说,它们的成本高于它们 返回。

好吧,我不明白如何将它与受 C++ 保护的接口相关联。

请提供任何真实的 C++ 示例来说明此常见问题解答的内容。

【问题讨论】:

    标签: c++ inheritance interface access-specifier


    【解决方案1】:

    首先,永远不要将任何编程参考视为权威。曾经。一切都是别人的意见,最终你应该做最适合你的事情。

    也就是说,这篇文章基本上想说的是“不要使用那些花费你时间比节省更多时间的技术”。他们描述的“受保护接口”的一个示例如下:

    class C {
        public:
            int x;
    };
    

    现在,在 Java 中,所有 Java EE 编程书籍都会告诉您始终像这样实现该类:

    class C {
        public:
            int getX() { return x; }
            void setX(int x) { this.x = x; }
        private:
            int x;
    };
    

    ...这是适当的封装的实现(技术术语:稍微简化,这意味着最小化离散部分之间的共享)。使用您的代码的类担心您有一些方法可以getset 一个整数,而不是它实际上存储为类中的int。因此,如果您使用访问器方法,您以后可以更好地更改底层实现:也许您希望它从网络中读取该变量?

    但是,这是大量的额外代码(就字符而言)和一些额外的复杂性来实现。 正确做事其实是有代价的!就代码的正确性而言,这不是成本 - 直接 - 但您花了几分钟的时间“做得更好”,而您本可以花在做其他事情上,并且维护您编写的所有内容都涉及非零工作量,不管多么琐碎。

    因此,在我看来,这段话中所说的是一个好建议:始终仔细检查,当你去做某事时,你会得到比你投入的更多的东西。理智地检查一下你没有追随理想而损害你作为程序员或人类的实际效率。

    这些建议将在任何编程语言和任何行业中为您提供良好的服务。

    【讨论】:

    • 哇,如果那个常见问题解答是说我们不应该为这些课程操心太多,而是做点别的事情,那么我认为(个人意见)这个人是疯了!当你在一家公司工作时,你很有可能会因为编写这些代码而被淘汰。是的,好吧,如果您只是为自己写作,那么这是一个不同的问题。谢谢你的解释。
    • @AnishaKaul 我的意思是,你可能会因为编写好代码太慢而被解雇(或者更有可能无处可去),因为你可以尽可能快地编写坏代码。说“你应该总是做 X”很少是正确的。大多数问题的答案都在两个极端之间。
    • 好的,我明白了。 [笑话] 或许我们应该先快点写出糟糕的代码,给老板看任务已经完成,然后安静的坐下来把代码写好! :) :) :) 无论如何,感谢您的努力。这个常见问题条目不值得花时间!
    • 这实际上是一个很好的例子,说明额外费用可能会出现。如果我尝试从const C 中读取x 的值,则第一个示例有效,但第二个示例无效。应该是getX() const!所以通过“做对”,代码的支持成本更高!
    【解决方案2】:

    从你上面的引述来看,这家伙听起来像一个迂腐的混蛋:)

    查看他的常见问题解答中的上一个条目,他实际上是在说以下内容:

    1) 一个类对于两组不同的客户端有两个不同的接口:

    • 它有一个服务于无关类的公共接口
    • 它有一个服务于派生类的受保护接口

    2) 您是否总是为每个类创建两个不同的接口而烦恼?

    3) 回答:“不,不一定”

    • 有时值得付出额外努力来创建受保护的 getter 和 setter 方法,并使所有数据“私有”

    • 其他时候 - 他说 - 它“足够好”以使数据本身“受到保护”。无需编写大量额外代码的所有额外工作,并导致随之而来的大小和性能损失。

      对我来说听起来很合理。做你需要做的事——但不要太过分,以“理论”的名义做一堆不必要的事情。

    这就是他所说的全部 - 使用良好的判断力,不要过火。

    你不能反驳 :)

    PS:

    链接中的常见问题解答 19.5 到 19.9 处理“派生类”。除了“我应该如何构造基类以进行继承?”这个问题之外,这些讨论都不相关。换句话说,这不是关于一般“类”的讨论 - 只是关于“超类应该如何最好地使其子类可见?”。

    【讨论】:

    • Should you always go to the trouble of creating two different interfaces for each class? 在什么情况下应该根据什么来决定做什么?有任何 C++ 示例吗?
    • `它“足够好”以使数据本身“受到保护”。无需编写大量额外代码的所有额外工作,并招致随之而​​来的大小和性能损失。` 使数据受保护的唯一方法不是将其标记为“受保护”吗?你在说什么额外的工作?从受保护成员那里获取数据所需的那些 get 和 set 函数?无论如何,这个常见问题条目似乎并不重要。
    猜你喜欢
    • 2011-07-19
    • 2022-08-29
    • 2010-12-17
    • 2019-11-25
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多