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