Как обращаться с похожими объектами с разными свойствами?

Я создаю клиент RSS и использую инфраструктуру Argotic. Он предоставляет разные классы для разных типов каналов, таких как Atom, RSS и OPML. Эти классы не наследуются от какого-либо другого класса и не реализуют общий интерфейс для доступа к своим свойствам.

Существует тип GenericSyndicationFeed, который реализует перегруженный метод, в котором вы можете передать AtomFeed или RssFeed. Если я хочу использовать «более» строго типизированные классы, мне по существу понадобятся два пути кода (один для Atom и один для RSS) везде в моей программе. Очевидно, я не собираюсь этого делать.

У автора нет документации, кроме документации API, поэтому я немного не понимаю, почему это было реализовано таким образом, вместо того, чтобы в полной мере использовать полные классы. Меня беспокоит то, что я не могу получить авторов элемента при использовании типа GenericSyndicationItem.

Что я могу здесь сделать? Сделать класс-оболочку? Или наследовать от классов RssFeed и AtomFeed и реализовать интерфейс для предоставления свойств, которые, по моему мнению, должны быть похожими на оба?


person Pete    schedule 07.06.2011    source источник


Ответы (2)


Если вы используете стороннюю библиотеку, которая не соответствует вашим архитектурным требованиям: адаптируйте! Но как?

Вы уже определили некоторые из ваших вариантов, и есть еще:

  1. Оберните существующие классы в новые классы, используя Шаблон адаптера
  2. Расширяйте и объединяйте разрозненные классы, реализуя общий интерфейс
  3. Рефакторинг исходного кода для естественного использования полиморфизма

Если существующие классы действительно не имеют общего базового класса, то первые два варианта требуют примерно одинакового объема работы. Преимущество упаковки состоит в том, что связь немного слабее на тот случай, если вы когда-нибудь решите переключиться на другой фреймворк. Расширение позволяет избежать большого количества кода, такого как adaptee.AdapteeMethod, поскольку вы можете вызывать базовые методы без указания экземпляра. В этом случае я бы склонялся к шаблону адаптера, если только не существует хотя бы некоторого общего базового класса, который можно использовать посредством наследования.

Последним серьезным вариантом является рефакторинг кода, чтобы сделать его более объектно-ориентированным, и я рекомендую этот подход только в том случае, если вы собираетесь внести свой вклад в проект и получить благословение автора проекта. Причина в том, что у вас есть рабочий код, который вы, вероятно, не полностью понимаете, и возиться с ним просто рискуете его сломать. Оставьте рабочий код в покое и адаптируйте его извне.

person Rick Sladkey    schedule 07.06.2011

Прошло очень много времени с тех пор, как я написал Argotic (он был написан до System.ServiceModel.Syndication существует в .NET), но, поскольку понятие автора существует как в RSS 2.0 и Atom , я действительно не помню, почему общий элемент фида не включал коллекцию авторов. Это могло быть связано с тем, что элементы структуры в документе 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"));
person Oppositional    schedule 07.06.2011
comment
Спасибо за ответ. Argotic в порядке, я думаю, что смогу заставить его работать, и это все равно будет путь наименьшего сопротивления. Я молод и тоже учусь (использую Argotic для группового проекта), так что посмотрим. System.ServiceModel.Syndication не годится для чтения каналов, так как он слишком легко выходит из строя прямо из коробки. Это, вероятно, лучше для написания/создания хорошо сформированных каналов. - person Pete; 07.06.2011