我一直在研究这个插件系统。我以为我通过设计并开始实施。现在我想知道我是否应该重温我的设计。我的问题如下:
目前在我的设计中我有:
接口类FileNameLoader
,用于加载应用程序需要加载的所有共享库的名称。即加载目录中的所有文件,加载XML文件中指定的所有文件,加载所有文件用户输入等。
实际加载共享对象的接口类LibLoader
。该类仅负责在给定文件名后加载共享对象。加载共享库可能需要多种方法。即使用RTLD_NOW
/ RTLD_LAZY
....,检查是否已加载lib等。
ABC Plugin
,一旦提供了句柄,就会将句柄中的函数加载到库中。有很多方法可以改变。
创建PluginFactory
s的接口类Plugin
。
ABC PluginLoader
是管理一切的母班。
现在,我的问题是我觉得FileNameLoader
和LibLoader
可以进入Plugin
。但这意味着,如果有人想将RTLD_NOW
更改为RTLD_LAZY
,则必须更改Plugin
课程。另一方面,我觉得这里的课程太多了。请提供一些意见。如有必要,我可以发布接口代码。提前谢谢。
编辑:
在考虑了这个问题之后,我得出的结论是更多接口更好(至少在我的场景中)。假设x
的{{1}},FileNameLoader
实现的y
实现LibLoader
实现z
。如果我将这些类分开,我必须编写Plugin
实现类。然后我可以将它们组合起来以获得任何功能。另一方面,如果所有这些接口都在x + y + z
类中,那么我必须编写Plugin
个实现类来获得大于x*y*z
的所有可能的功能,因为有至少2个接口实现。这只是它的一个方面。另一个优点是,当有更多接口时,接口的目的更加清晰。至少这是我的想法。
答案 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)
拥有让一切都错的一大类。所以拥有一个定义一切的大界面。