2

RSS クライアントを構築し、Argotic フレームワークを使用しています。Atom、RSS、 OPMLなど、さまざまな種類のフィードにさまざまなクラスを提供します。これらのクラスは他のクラスから継承されず、プロパティにアクセスするための共通のインターフェイスを実装しません。

orGenericSyndicationFeedを渡すことができるオーバーロードされたメソッドを実装する型があります。「より多くの」厳密に型指定されたクラスを使用したい場合、基本的に、プログラムのいたるところに 2 つのコード パス (Atom 用と RSS 用) が必要になります。明らかに、私はこれを行うつもりはありません。AtomFeedRssFeed

API ドキュメント以外に作成者からのドキュメントはありません。そのため、完全なクラスを最大限に活用する代わりに、なぜこのように実装したのか、ちょっと途方に暮れています。気になる点の 1 つは、このGenericSyndicationItemタイプを使用しているときにアイテムの作成者を取得できないことです。

ここで何ができますか?ラッパークラスを作成しますか? RssFeedまたは、およびクラスから継承しAtomFeed、インターフェイスを実装して、両方から類似していると思われるプロパティを公開しますか?

4

2 に答える 2

3

サードパーティのライブラリを使用していて、そのライブラリがアーキテクチャのニーズを満たしていない場合:適応してください!しかし、どのように?

あなたはすでにいくつかの選択肢を特定しており、さらに多くの選択肢があります。

  1. アダプタパターンを使用して、既存のクラスを新しいクラスにラップします
  2. 共通のインターフェースを実装することにより、異種のクラスを拡張および統合します
  3. ポリモーフィズムをネイティブに使用するために元のコードをリファクタリングする

既存のクラスに実際に共通の基本クラスがまったくない場合、最初の2つのオプションは両方ともほぼ同じ量の作業です。別のフレームワークに切り替えることにした場合に備えて、ラッピングには結合が少し緩くなるという利点があります。adaptee.AdapteeMethodインスタンスを指定せずにベースメソッドを呼び出すことができるため、拡張すると、のような多くのコードが回避されます。この場合、継承を通じて利用できる共通の基本クラスが少なくともいくつかない限り、アダプターパターンに傾倒します。

最後の深刻なオプションは、コードをよりオブジェクト指向にリファクタリングすることです。プロジェクトに貢献し、プロジェクトの作成者の祝福を受ける場合にのみ、このアプローチをお勧めします。その理由は、おそらく完全には理解していない作業コードがあり、それをいじり回すと、コードが壊れる危険性があるためです。動作するコードはそのままにして、外部から適応させます。

于 2011-06-07T05:17:22.947 に答える
2

Argotic を書いてから本当に長い時間が経ちました ( .NET にSystem.ServiceModel.Syndicationが存在する前に書かれました) が、作成者の概念がRSS 2.0Atomの両方に存在するため、なぜジェネリックがフィード アイテムに Authors コレクションが含まれていませんでした。これは、 OPML文書のアウトライン要素に作成者という概念がないためである可能性があります。明らかに私のデザインが悪い。

肝心なのは、私はまだ若くて学習していて、Argotic は 3 年前に書かれたときは役に立ちました。大幅なリファクタリングが必要です。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 に答える