2

我正在构建一个 RSS 客户端并使用Argotic 框架。它为不同类型的提要(如 Atom、RSS 和OPML )提供不同的类。这些类不从任何其他类继承,并且它们不实现用于访问其属性的通用接口。

有一种GenericSyndicationFeed实现重载方法的类型,您可以在其中传入AtomFeedor RssFeed。如果我想使用“更多”的强类型类,我基本上需要在我的程序中到处都有两个代码路径(一个用于 Atom,一个用于 RSS)。显然,我不会这样做。

除了 API 文档之外,没有来自作者的文档,所以我有点不知道为什么以这种方式实现它而不是充分利用完整的类。GenericSyndicationItem困扰我的一件事是,在使用该类型时我无法获得项目的作者。

我可以在这里做什么?做一个包装类?还是从RssFeedandAtomFeed类继承并实现一个接口来公开我认为两者应该相似的属性?

4

2 回答 2

3

当您使用第三方库并且该库不能满足您的架构需求时:适应!但是怎么做?

您已经确定了一些选项,还有更多:

  1. 使用适配器模式将现有类包装在新类中
  2. 通过实现一个通用接口来扩展和统一不同的类
  3. 重构原始代码以原生使用多态性

如果现有的类真的根本没有公共基类,那么前两个选项的工作量都差不多。如果您决定切换到不同的框架,包装的优点是耦合更松散。扩展避免了很多代码,adaptee.AdapteeMethod因为您可以在不指定实例的情况下调用基本方法。在这种情况下,我会倾向于适配器模式,除非至少有一些可以通过继承利用的通用基类。

最后一个严肃的选择是将代码重构为更加面向对象,如果您打算回馈项目并得到项目作者的祝福,我只推荐这种方法。原因是你有工作代码,你可能不完全理解并且搞乱它只会有破坏它的风险。保留工作代码并从外部对其进行调整。

于 2011-06-07T05:17:22.947 回答
2

自从我写 Argotic 已经很长时间了(它是在System.ServiceModel.Syndication存在于 .NET 之前编写的),但是由于作者的概念存在于RSS 2.0Atom中,我真的不记得为什么泛型提要项目不包括作者集合。这可能是因为OPML文档中的大纲元素没有作者的概念。显然我的设计很糟糕。

底线是我还年轻,还在学习,3年前写的Argotic虽然有用;悲惨地需要一个重大的重构。如果System.ServiceModel.Syndication可以满足您的需求,我建议您使用它来解析您的联合提要。

由于您拥有 Argotic 的完整源代码,但它并不能满足您的需求;您可以将 Authors 集合添加到通用联合项目类并在使用 RSS 或 Atom 提要时填充它。

无论您是否回馈,我都绝对有幸按照您认为合适的方式进行重构,几年前我推卸了项目责任,并且不确定这些天它处于什么状态。

话虽如此,如果您在使用之前知道提要的格式,则可以执行以下操作:

RssFeed feed = RssFeed.Create(new Uri("http://www.pwop.com/feed.aspx?show=dotnetrocks&filetype=master"));

AtomFeed feed = AtomFeed.Create(new Uri("http://news.google.com/?output=atom"));
于 2011-06-07T06:16:18.220 回答