Объявление типов в глобальном пространстве имен C#

Сейчас читал статью про делегаты (https://docs.microsoft.com/ru-ru/dotnet/csharp/delegate-class) и в статье наткнулся на примечание.

Не рекомендуется объявлять типы делегатов (или другие типы) непосредственно в глобальном пространстве имен.

Почему?


Ответы (1 шт):

Автор решения: aepot

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

  • Если у вас 3 класса в глобалке, 50 дочерних неймпейсов - разработчик запутается.
  • Если у вас 300 классов и нет дочерних неймпейсов - разработчик запутается.
  • Если у вас 1 дочерний неймспейс и в нем 300 классов - разработчик запутается.

Данная рекомендация скорее ориентирована на подростающих разработчиков, но не на новичков и не профессионалов. Новичкам еще рано думать, где делегаты объявлять, а профессионалам это уже все очевидно. Ее конечно можно запомнить, но позади нее еще огромная куча условий, которые надо выполнить, чтобы получилось что-то вменяемое.

Так что не берите в голову, это маленькая переменная из огромной формулы проектирования приложений. Я бы даже сказал, лучше и эффективнее стоит изучать шаблоны проектирования типа MVC, MVP, MVVM, или даже модный MVU. Они содержат больше основ для создания правильной структуры проекта. На основе структуры и принимается решение - куда класть делегаты, а куда другие типы. И про SOLID забывать тоже не стоит.

Кстати, на деле мне ни разу не приходилось создавать свои делегаты, мне Action, Func и Predicate полностью закрывают эту потребность.

Кстати, хороший пример организации неймпейсов - сам .NET, вы уже некоторые знаете. Поизучайте, сколько их там всего и что внутри. Чаще всего 1 неймспейс = 1 библиотека, отвечающая за что-то одно. И делегаты с классами, предназначенными для использования вне дотнета лежат именно в глобальном для библиотеки неймпейсе, и это удобно.

→ Ссылка