Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Правильное разделение интерфейсов

Есть legacy проект и массивные классы моделей, где они представлены как есть. В них много свойств которые можно разделить на множество разных интерфейсов (сегрегация интерфейсов).
class FatModel : IFoo, IBar, IZaa...
Требуется передать экземпляр этого класса в слой приложения где нужен IFoo и немного IBar
И тут напрашиваются варианты
Создать обобщенный интерфейс.
interface IFooBar : IFoo, IBar class FatModel : IFooBar, IZaa...
Но получается ерунда, потому что эти обобщенные интерфейсы плодятся как кролики. Создав обобщенный интерфейс на 2 интерфейса обязательно появится тот, кому нужны 3 или другие 2...и в разных комбинациях. Передать объект как есть и в нужных местах делать каст к нужному интерфейсу.
Но в этом случае все проверки типов уходят в рантайм, что плохо. Адаптеры, где будут представлены нужные свойства?
Никогда не делал адаптеров для моделей и полезности такого решения не знаю.
Какие есть еще варианты?


Ответ

Начнём с того, что интерфейс (и классы, его реализующие) должен отображать предметную область.
Требуется передать экземпляр этого класса в слой приложения где нужен IFoo и немного IBar
Если комбинация IFoo и IBar имеет прикладное значение - её было бы нелишним ввести. Тогда всё очевидно просто, правда, переписывать legacy вряд ли захочется ради этого.
Если комбинация интерфейсов прикладного значения не имеет, то и метод, который требует и того и другого одновременно - тоже не имеет прикладного значения. Простой вариант решения этой проблемы - выделение двух методов, один из которых требует IFoo, второй - IBar
UPD: не подумал сразу, но можно же сделать генерик метод, который указывает требования:
static void Method(T obj) where T : IFoo, IBar

Комментариев нет:

Отправить комментарий