我该如何决定是否建立一个“受保护的界面”?

时间:2012-02-04 05:42:59

标签: c++ inheritance interface access-specifier

来自:http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.9

  

三个关键:投资回报率,投资回报率和投资回报率。

     

您构建的每个界面都有成本和收益。每个可重复使用的   您构建的组件具有成本和收益。每个测试用例,每个   干净整洁的东西-a-ma-bob,各种投资。您   如果没有,任何事情都不应该投入任何时间或金钱   这笔投资的积极回报。如果你的公司花费更多   比它节省,不要这样做!

     

并非所有人都同意我的意见;他们有权利出错。   例如,居住在远离现实世界的人们的行为   像每一笔投资都是好的。毕竟,如果你等了,他们会推理   很长一段时间,它可能会在某一天拯救某人。也许。我们希望。

     

整条推理都是不专业和不负责任的。您   没有无限的时间,所以要明智地投资。当然,如果你住在一个   象牙塔,你不必担心那些讨厌的事情   “时间表”或“客户”。但在现实世界中,你在一个人中工作   时间表,因此您必须将时间投入到您的目的地   得到很好的回报。

     

回到最初的问题:你应该什么时候投入时间进行建设   受保护的界面?答:当你得到一个好的回报   投资。如果它花费你一个小时,请确保它节省   有人超过一个小时,并确保节省不是“有一天   在彩虹上。“如果你能在当前项目中节省一个小时,   这是一个明智的选择:去吧。如果它要保存一些其他项目   有一天我们可能希望一小时,然后不要这样做。如果是的话   之间,您的答案将取决于您公司的交易方式   关于现在的未来。

     

重点很简单:不要做可能损害你的事情   时间表。 (或者,如果你这样做,请确保你永远不和我合作;我会   你的头放在盘子上。)投资是好的,如果有回报的话   那个投资。不要幼稚和幼稚;长大并意识到这一点   有些投资很糟糕,因为它们总的来说比它们花费更多   返回。

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

请提供任何真实的C ++示例,以显示此常见问题解答的内容。

2 个答案:

答案 0 :(得分:2)

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

所以,那就是说,这篇文章基本上试图说的是“不要使用比他们节省更多时间的技术”。他们描述的“受保护接口”的一个例子如下:

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;
};

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

然而,这是大量的额外代码(就字符而言)以及实现它的一些额外复杂性。正确地做 实际上是有代价的!这不是代码正确性的代价 - 直接 - 但你花了一些时间来做“更好”,你可以用来做其他事情,并且有很多工作涉及维护你写的所有内容,无论多么微不足道。

所以,在这篇文章中所说的内容在我看来是一个很好的建议:总是仔细检查,当你去做某事时,你会得到更多的东西而不是你投入的东西。理智检查那个你没有遵循理想,不利于你作为程序员或人类的实际有效性。

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

答案 1 :(得分:0)

从上面的引文中,这个家伙听起来像个迂腐的混蛋:)

查看常见问题解答中之前的条目,他真的说了以下内容:

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

  • 它有一个服务于不相关类的公共接口
  • 它有一个受保护的接口,用于提供派生类

2)你是否应该总是为每个类创建两个不同的接口?

3)答案:"不,不一定"

  • 有时需要额外的努力来创建受保护的getter和setter方法,并使所有数据"私有"

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

    对我来说很合理。做你需要做的事情 - 但是不要过多地做一些不必要的的东西,而不是理论&#34;。< / p>

他所说的一切 - 使用良好的判断力,不要过分。

你无法辩解:)

PS:

常见问题&解答19.5到19.9在您的链接中处理&#34;派生类&#34;。这个讨论在问题之外都不相关&#34;我应该如何构建用于继承的基类?&#34;换句话说,它关于&#34;类&#34;的讨论。总的来说 - 只有&#34;超级班怎样才能最好地让它的子类可见?&#34;。