Я просто читаю Гибкие принципы, шаблоны и практики в C# Р. Мартина и М. Мартина, и они предлагают в своей книге сохранить все ваши интерфейсы в отдельном проекте, например. Интерфейсы.Организация интерфейсов
В качестве примера, если у меня есть Gui проект, который содержит все мои пользовательские классы Gui, я буду держать их интерфейсы в Интерфейсы проекта. В частности, у меня был класс CustomButton в Gui, я бы сохранил интерфейс ICustomButton в Интерфейсы.
Преимущество заключается в том, что любой класс, который нуждается в ICustomButton не нужна ссылка на Гуй сам, но только на более легкий вес Интерфейсы проекта.
Кроме того, следует класс в изменении проекта Гуй и, таким образом, потому что это будет восстановлена, только проекты, непосредственно обращаясь к CustomButton необходимо будет перекомпиляция, в то время как те, относящиеся к ICustomButton могут остаться нетронутыми.
Я понимаю, что понятие, но вижу проблемы:
Допустим, у меня есть этот интерфейс:
public interface ICustomButton
{
void Animate(AnimatorStrategy strategy);
}
Как вы можете видеть, это относится к AnimatorStrategy, который является конкретным классом и, следовательно, сидеть в другом проекте, назовет его Анимация. Теперь проект интерфейса должен называться Анимация. С другой стороны, если Анимация использует интерфейс, определенный в Интерфейсах, ему необходимо обратиться к нему.
Циклическая зависимость - «Здесь мы приходим».
Единственное решение этой проблемы, которое я вижу, заключается в том, что все методы, определенные в интерфейсах, принимают входные данные, которые сами являются интерфейсами. Попытка реализовать это, скорее всего, будет иметь эффект домино, хотя и быстро требует, чтобы интерфейс был реализован даже для самых базовых классов.
Я не знаю, хотел бы я иметь дело с этим накладным спросом в разработке.
Любые предложения?
Спасибо за ваш ответ. Я пытался разглядеть вокруг DIP (принцип инверсии зависимостей). Хотя теоретически это выглядит хорошо (классы нижнего уровня в зависимости от классов более высокого уровня, а не наоборот), на практике его трудно реализовать и на практике. Намного проще просто поддерживать интерфейсы вместе с классами, которые их реализуют. Думаю, в этом случае я согласен с вашим предложением только «усложнять» дизайн таким образом, если это станет необходимым. –