Должен ли я прекратить борьбу с Соглашением об именовании пространства имен по умолчанию Visual Studio?
Я работаю над проектом MVVM, поэтому у меня есть папки в моем проекте, такие как модели, ViewModels, Windows и т. д. Всякий раз, когда я создаю новый класс, Visual Studio автоматически добавляет имя папки в обозначение пространства имен, а не просто сохраняет пространство имен на уровне проекта. Таким образом, добавление нового класса в папку ViewModels приведет к пространству имен, просто MyProject.
когда я впервые столкнулся с этим, это меня раздражает. Мои имена классов довольно ясны, иногда даже содержащий имя папки в них (например,ContactViewModel). Я быстро обнаружил, что вручную удаляю имя папки в пространствах имен. Я даже пытался в какой-то момент создать пользовательский шаблон класса (см. этот вопрос), но я не мог заставить это работать, поэтому продолжал делать это вручную.
Я начал задаваться вопросом, существует ли эта конвенция по уважительной причине, которую я просто не вижу. Я мог видеть, что это полезно, если вы по какой-то причине было много наборов одинаковые имена классов организованы в папки, но это не кажется особенно распространенный сценарий.
вопросы:
- почему это общее Соглашение для имен, чтобы отразить структуру папок?
- соблюдаете ли вы эту конвенцию? Зачем?
10 ответов:
Так же как и вы - я боролся с этим долгое время. Затем я начал рассматривать, почему я создал папки. Я обнаружил, что начинаю создавать папки для представления пространств имен и пакетов вместо произвольных ведер.
например, в проекте MVVM было бы полезно поместить представления и модели представлений в отдельное пространство имен. MVC будет иметь отдельное пространство имен для моделей, контроллеров и представлений. Также полезно группировать классы по их признакам.
внезапно, проект чувствует себя более организованным. Другим разработчикам легче найти, где реализованы функции.
Если вы стандартизируете свои практики пространства имен, все ваши проекты будут иметь одну и ту же предсказуемую структуру, которая будет большой победой для обслуживания.
Если вы хотите получить хороший совет, я бы рекомендовал купить рекомендации по разработке фреймворка: соглашения, идиомы и шаблоны для многоразовых библиотек .NET что дает вам все, что вам нужно знать от фактической проектной группы рамок.
...цель при именовании пространств имен-создать достаточную ясность для программиста, использующего фреймворк, чтобы сразу узнать, каким будет содержимое пространства имен...
<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]и главное
не использовать то же имя для пространства имен и типа в этом пространстве имен
фрагментация каждого типа 1/2 в пространства имен не будет соответствовать первому требованию, так как у вас будет болото пространств имен, которые должны быть квалифицированы или использованы, если вы следуете пути Visual Studio. Например
ядро - Домен - Пользователи - Разрешения - Аккаунты
вы бы создали
- Название_компании.Ядро.Домен.Пользователи
- Название_компании.Ядро.Домен.Разрешения
- Название_компании.Ядро.Домен.Аккаунты
или просто
- Название_компании.Ядро.Домен
для Visual Studio это будет первый. Кроме того, если вы используете имя файла/папки в нижнем регистре, вы каждый раз ищете переименование класса, а также создаете одно большое пространство имен запутывать.
большинство из них-это здравый смысл и действительно до того, как вы ожидаете увидеть организованные пространства имен, если вы были потребителем вашего собственного API или фреймворка.
меня это тоже раздражало, но работа с проектами и рефакторинг с большими кодовыми базами быстро научили меня другому. Приняв концепцию, я думаю, что это очень хороший способ структурировать ваш код "физически", а также логически. Когда у вас есть большой проект и пространства имен не совпадают с папками, становится трудно быстро найти файлы. Кроме того, гораздо труднее вспомнить, где находятся вещи...
кроме того, если ReSharper рекомендует его, тогда это, наверное, хорошая идея. Например, R# будет жаловаться, если пространство имен вашего класса не соответствует его имени папки.
один из способов не следовать соглашению-создать файл в корневой папке проекта, а затем переместить его в конечную подпапку.
во всяком случае, это соглашение мне действительно нравится. Если я разделяю типы на папки, то, вероятно, эти типы имеют какую-то концептуальную группировку, связанную с папкой. Таким образом, это заканчивается некоторым смыслом, их пространства имен также похожи. Java использует этот подход и применяет его с помощью своей системы пакетов. Самое большое различие заключается в том, что VS только "предлагает" его вам, так как ни язык, ни среда CLR не принуждают его.
папки файловой системы и пространства имен представляют собой иерархию. Мне кажется совершенно естественным, чтобы я соответствовал этим двум. Я иду еще на один шаг дальше и использую соотношение 1:1 между файлами и классами. Я даже делаю это, когда я программирую на других языках, таких как C++.
теперь, когда вы подвергаете сомнению связь между этими двумя иерархиями, я серьезно задаюсь вопросом, что вы хотели бы представить иерархией файловой системы.
хотя я согласен со всеми остальными, что физическая структура, соответствующая логической структуре, полезна, я должен сказать, что я также борюсь с автоматическим именованием Visual Studio. Есть полдюжины причин, почему я должен переименовать классы:
- Я использую корневую папку "src", чтобы визуально отделить мой код от встроенных ресурсов
- Я хочу другую капитализацию
- Я организую свой код в подпапки для организации в пространстве имен
- I как отделить интерфейсы от реализаций и базовых классов
- Я чувствую, что это
с thiose причины, я смирился с тем, чтобы настроить их для каждого класса, который я создаю. Моя стратегия, чтобы избежать этой проблемы, заключается в копировании файла с объявлением пространства имен, которое я хочу, а затем немедленно удалить содержимое.
до появления пространств имен в C++ все типы C находились в глобальном пространстве имен. Пространства имен были созданы для разделения типов в логические контейнеры, поэтому было ясно, к какому типу относится. Это также относится и к C#.
сборки-это решение для развертывания. Если вы посмотрите на .Net framework, данная сборка будет содержать несколько разных пространств имен.
папка предназначена для организации файлов на диске.
эти трое не имеют никакого отношения однако часто бывает удобно, что имя сборки, пространство имен и имена папок совпадают. Обратите внимание, что Java сворачивает папки и пространства имен, чтобы быть тем же самым (ограничивая свободу разработчика организовывать файлы и пространства имен).
часто мы выбираем для организации файлов в проекте в несколько папок, потому что это легче для меня или моей команды, чтобы перемещаться по файлам. Обычно эта файловая организация не имеет ничего общего с дизайном пространства имен, который мы используем. Я желаю команде против не будет по умолчанию пространство имен совпадать с именем папки или, по крайней мере, возвращать параметр, чтобы это не было по умолчанию.
Не страдайте, либо измените шаблон для новых классов, либо исправьте пространство имен после создания нового файла.
Я также чувствую боль с этим поведением "по умолчанию" в Visual Studio.
Visual Studio также пытается установить соответствие пространства имен / каталога при установке LinqToSql
.dbmlфайлы в отдельную директорию. Всякий раз, когда я редактирую.dbml, Я должен помнить:
- открыть
.dbml.designer.csfile- удалите имя каталога / папки из
namespaceдекларацияесть способ остановить это поведение, хотя. Она включает в себя создание пользовательского шаблона класса.
Я думаю, что есть действительно веские причины для наличия различных структур для пространств имен и папок проекта. Если вы разрабатываете библиотеку, структура пространства имен должна в первую очередь обслуживать пользователи вашего API: это должно быть логично и легко понять. С другой стороны, структура папок должна быть в первую очередь там, чтобы сделать жизнь проще для вас, API designer. Некоторые цели действительно очень похожи,например, что структура должна быть логичной. Но могут быть и другие, например вы можете быстро выбрать связанные файлы для инструментов, или что это легко ориентироваться. Я сам, например, склонен создавать новые папки, когда достигается определенный порог файла, иначе это займет слишком много времени, чтобы найти файл, который я ищу. Но уважение предпочтений дизайнера может также означать строгое следование пространству имен-если это их предпочтение.
Так что в целом, во многих случаях это имеет смысл, что оба матча, но я думаю есть обоснованные случаи отклонения.
Что было полезно в прошлом для меня было создание файла (например, WPF UserControl) в одном месте, чтобы получить пространство имен правильно, а затем переместить его в "правильную" папку.
хотя я согласен, что сопоставление иерархии пространства имен с иерархией папок удобно, и это хорошая идея, я думаю, что тот факт, что Visual Studio, похоже, не поддерживает отключение этой функции, отвратителен. Visual Studio имеет много приложений, и есть много стилей кодирования и способов структурирования папок исходных файлов, которые отлично подходят.
допустим, есть тысячи файлов, которые принадлежат пространству имен, но программист просто хочет сгруппировать их в папки для упрощения навигации по иерархии. Это действительно такая плохая идея? Действительно ли это сделает вещи настолько недоступными, что это должно быть запрещено IDE???
допустим, я использую Visual Studio для работы с Unity. Теперь все мои скрипты находятся в разделе " Активы.Скрипты " пространство имен. Существует не только бесполезное пространство имен активов, которое теперь не содержит скриптов, но и "активы.Scripts " не имеет смысла - он не описывает, к какому проекту или части проекта принадлежит исходный файл. Бесполезный.
Comments