Должны ли интерфейсы жить в одном и том же пространстве имен как конкретные классы, которые их реализуют?

Существует ли стандарт для того, как решения/проекты организованы в отношении интерфейсов и классов, которые их реализуют? Я работаю над MVP, DDD-приложением и хотел бы услышать отзывы о том, как другие компонуют свои проекты и почему они это делают. Спасибо!!

Ответ 1

Они должны жить в пространстве имен, которое для них логично; это означает, что нет твердого правила для того, должны ли они находиться в одном и том же пространстве имен. Вы обнаружите, что относительно абстрактные пространства имен часто не живут рядом с их реализацией, тогда как интерфейсы, которые более 1:1 со своими разработчиками, с большей вероятностью остаются рядом друг с другом.

Более важным является сохранение интерфейсов, потребляемых для повторного использования - обычно это означает больше внимания к тому, что входит в сборку наряду с интерфейсами, а не пространствами имен.

Ответ 2

Проверьте шаблон Мартина Фаулера на Разделить интерфейсы, это может помочь вам решить, где их разместить.

Ответ 3

Разумеется, нет никаких оснований для этого.

Фактически, если пользователям интерфейса не нужно знать конкретный класс, и если существует несколько реализаций, и если группа, определяющая интерфейс, отличается от группы, реализующей определенную версию (все из которых являются допустимыми случаями), то, вероятно, разумно отделить пространства имён реализации и интерфейса.

Я не слишком уверен в С#, но в Java членство в пакетах является важным организационным шаблоном для обеспечения видимости метода. Если вы хотите использовать пакетные приложения, вам в основном нужно группировать классы реализации вместе в одном пакете (чтобы вы, вероятно, не могли сопоставить их с интерфейсами).