Должен ли я поместить свое определение интерфейса в то же пространство имен, что и его реализация - PullRequest
13 голосов
/ 21 марта 2012

Если я определяю интерфейс ITestInterface, а затем сразу же создаю класс, который реализует этот интерфейс для использования в приложении, можно ли сохранить класс и интерфейс в одном пространстве имен или они должны быть разделены. то есть Test.Interfaces и Test.Interfaces.Implementation.

И мой интерфейс, и его реализация будут в своей собственной сборке, поэтому я не собираюсь создавать другой, просто содержащий сам интерфейс.

Это особенно относится к c #, но я думаю, что он может охватывать любой язык.

Ответы [ 6 ]

19 голосов
/ 21 марта 2012

Вероятно, лучше использовать установленные соглашения предопределенных классов .NET.Например, просматривая пространство имен System.Collections.Generic, мы видим, что там есть и IDictionary, и Dictionary.Поэтому, вероятно, лучше всего поместить их в одно пространство имен.

Кроме того, поскольку интерфейс и реализация, скорее всего, служат одной и той же цели, лучше группировать их в одном пространстве имен.

3 голосов
/ 02 июля 2014

Как насчет отдельных сборок в одном и том же пространстве имен? Мне это нравится.

2 голосов
/ 21 марта 2012

Это особенно относится к c #, но я думаю, что он может охватывать любой язык.

В Java типично иметь два в одном пакете.Единственное исключение, о котором я могу думать, может быть интерфейсом DAO в персистентности пакета и различными реализациями в подпакетах (например, jdbc, hibernate, jdo и т. Д.)

Вы можете думать о публичном интерфейсе как оAPI, предоставляемый из пакета.Я вижу, где классы реализации могут быть закрытыми для пакета, что не позволяет пользователям получить доступ к реализации через что-либо кроме интерфейса.Для предоставления доступа должны быть предоставлены общедоступные фабричные методы.

2 голосов
/ 21 марта 2012

Это очень абстрактный вопрос. В чем причина интерфейса? Это публичный API / фреймворк или простое приложение? Собираетесь ли вы иметь несколько реализаций одного и того же интерфейса?

Если интерфейсы находятся в своих собственных сборках, рекомендуется, чтобы базовые пространства имен соответствовали именам сборок. Но, похоже, вы имеете в виду, что класс и интерфейс находятся в одной сборке.

2 голосов
/ 21 марта 2012

System.Collections.ArrayList реализует System.Collections.IList. Если Microsoft делает это, почему бы вам не?

0 голосов
/ 21 марта 2012

Каково ваше намерение?

Если вы хотите «скрыть» реализацию от остальной части вашего кода и / или выбрать, какую из нескольких доступных реализаций «внедрить» во время выполнения, тогда вашКласс в любом случае не должен быть публичным, поэтому не имеет значения, в каком именно пространстве имен он находится.

В противном случае нет проблем с интерфейсом и классом, находящимися в одном и том же пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...