Как улучшить полиморфизм с помощью шаблонов проектирования - PullRequest
2 голосов
/ 04 ноября 2010

Я пытаюсь разработать систему, которая позволит обрабатывать файлы нескольких типов.Идея состоит в том, что существует единственное приложение для обработки фактических манипуляций с файлами на диске, в то время как разработчики могут создавать собственные библиотеки, которые смогут делать с файлами после загрузки все, что им захочется.

У меня сейчасструктура, которая выглядит следующим образом:

Исходное изображение current class diagram

Где приложение публикует интерфейс IClient, который пользовательские написанные библиотеки могут свободно реализовывать.С Client1 по Client3 каждая будет иметь свою реализацию и по-разному реагировать на каждый тип файла.

Метод Populate в File переопределяется в производных классах для вызова правильногоМетод PopulateFrom в интерфейсе IClient, передающий вызывающий файл.

Поэтому метод PopulateFrom в классе, реализующем IClient, передается файл определенного типа, так что он должен получить к нему доступ.базовые данные (CSVDataReader или XDocument в этом примере) для анализа в любые доменные объекты, которые он хочет.

Используя этот дизайн для каждого нового типа файла, который я добавляю в систему, я должен будудобавьте новый метод к IClient, который не идеален.Чтобы сохранить совместимость с клиентскими классами, у которых нет метода, принимающего новый тип файла, мне нужно будет создать новый интерфейс, который конкретно поддерживает этот тип, и заставить новый клиент реализовать следующее:

Исходное изображение class diagram with new file type

Все это работает, но мне было интересно, есть ли лучший способ поддержки нескольких типов файлов без необходимости каждый раз добавлять новый интерфейс, возможно, используя шаблон проектирования

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Вот вариант: ваш метод PopulateFrom не должен принимать файл определенного типа, вместо этого он должен принимать FileStream или MemoryStream, ведь файл - это просто поток байтов, это организацияте байты, которые делают каждый тип файла уникальным.

Кроме того, вы можете захотеть реализовать метод, подобный следующему:

bool CanProcess(FileStream myFile)

, чтобы вы могли запрашивать каждого поставщика общим способом, и этоскажет вам, может ли он обработать этот конкретный файл.Делая это таким образом, вы сможете реализовать больше типов файлов и больше провайдеров без необходимости расширять интерфейс или связываться с существующими провайдерами.

Ознакомьтесь с шаблоном Provider , чтобы узнать, поможет ли это..

0 голосов
/ 04 ноября 2010

Ваш дизайн нарушает принцип дизайна, известный как инверсия зависимостей, потому что клиенты зависят от конкретных классов, а не абстрактных.

Вам следует пересмотреть реализацию ваших клиентов так, как они работают с абстрактным типом (Application :: File). Если нет абсолютно никакого способа сделать это, вам следует изменить иерархию классов.

Подумай об этом. Если абстракция используется редко, то, вероятно, она бесполезна. Роберт Мартин называет это принципом устойчивых абстракций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...