Я просто читаю Agile Principles, Patterns and Practices в С# Р. Мартина и М. Мартина, и они предлагают в своей книге сохранить все ваши интерфейсы в отдельном проекте, например. Интерфейсы.
В качестве примера, если у меня есть проект Gui, который содержит все мои пользовательские классы Gui, я буду хранить их интерфейсы в проекте Interfaces. В частности, у меня был класс CustomButton в Gui, я бы сохранил интерфейс ICustomButton в интерфейсах.
Преимущество состоит в том, что любому классу, который нуждается в ICustomButton, не требуется ссылка на самого Gui, но только на проект с меньшим весом интерфейсов.
Кроме того, если класс в проекте Gui изменится и, следовательно, заставит его перестроить, только проекты, непосредственно ссылающиеся на CustomButton, нуждаются в перекомпиляции, тогда как те, которые ссылаются на ICustomButton, могут оставаться нетронутыми.
Я понимаю эту концепцию, но вижу проблему:
Предположим, что у меня есть этот интерфейс:
public interface ICustomButton
{
void Animate(AnimatorStrategy strategy);
}
Как вы можете видеть, это относится к AnimatorStrategy, который является конкретным классом и, следовательно, будет сидеть в другом проекте, позволяет называть его анимацией. Теперь проект интерфейса должен ссылаться на анимацию. С другой стороны, если Animation использует интерфейс, определенный в интерфейсах, он должен ссылаться на него.
Циклическая зависимость - "Здесь мы приходим".
Единственное решение этой проблемы, которое я вижу, заключается в том, что все методы, определенные в интерфейсах, принимают входные данные, которые сами являются интерфейсами. Попытка реализовать это, скорее всего, будет иметь эффект домино, хотя и быстро требует, чтобы интерфейс был реализован даже для самых основных классов.
Я не знаю, хотел бы я справиться с этими накладными расходами при разработке.
Любые предложения?