【问题标题】:Best OO practice to adapt one type to another?使一种类型适应另一种类型的最佳 OO 实践?
【发布时间】:2008-11-17 22:04:06
【问题描述】:

我有一组域对象,我需要将其转换为另一种类型以供 .NET 框架使用。进行此类转换的最佳做法是什么?

具体来说,我有一个名为 ContentEntry 的类型,我需要将其转换为 SyndicationItem 以用于放入 SyndicationFeed。转换本身很简单,但我正在寻找一个好的模式。我是在 ContentEntry 上创建一个名为 CreateSyndicationItem() 的方法,还是一个单独的转换器对象?也许是一种扩展方法?

这有点主观,但我会很感激一些想法。

编辑说明:我想说明我不控制 SyndicationItem。它内置在 .NET Framework 中。另外,我真的很想一次将多个 ContentEntry 对象转换为 SyndicationItems。

【问题讨论】:

    标签: c# .net oop


    【解决方案1】:

    我建议查看Adapter Pattern

    在计算机编程中,适配器 设计模式(通常称为 包装模式或只是一个 wrapper) 翻译一个接口 一个类转换成一个兼容的接口。

    【讨论】:

      【解决方案2】:

      由于无法修改 SyndicationItem 的构造函数,我建议您使用factory pattern。创建一个具有 CreateSyndicationItem() 方法的 SyndicationItemFactory 类。此方法返回一个 SyndicationItem 对象。在这种情况下,您只需要该方法的一个版本,它将采用 ContentEntry 对象。

      当你说你想一次创建多个 ContentEntry 对象时,我假设你说的是一个 ContentEntry 对象数组。另一种方法(比如 CreateSyndicationItems())可能会返回一个 SyndicationItems 数组,并将 ContentEntry 对象数组作为其参数。

      【讨论】:

      • 在我这里的情况下,我发现这是最好的方法。强制转换似乎不合适,并且由于不需要维护任何状态,因此创建一个新的转换器类,每次我需要进行转换时都会被实例化似乎有点矫枉过正。我的工厂目前只有静态成员。
      • 工厂模式的设计是为了让工厂决定构建哪个实现,但只返回接口,因此调用类不关心创建了哪个实现。这并不是作者所要求的严格的一对一映射。
      【解决方案3】:

      恕我直言,一个转换一种方式的 Converter 类,可能另一种方式是你应该做的。一个类应该有一个目的,例如表示 ContentEntry。添加转换为其提供了第二个目的,因此打破了 OO 的“规则”。

      【讨论】:

        【解决方案4】:

        如果你可以通过这两种类型的公共合约进行转换,我强烈推荐一种扩展方法。

        另请参见 System.Linq.Enumerable.ToList()、Enumerable.ToDictionary()

        推理:

        • 您不希望任何一个对象与另一个对象耦合。
        • 转换过程本身一旦完成就没有状态需要管理(适用于静态方法)

        【讨论】:

          【解决方案5】:

          这取决于...您只是想要一种方便的方式来托管转换方法吗?如果您控制一个或两个类,您可以简单地添加一个强制转换运算符重载,这样您就可以将一个类强制转换为另一个类。如果你想让它很明显,你可以做一个显式的操作符

          SyndicationItem item = (SyndicationItem)entry

          【讨论】:

            猜你喜欢
            • 2022-07-28
            • 2021-04-11
            • 2018-12-22
            • 1970-01-01
            • 2012-03-28
            • 2011-05-30
            • 2011-10-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多