Прежде всего, давайте согласимся с тем, что пространство имен должно соответствовать структуре папок и что каждый языковой артефакт должен находиться в отдельном файле.
(см. Должны ли папки в решении соответствовать пространству имен? а>).
Следующий вопрос заключается в том, как на самом деле папки должны быть организованы на диске.
Предположим, у меня есть ClassC в пространстве имен ABC и ClassD в пространстве имен ABCD.
Давайте также предположим, что каждое пространство имен встроено в свою собственную сборку (проект) и что пространства имен имеют зависимости справа налево в соответствии с принятой передовой практикой (ABCD может зависеть от ABC, который может зависеть от AB, который может зависеть от A). Я понимаю, что каждое пространство имен не обязательно должно быть в отдельной сборке, но в общем случае у нас будет несколько пространств имен в отдельных сборках, и мой пример иллюстрирует это.
Я вижу (по крайней мере) два способа создания дерева папок, которые я назову «вложенными папками» и «плоскими папками»:
1 - Вложенные папки:
A
--A.csproj
--B
---- ABcsproj
---- C
------ ABCcsproj
---- --classC.cs
------ D
-------- ABCDcsproj
-------- classD.cs
OR
2 - Плоские папки:
A
--A.csproj
AB
--ABcsproj
ABC
--ABCcsproj
--classC.cs
ABCD
--ABCDcsproj
--classD.cs
Вы увидите, что я уже сделал несколько предположений:
- Каждый файл проекта имеет полное имя (FQN) на основе пространства имен.
- Каждый файл класса использует не-FQN
Вложенные папки кажутся более естественными (все мы любим иерархии), но в больших решениях может быть немного сложнее ориентироваться:
Когда вы смотрите на свое решение в VS, оно показывает плоский список проектов, а не вложенное представление. Это больше похоже на «плоские папки», поэтому может быть полезно организовать папки на диске в соответствии с представлением в VS.
Если вы посмотрите в каждую папку на диске, вы увидите артефакты папки для этого проекта плюс подпапку для пространства имен: взяв C в качестве примера:
C
--bin
--D
--obj
--Свойства
--A.B.C.csproj
--classC.cs
В зависимости от настоящего имени D может быть неочевидным, что D - это папка пространства имен, а не папка организации в пространстве имен C.
Я знаю, что у нас были папки и пространства имен с первого дня в .NET (8 или 9 лет назад), а в Java и до этого, но, лично говоря, мы, похоже, не пришли к консенсусу в отношении наилучшей практики организации проектов для крупных компаний. решения. Мне было бы действительно интересно узнать, что вы все думаете.
Спасибо, Майкл