Прежде всего, давайте соглашаемся с тем, что пространство имен должно соответствовать структуре папок и что каждый артефакт языка должен находиться в собственном файле.
(см. Если папки в решении совпадают с пространством имен?).
Следующий вопрос заключается в том, как папки на самом деле должны быть организованы на диске.
Предположим, что у меня есть ClassC в пространстве имен A.B.C и ClassD в пространстве имен A.B.C.D.
Также предположим, что каждое пространство имен встроено в собственную сборку (проект) и что пространства имен имеют зависимости справа налево в соответствии с принятой наилучшей практикой (A.B.C.D может зависеть от A.B.C, которая может зависеть от A.B, которая может зависеть от A). Я понимаю, что каждое пространство имен не должно быть в отдельной сборке, но в общем случае у нас будут отдельные пространства имен в отдельных сборках, и мой пример иллюстрирует это.
Я вижу (по крайней мере) два способа создания дерева папок - которые я вызываю "вложенные папки" и "плоские папки":
1 - Вложенные папки:
а
--A.csproj
-В
---- A.B.csproj
---- C
------ A.B.C.csproj
------ classC.cs
------ D
-------- A.B.C.D.csproj
-------- classD.cs
ИЛИ
2 - Плоские папки:
а
--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
Вы увидите, что Ive сделал несколько предположений:
- Каждый файл проекта имеет полное имя (FQN) на основе пространства имен.
- Каждый файл класса использует не-FQN
Вложенные папки кажутся более естественными (все мы похожи на иерархии), но может быть немного сложнее ориентироваться в больших решениях:
Когда вы смотрите на свое решение в VS, он показывает плоский список проектов, а не вложенное представление. Это больше похоже на "плоские папки", поэтому может быть полезно организовать папки на диске в соответствии с представлением в VS.
Если вы посмотрите в каждой папке на диске, вы увидите артефакты папки для этого проекта плюс подпапку для пространства имен: в качестве примера возьмем C:
C
--bin
-D,
--obj
--Properties
--A.B.C.csproj
--classC.cs
В зависимости от реального имени Ds может быть не очевидно, что D является папкой пространства имен, а не организационной папкой в пространстве имен C.
Я знаю, что у weve были папки и пространства имен с первого дня в .NET(8 или 9 лет назад) и Java до этого, но, лично говоря, мы, похоже, не пришли к консенсусу в отношении лучшей организации проекта для крупных решений, Мне действительно интересно узнать, что вы все думаете.
Спасибо
Майкл