В настоящее время я занят рефакторингом больших частей в моем приложении.Основная цель - удалить как можно больше зависимостей между различными модулями.Теперь я натыкаюсь на следующую проблему:
В моем приложении у меня есть модуль GUI, который определил интерфейс IDataProvider.Интерфейс должен быть реализован приложением и используется для «предоставления данных» модулю GUI.Например, сетке данных можно присвоить этот IDataProvider и использовать его для циклического перебора всех экземпляров, которые должны быть показаны в сетке данных, и получения их данных.
Теперь есть еще один модуль (на самом деле довольно много модулей)что всем нужно что-то подобное (например, модуль отчетности, модуль интеграции с базой данных, модуль математического решения, ...).В этот момент я вижу две вещи, которые я могу сделать:
- Я мог бы переместить IDataProvider со слоя GUI на намного более низкоуровневый уровень и повторно использовать этот же интерфейс во всех других модулях.
- Преимущество этого заключается в том, что приложению становится проще использовать все модули (ему нужно только реализовать поставщика данных).
- Недостатком является то, что я ввожу зависимость междумодули и центральный IDataProvider.Если кто-то начинает расширять IDataProvider дополнительными методами, необходимыми для одного модуля, он также начинает загрязнять другие модули.
- Другой альтернативой является предоставление каждому модулю своего собственного поставщика данных, и принудительноприложение, чтобы реализовать их все, если оно хочет использовать все модули.
- Преимущество состоит в том, что модули не зависят от общей части
- Недостатком является то, что я получаю IGridDataProvider, IReportDataProvider, IDatabaseDataProvider, ISolverDataProvider.
Какой наилучший подход использовать?Приемлемо ли сделать все модули зависимыми от одного и того же общего интерфейса, если им требуется [почти или полностью] один и тот же интерфейс?
Если я использую один и тот же интерфейс IDataProvider, может ли это привести к неприятным проблемам в будущем (о котором я не знаю в данный момент)?