Правильное пространство имен для многих конкретных реализаций абстрактного класса - PullRequest
4 голосов
/ 21 мая 2011

Я нахожусь в процессе разработки библиотеки .NET, и мне нужны отзывы об организации классов и пространствах имен.

Предположим, у меня есть абстрактный класс Message, который находится в корневом пространстве имен Foo. Message имеет много конкретных реализаций для разных типов сообщений. Учитывая, что будет много конкретных реализаций (допустим, 20 или даже больше), ожидается ли, что эти конкретные типы живут в отдельном пространстве имен, что-то вроде Foo.Messages?

Меня беспокоит загромождение пространства имен слишком большим количеством конкретных Message классов, которые пользователям моей библиотеки редко придется использовать напрямую. Чего вы ожидаете при использовании библиотеки?

редактирование:

Кроме того, если я сгруппирую конкретные классы в Foo.Messages, должен ли там также жить абстрактный класс или он должен остаться в Foo?

Ответы [ 3 ]

5 голосов
/ 21 мая 2011

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

Группировка всех конкретных классов реализации в пространстве имен Foo.Messages звучит нормально. Вы также не хотите заходить слишком далеко - создание множества пространств имен для незначительных вещей является огромным раздражением для пользователя.

0 голосов
/ 21 мая 2011

Вид загруженного вопроса, но если проблема состоит в том, что слишком много классов препятствуют обнаружению, является ли частью решения, возможно, создание некоторых из этих классов internal, а не public?Если пользователи никогда не будут создавать эти экземпляры напрямую, это может быть частью решения вашей проблемы с беспорядком.

Это действительно во многом зависит от природы API, который вы разрабатываете, и в некоторой степенина вкус.Часто есть один основной класс или набор классов, к которым ваши пользователи будут обращаться чаще всего, например, NLog Logger, AutoMapper Mapper, NoRM Mongo или фабрики классов в целом.Они должны быть передними, центральными и обнаруживаемыми, и вы можете убедительно заявить, что лучше иметь это в своем корневом пространстве имен.

Для других классов (те, которые больше о реализации и меньше об API)Очевидно, что вы хотите быть организованным, но вы можете играть с довольно свободной рукой и организовывать так, как вам удобно, при условии, что части API, которые должны найти пользователи, являются наиболее заметными.Foo.Messages кажется вполне разумным способом начать.С другой стороны, если 90% ваших классов являются подклассами Message, но существует важное различие между сообщениями Сервера и сообщений Клиента или сообщениями Purple и сообщениями Plaid, возможно, Foo.Server или Foo.Plaid являются правильными видами пространств имендля вас.

0 голосов
/ 21 мая 2011

Если вы создаете библиотеку и используете абстрактный класс Message со многими конкретными реализациями, часто может быть хорошей идеей скрыть все конкретные реализации от пользователя библиотеки и предоставить доступ к классу Factory, который будет возвращать абстрактное сообщение (возвращаемый тип фактический возвращаемый объект будет конкретным, конечно), если это нормально для клиентов библиотеки, которые часто заключают в себе, например, 20 или более классов и предоставляют доступ к требуемым функциям в удобной и удобной форме.

...