Должны ли папки в решении соответствовать пространству имен?

StackOverflow https://stackoverflow.com/questions/4664

  •  08-06-2019
  •  | 
  •  

Вопрос

Должны ли папки в решении соответствовать пространству имен?

В одном из моих командных проектов у нас есть библиотека классов, в которой есть множество подпапок.

Имя проекта и пространство имен: MyCompany.Project.Section.

В этом проекте есть несколько папок, соответствующих разделу пространства имен:

  • Папка Vehicles есть занятия в MyCompany.Project.Section.Vehicles пространство имен
  • Папка Clothing есть занятия вMyCompany.Project.Section.Clothing пространство имен
  • и т. д.

Внутри этого же проекта есть еще одна мошенническая папка.

  • Папка BusinessObjects есть занятия в MyCompany.Project.Section пространство имен

В некоторых случаях папки создаются для «организационного удобства».

Мой вопрос:Какой стандарт?В библиотеках классов папки обычно соответствуют структуре пространства имен или это смешанная ситуация?

Это было полезно?

Решение

Также обратите внимание: если вы используете встроенные шаблоны для добавления классов в папку, по умолчанию они будут помещены в пространство имен, отражающее иерархию папок.

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

Правила, которым мы следуем:

  • Имя проекта/сборки такое же, как корневое пространство имен, за исключением окончания .dll.
  • Единственным исключением из приведенного выше правила является проект с окончанием .Core, при этом расширение .Core удаляется.
  • Папки равны пространствам имен
  • Один тип для каждого файла (класс, структура, перечисление, делегат и т. д.) упрощает поиск нужного файла.

Другие советы

Нет.

Я пробовал оба метода на небольших и крупных проектах, как с одним (я), так и с командой разработчиков.

Я обнаружил, что самый простой и продуктивный путь — создать одно пространство имен для каждого проекта, и все классы будут находиться в этом пространстве имен.После этого вы можете поместить файлы классов в любые папки проекта, которые захотите.Нет необходимости постоянно добавлять операторы using в начало файлов, поскольку существует только одно пространство имен.

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

Возьмем, к примеру, это предупреждение FxCop:

СА1020:Избегайте пространств имен с небольшим количеством типов.
причина:Пространство имен, отличное от глобального пространства имен, содержит менее пяти типов. https://msdn.microsoft.com/en-gb/library/ms182130.aspx

Это предупреждение рекомендует сбрасывать новые файлы в общую папку Project.General или даже в корень проекта до тех пор, пока у вас не будет четырех похожих классов, оправдывающих создание новой папки.Произойдет ли это когда-нибудь?

Поиск файлов

Принятый ответ гласит: «Классы будет легче найти, и само по себе это должно быть достаточно вескими причинами».

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

В любом случае, хотя вы не можете определить, в какой папке находится файл класса, из пространства имен, вы можете найти его с помощью команды «Перейти к определению» или окна обозревателя поисковых решений в Visual Studio.И это, на мой взгляд, не такая уж большая проблема.Я не трачу даже 0,1% своего времени на разработку проблемы поиска файлов, чтобы оправдать ее оптимизацию.

Конфликты имен

Конечно, создание нескольких пространств имен позволяет проекту иметь два класса с одинаковым именем.Но действительно ли это хорошо?Может быть, проще просто запретить это?Разрешение двух классов с одинаковым именем создает более сложную ситуацию, когда в 90% случаев все работает определенным образом, а затем внезапно обнаруживается, что у вас особый случай.Предположим, у вас есть два класса Rectangle, определенные в разных пространствах имен:

  • класс Project1.Image.Rectangle
  • класс Project1.Window.Rectangle

Можно столкнуться с проблемой, что исходный файл должен включать оба пространства имен.Теперь вам нужно записать полное пространство имен повсюду в этом файле:

var rectangle = new Project1.Window.Rectangle();

Или возиться с каким-нибудь неприятным оператором using:

using Rectangle = Project1.Window.Rectangle;

Имея в проекте одно пространство имен, вы вынуждены придумывать разные, и я бы сказал, более описательные имена, например:

  • класс Project1.ImageRectangle
  • класс Project1.WindowRectangle

И использование везде одинаково, вам не нужно иметь дело с особым случаем, когда файл использует оба типа.

использование операторов

using Project1.General;  
using Project1.Image;  
using Project1.Window;  
using Project1.Window.Controls;  
using Project1.Shapes;  
using Project1.Input;  
using Project1.Data;  

против

using Project1;

Легкость отсутствия необходимости постоянно добавлять пространства имен при написании кода.На самом деле это не столько время, сколько перерыв в потоке выполнения и простое заполнение файлов множеством операторов использования - для чего?Стоит ли оно того?

Изменение структуры папок проекта

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

Имея в проекте одно пространство имен, вы можете изменить структуру папок проекта по своему усмотрению без изменения самих исходных файлов.

Visual Studio автоматически сопоставляет пространство имен нового файла с папкой проекта, в которой он создан.

К сожалению, я считаю, что исправление пространства имен требует меньше усилий, чем работа с ними.Также у меня появилась привычка копировать существующий файл вместо использования «Добавить->Новый».

Intellisense и обозреватель объектов

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

Хотя если бы я писал большую библиотеку общедоступных классов, то я бы бы вероятно, используйте в проекте несколько пространств имен, чтобы сборка выглядела аккуратно в инструментах и ​​документации.

Я думаю, что стандартом .NET является попытка сделать это, когда это возможно, но не создавать излишне глубокие структуры только для того, чтобы придерживаться этого как жесткого правила.Ни один из моих проектов не следует правилу структуры пространства имен == в 100% случаев, иногда проще/лучше отказаться от таких правил.

В Java у вас нет выбора.Я бы назвал это классическим случаем того, что работает в теории, и того, что работает на практике.

@lassevk:Я согласен с этими правилами и могу добавить еще одно.

Если у меня есть вложенные классы, я все равно разделяю их по одному на файл.Так:

// ----- Foo.cs
partial class Foo
{
    // Foo implementation here
}

и

// ----- Foo.Bar.cs
partial class Foo
{
    class Bar
    {
        // Foo.Bar implementation here
    }
}

Я бы сказал да.

Во-первых, будет легче найти реальные файлы кода, проследив за пространствами имен (скажем, когда кто-то отправит вам по электронной почте голый стек вызовов исключений).Если вы позволите своим папкам не синхронизироваться с пространствами имен, поиск файлов в больших базах кода станет утомительным.

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

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

Да, должны, в противном случае это приведет только к путанице.

Какой стандарт?

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

В библиотеках классов папки обычно соответствуют структуре пространства имен или это смешанная сумка?

Да, в большинстве библиотек классов папки соответствуют пространству имен для упрощения организации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top