如何处理具有不同属性的类似对象?

时间:2011-06-07 03:02:13

标签: c# .net rss atom-feed argotic

我正在构建一个RSS客户端并使用Argotic framework。它为Atom,RSS和OPML等不同类型的提供不同的类。这些类不会从任何其他类继承,也不会实现访问其属性的公共接口。

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

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

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

2 个答案:

答案 0 :(得分:3)

当您使用第三方库并且库不符合您的架构需求时:适应!但是如何?

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

  1. 使用Adapter Pattern
  2. 将新类中的现有类换行
  3. 通过实施通用界面来扩展和统一不同的类
  4. 重构原始代码以原生使用Polymorphism
  5. 如果现有的类根本没有公共基类,那么前两个选项的工作量大致相同。如果您决定切换到不同的框架,则包装具有稍微松散耦合的优点。扩展避免了许多代码,例如adaptee.AdapteeMethod,因为您可以在不指定实例的情况下调用基本方法。在这种情况下,我会倾向于适配器模式,除非至少有某些公共基类,您可以通过继承来利用它。

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

答案 1 :(得分:2)

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

底线是我还年轻并且学习,Argotic虽然在3年前写成时很有用;可悲的是需要进行重大的重构。如果System.ServiceModel.Syndication可以满足您的需求,我建议您使用它来解析您的联合供稿。

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

无论你是否贡献回来,你最有可能得到重构的祝福,我多年前就履行了项目责任,并且不确定这些日子里的状态是什么。

说完了,如果您在使用Feed之前知道Feed的格式,则可以执行以下操作:

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"));