Количество классов в пространстве имен - Запах кода?

11

У меня есть библиотека C #, которая используется несколькими исполняемыми файлами. В библиотеке всего пара пространств имен, и я только что заметил, что в одном из пространств имен довольно много классов. Я всегда избегал иметь слишком много классов в одном пространстве имен из-за категоризации, и потому что подсознательно я думаю, что это выглядит «красивее», чтобы иметь более глубокую иерархию пространств имен.

Мой вопрос: кто-нибудь еще считает это «запахом кода», когда в пространстве имен много классов - даже если эти классы связаны друг с другом? Будете ли вы приложить много усилий, чтобы найти нюансы в классах, которые позволяют подкатегории?

Тим Класон
источник
8
Если классы принадлежат указанному пространству имен, нет. Дизайн субъективен по самой своей природе, поэтому его трудно сказать по-настоящему, и это скорее вопрос предпочтений, как вы уже определили.
Крис
Whatecer StyleCop говорит, что это закон. Бьюсь об заклад, это не понравится.
Работа
2
Определите «довольно много». 10? 100? 1000?
Эрик Кинг,

Ответы:

7

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

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


источник
6

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

Самый простой способ - поместить все первичные классы в единое пространство имен, поместив все расширенные классы сценариев в подпространства имен; .NET Framework делает это постоянно, см. System.CollectionsИ System.Collections.Specializedдля хороших примеров этой практики.

С одним или двумя пространствами имен первого уровня ваш код станет намного легче перемещаться, а ваши продвинутые или специализированные классы будут скрыты, пока программист не будет готов обнаружить это.

Эд Джеймс
источник
3

Пока они принадлежат друг другу и связаны друг с другом, нет проблем с наличием слишком большого количества классов в пространстве имен.

Относится ли класс к своему отдельному пространству имен или нет - это вопрос личных предпочтений.

Что выглядит более естественно?

Parsers.XML.XmlParser.cs
Parsers.XmlParser.cs

Это полностью зависит от того, как вам нравится видеть и вызывать ваш код.

Лично я предпочитаю отдельные пространства имен только тогда, когда знаю, что к нему будет принадлежать более одного класса.


источник
0

Это хорошо. Основная причина наличия пространств имен состоит в том, чтобы избежать коллизий имен, и только после этого мы должны думать о логической области, которая больше зависит от личного выбора, чем от правила. Конечно, некоторые разумные правила приветствуются. Никто не хочет прокручивать 3k ~ 4k классов в одном пространстве имен.

Хорошим примером является пространство имен std в стандартной библиотеке C ++, которое позволяет вам отделить ваши собственные алгоритмы от стандартных.

Андрей Таптунов
источник
-1. Столкновение имен важно, но концептуальная группировка классов также важна.
umlcat