包装现有库的正确设计是什么?

时间:2011-11-09 13:48:27

标签: .net class parent-child

我已经在.NET中完成了几个小的个人项目,并且根据SO的建议决定做一些更先进的事情,以便我可以随时学习。

目前我正在编写一个项目来增强现有的第三方库,以便我将编写的另一个应用程序可以更容易地使用它的对象。

在第三方库中,我专注于一个对象,我们称之为DataSource,而这又包含与数据库相关的结果。对于一个小例子(这里的对象有更多的方法和属性没有显示),它有一个属性的“树”如下:

A_DataSet -> A_Result -> A_Dimensions() -> A_Dimension -> A_SetDisplayType(DisplayAs)

此处Result对象有一个名为Dimensions的属性,其中包含Dimension的集合。最后,每个Dimension都有一个名为SetDisplayType的方法,它控制Dimension中另一个属性中包含的数据的显示。为了本示例的目的,这些元素以A_为前缀。

现在,由于第三方库的方法和属性有时令人困惑,而且本质上很多,我想为这个库创建一个“包装器”,以便简化其使用和结构。在对如何更加逻辑地组合元素进行了相当多的考虑后,我想到了以下方向:#/ p>

B_DataSet -> B_Dimensions() -> B_Dimension -> B_DisplayProperties -> B_SetDisplayType(DisplayAs)

在这个例子中,我用B_为对象加上前缀,只是为了区别于上面的现有元素,当然这不是最终的命名约定(实际上命名对于这个问题的目的并不重要) )。

我坚持的观点是我应该如何从包装类中正确引用第三方对象(A_ *)。例如,如果我想使用B_SetDisplayType,那么这将在内部调用A_SetDisplayType。但是,由于A_SetDisplayType属于A_Dimension,因此我需要在A_Dimension中引用B_DisplayProperties。 在创建对象时,是否可以在构造函数中向它们传递对“父”的引用?我正在考虑类似下面的代码:

Public Class DataSetDisplayProperties

    Private _A_Dimension as A_Dimension

    Public Sub New(MyDimension as A_Dimension)

        _A_Dimension = MyDimension

    End Sub

    Public Sub B_SetDisplayType(DisplayAs as Integer)

        Call _A_Dimension.A_SetDisplayType(DisplayAs)

    End Sub

End Class

这看起来不错,还是有更好的方法?

我正在考虑使用外观,但当我尝试将不同“级别”的方法引用到现有结构时,我不确定这是如何工作的。

请注意,我不能从任何第三方类继承,也不能更改它们的代码。

如果上述内容看起来有些混乱,我很抱歉,我想我可能不知道如何表达我的问题的正确术语。谢谢!

1 个答案:

答案 0 :(得分:0)

这似乎不是这个问题的答案,当然不是直接问题,而是和我在一起。首先,当你说你想要建立一个Facade时,我认为你是对的。我是否可以建议您使用测试驱动开发方法为此外观开发接口,然后您可以专注于如何使用第三方库实现该接口。这将使您能够清楚地了解第三方库的特性和命名约定,并完全专注于想要提供的界面以及您希望它实现的目标。它还将为您的Facade实现提供单元测试套件。

如果您之前没有使用过TDD,那么您需要经历一段曲线,但我可以向您保证这笔投资是值得的。在工具方面,我推荐使用NUnit和MOQ。您可能还需要一个IoC容器,如Unity 2.0。

祝你好运!