2011-06-07 84 views
2

我正在构建一个RSS客户端并使用Argotic framework。它为Atom,RSS和OPML等不同种类的Feed提供了不同的类别。这些类不会从任何其他类继承,并且不会实现访问其属性的通用接口。如何处理具有不同属性的类似对象?

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

除API文档以外没有其他作者的文档,所以我很遗憾,为什么它是以这种方式实现的,而不是充分利用完整的类。有一件令我困扰的事情是,当使用GenericSyndicationItem类型时,我无法得到某个项目的作者。

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

回答

3

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

你已经确定你的一些选项,并有多种:

  1. 包装现有的在新的类中使用Adapter Pattern
  2. 扩展并通过实现一个共同的接口
  3. 重构统一不同类的类要使用的原始代码Polymorphism本地

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

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

2

它已经因为我写Argotic(这是写在之前存在的.NET System.ServiceModel.Syndication)很长一段时间,但由于笔者的概念,既RSS 2.0Atom存在,我真的不记得为什么这种类型的馈项目不包含Authors集合。这可能是因为OPML文档中的大纲元素没有作者的概念。显然,我的设计很差。底线是我还年轻,学习和Argotic虽然有用,当它写在3年前;非常需要进行重大的重构。如果System.ServiceModel.Syndication能满足您的需求,我建议你用它来解析您的联合供稿。

既然你有完整的源代码,以Argotic,它没有履行你的需求;你可以添加一个作者集合通用联合项目类和消费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")); 
+0

感谢:

那说和做,如果你知道之前的消费资讯提供的格式,你可以做以下。 Argotic很好,我认为我可以让它工作,它仍然是阻力最小的路径。我很年轻,也学习(使用Argotic作为团体项目),所以我们拭目以待。 System.ServiceModel.Syndication吮吸,因为它太容易失败开箱的阅读饲料。编写/创建格式良好的Feed可能会更好。 – Pete 2011-06-07 13:01:13

相关问题