有很多接口或只有一个接口更好吗?

时间:2010-10-18 12:13:01

标签: c++ design-patterns coding-style

我一直在研究这个插件系统。我以为我通过设计并开始实施。现在我想知道我是否应该重温我的设计。我的问题如下:

目前在我的设计中我有:

  1. 接口类FileNameLoader,用于加载应用程序需要加载的所有共享库的名称。即加载目录中的所有文件,加载XML文件中指定的所有文件,加载所有文件用户输入等。

  2. 实际加载共享对象的接口类LibLoader。该类仅负责在给定文件名后加载共享对象。加载共享库可能需要多种方法。即使用RTLD_NOW / RTLD_LAZY ....,检查是否已加载lib等。

  3. ABC Plugin,一旦提供了句柄,就会将句柄中的函数加载到库中。有很多方法可以改变。

  4. 创建PluginFactory s的接口类Plugin

  5. ABC PluginLoader是管理一切的母班。

  6. 现在,我的问题是我觉得FileNameLoaderLibLoader可以进入Plugin。但这意味着,如果有人想将RTLD_NOW更改为RTLD_LAZY,则必须更改Plugin课程。另一方面,我觉得这里的课程太多了。请提供一些意见。如有必要,我可以发布接口代码。提前谢谢。

    编辑:

    在考虑了这个问题之后,我得出的结论是更多接口更好(至少在我的场景中)。假设x的{​​{1}},FileNameLoader实现的y实现LibLoader实现z。如果我将这些类分开,我必须编写Plugin实现类。然后我可以将它们组合起来以获得任何功能。另一方面,如果所有这些接口都在x + y + z类中,那么我必须编写Plugin个实现类来获得大于x*y*z的所有可能的功能,因为有至少2个接口实现。这只是它的一个方面。另一个优点是,当有更多接口时,接口的目的更加清晰。至少这是我的想法。

5 个答案:

答案 0 :(得分:5)

我的c ++项目通常由实现一个或多个接口的对象组成。

我发现这种方法有以下影响:

  • 使用接口强制执行您的设计。
  • (仅限我的意见)确保更好的程序设计。
  • 相关功能分组为接口。
  • 如果您的接口实现不完整或不正确(适用于接口更改),编译器会通知您。
  • 您可以传递界面指针而不是整个对象。

传递接口指针的好处是,您只公开其他对象所需的功能。

COM大量使用接口,因为它的模块化设计对IPC(进程间通信)非常有用,可以促进代码重用并实现向后兼容性。

由于这些原因,Microsoft广泛使用COM并将其操作系统和最重要的API(DirectX,DirectShow等)基于COM,尽管它不是最容易访问的技术,但COM不会很快消失。

这些会对您自己的计划有所帮助吗?由你决定。如果您要将大量代码转换为COM对象,那肯定是正确的方法。

你提到的接口的其他好东西 - 我自己判断它们对你有多大用处。就个人而言,我发现接口是不可或缺的。

答案 1 :(得分:2)

通常我唯一一次提供多个接口,这是因为我有两种完全不同的客户端(例如:客户端和服务器)。在那种情况下,是的,它完全没问题。

然而,这句话让我担心:

  

我以为我通过设计并开始了   实施

那是老式的Waterfall思考。你永远不会完成设计。在真正的客户端第一次尝试使用您的课程时,您几乎总是必须进行相当重要的重新设计。此后,您将不时发现客户端使用的边缘情况,这些情况需要(或者会非常有利)一两个额外的新呼叫,或者对所有呼叫采用稍微不同的方法。

答案 2 :(得分:2)

您可能对Interface Segregation Principle感兴趣,这会产生更多更小的界面。

  

“客户不应该被迫依赖他们不使用的接口。”

本文提供了有关此原则的更多详细信息:http://www.objectmentor.com/resources/articles/isp.pdf

这是Bob Martin的协同SOLID原则的一部分。

答案 3 :(得分:0)

没有黄金法则。它取决于场景,即使这样,您可能会发现某些假设已经发生变化,您需要相应地更新它。

我个人喜欢你现在的方式。您可以替换顶级或非常具体的部分。

答案 4 :(得分:0)

拥有让一切都错的一大类。所以拥有一个定义一切的大界面。