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