抽象类与模板 - 良好实践

时间:2015-10-14 22:06:00

标签: c++ c++11 coding-style

假设我有某种类,它代表算法,这种算法需要一些特殊的数据(例如某些成员函数)。

在示例中我们可以这样做:

                                          <<interface>>
+------------------------+               +------------+
|       Algorithm        |    <<uses>>   |    Data    |
+------------------------+-------------->+------------+
| + doJob(inData : Data) |               | +getPixel()|
+------------------------+               +------------+

每次想要使用类算法时,我们都可以强制Algorithm的用户继承Data。我们也可以做一个模板:

template<typename T>
doJob(T&& inputData){
   //implementation
}

(没有类来简化事情的功能)

我们强制我们的客户端创建具有正确名称方法的类,但是我们不会让他实现我们的抽象类(不同语言的接口)(可能会有更好的性能吗?)

我的问题是:

哪种方法更好?

  • 在选择时,我们应该以模板方式还是以抽象方式在库中实现?

  • 标准是否有理由不定义一些标准的“接口”,如std :: container或std :: factory(只是示例)?

2 个答案:

答案 0 :(得分:1)

你实际上有一个以上的问题,所以,让我们逐一回答:

  

哪种方法更好?

一般来说,两者都不是更好。每个人都有优点和缺点。但是你确实得到了一个有趣的观点:在更抽象的层面上,这两者几乎是一样的。

  

当我们选择时,我们应该以模板方式或抽象方式在库中实现?

使用模板:

  1. 一般来说,执行速度更快。它可以更多更快,并且可以完成许多内联,然后进行优化。 OTOH具有先进的去虚拟化编译器/链接器以及无法进行大量内联/优化的功能,您可能会获得几乎相同的速度。

  2. 编译时间较慢。它可能很多更慢,特别是如果你去&#34;花哨的模板 - 元编程&#34;方式。

  3. 更糟糕的编译错误。他们可能很多更糟糕,特别是如果你去了'#34;花式模板 - 元编程&#34;办法。当C ++获得对概念的支持时,应该能够避免这种情况。

  4. 如果您仔细设计,可以提高型号的安全性。 OTOH,如果你不小心,你最终会比Smalltalk更糟糕的鸭子打字。概念也是一种可以在这里提供帮助的工具。

  5. 使用虚拟功能/接口,您将获得:

    1. 解耦设计,如果你小心,一个文件的更改不需要重新编译其他文件,编译时间会快得多。
    2. 运行时多态,意味着您可以动态加载代码(它听起来很简单,但是,它可能)
    3. 在OO中有经验的人看起来更熟悉。
    4.   

      标准是否有理由不定义某些标准&#34;接口&#34;比如std :: container或std :: factory(只是例子)?

      人们可以找到很多&#34;低级&#34;原因,我猜,但根本原因是表现。也就是说,STL被设计为&#34;尽可能快&#34;并且将一些(有用的)接口放在顶部,如果它&#34;现在几乎不可能。

答案 1 :(得分:0)

这似乎是一个基于意见的问题。强迫客户履行义务的最好方法是让他签订合同,将联系人作为接口。