Чи повинні папки в розчині відповідати простору імен?


129

Чи повинні папки в розчині відповідати простору імен?

В одному з проектів моїх команд у нас є бібліотека класів, в якій є багато підпапок.

Назва проекту та простір імен: MyCompany.Project.Section.

У рамках цього проекту є кілька папок, які відповідають розділу простору імен:

  • У папці Vehiclesє класи в MyCompany.Project.Section.Vehiclesпросторі імен
  • У папці Clothingє класи в MyCompany.Project.Section.Clothingпросторі імен
  • тощо.

Всередині цього ж проекту є ще одна папка-шахрая

  • У папці BusinessObjectsє класи в MyCompany.Project.Sectionпросторі імен

Є кілька подібних випадків, коли папки створюються для «організаційної зручності».

Моє запитання: Що таке стандарт? У бібліотеках класів папки зазвичай відповідають структурі простору імен чи це мішана сумка?


9
Примітка: ReSharper скаржиться, якщо простори імен не відповідають ієрархії папок.
Фред

Відповіді:


77

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

Заняття буде легше знайти, і лише вони повинні бути досить добрими причинами.

Правила, яких ми дотримуємось:

  • Ім'я проекту / складання таке ж, як і ім'я кореня, за винятком закінчення .dll
  • Єдиним винятком із вищезазначеного правила є проект із закінченням .Core, .Core знімається
  • Папки дорівнюють просторам імен
  • Один тип файлу (клас, структура, enum, делегат тощо) дозволяє легко знайти потрібний файл

1
+1 для "Єдиним винятком із вищезазначеного правила є проект із закінченням .Core, .Core позбавлений" поодинці. У мене MyProject.Core.dllскладання і всі заняття починаються з MyProject.Core. Зняття .Coreсуфікса має набагато більше сенсу.
Луїз Дамім

2
Ще один виняток, який я можу додати, - це Винятки. Винятки вже суфіксовано "Виключенням", тому додаткове місце імен є зайвим. Він також може стати безладним, що має частину простору імен зі словом «Виняток» (може призвести до заплутування System.Exception). Однак впорядкування їх у папки є досить корисним.
phillipwei

55

Немає.

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

Я виявив, що найпростішим та найпродуктивнішим маршрутом було створення єдиного простору імен на проект, і всі класи переходять у цей простір імен. Тоді ви можете розмістити файли класу в папки, які ви хочете. Немає сумніву в тому, що весь час додавати використання операторів у верхній частині файлів, оскільки існує лише одна область імен.

Важливо організувати вихідні файли в папки, і, на мою думку, для цього потрібно використовувати всі папки. Потрібна необхідність, щоб ці папки також відображалися в просторах імен, не потрібна, створює більше роботи, і я виявив, що насправді шкідливо для організації, оскільки додаткове навантаження сприяє дезорганізації.

Візьмемо для прикладу це попередження FxCop:

CA1020: Уникайте просторів імен з кількома типами
причин: Простір імен, крім глобальної простори імен, містить менше п'яти типів https://msdn.microsoft.com/en-gb/library/ms182130.aspx

Це застереження заохочує скидання нових файлів у загальну папку Project.General або навіть корінь проекту, поки у вас є чотири подібних класи для обгрунтування створення нової папки. Чи станеться це коли-небудь?

Пошук файлів

У прийнятій відповіді сказано: "Класи буде легше знайти, і лише вони повинні бути достатньо добрими причинами".

Я підозрюю, що відповідь має на увазі наявність декількох просторів імен у проекті, які не відображають структуру папок, а не те, що я пропоную, це проект з єдиним простором імен.

У будь-якому випадку, поки ви не можете визначити, в якій папці знаходиться клас класу з простору імен, ви можете знайти його за допомогою Go To Definition або вікна пошуку рішень пошуку в Visual Studio. Також, на мою думку, це насправді не велика проблема. Я не витрачаю навіть 0,1% свого часу на розробку проблеми пошуку файлів, щоб виправдати її оптимізацію.

Назва сутичок

Звичайно створення декількох просторів імен дозволяє проекту мати два класи з однаковою назвою. Але це справді гарна річ? Може, простіше просто заборонити це неможливо? Дозвіл двох класів з однаковою назвою створює більш складну ситуацію, коли 90% часу речі працюють певним чином, а потім раптом ви виявите, що у вас є особливий випадок. Скажімо, у вас є два класи прямокутника, визначені в окремих просторах імен:

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

Можна вирішити проблему, необхідна для вихідного файлу обох просторів імен. Тепер ви повинні виписати повний простір імен скрізь у цьому файлі:

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

Або возитися з якоюсь бридкою допомогою оператора:

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 автоматично відображає простір імен нового файлу в папку проекту, в якій він створений

Невдало, але я вважаю, що клопоту з виправленням простору імен менше, ніж клопоту поводження з ними. Крім того, я звик копіювати вставлення наявного файлу, а не використовувати Add-> New.

Інтернет-браузер та браузер об'єктів

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

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


30
Це, чесно кажучи, одне із найбільш кошмарних рішень, про які я чув. Якщо ви працюєте над маленькими привітними світовими проектами, тоді ця порада працює, але уявіть, що у вас є 1000+ .cs-файлів. Це спричинило б стільки проблем, я не знаю, з чого почати.
BentOnCoding

10
"але уявіть, що у вас є 1000+ .cs файлів". Я працював у проектах такого розміру з єдиним простором імен. Це добре. Як ви думаєте, яка катастрофа трапиться?
Weyland Yutani

14
+1 для мислення. Я не думаю, що я готовий скоротити свої простори імен до одного на проект, але, працюючи над великою рамкою, я досліджую, щоб зменшити кількість просторів імен, щоб зменшити кількість використовуваних операторів та сприяти відкриттю методів розширення. Я думаю, що ця відповідь дає добру їжу для роздумів. Дякую.
Лі Ганн

3
@WeylandYutani Я знаю, що я спізнююсь, але мені потрібно зазначити, що це речення: you can find it by using Go To Definition or the search solution explorer box in Visual Studioне завжди відповідає дійсності. Спробуйте багато наслідування та інтерфейсів ... удачі в пошуку потрібного файлу.
Еммануель М.

11
Це одна з найкращих порад, яку я бачив. Простори імен призначені лише для вирішення конфліктів, а не для організації занять. Використовуйте простори імен лише там, де є сенс їх використовувати, наприклад, якщо ви очікуєте, що імена можуть конфліктувати з іншими проектами, які можуть використовувати ваш проект, дозволяючи включити певні простори імен або виключити за допомогою операторів. Страшно t мати проект з 3 або 4 або більше просторами імен, які часто використовуються, тому що це завжди призводить до смішного числа використання операторів, які потрібно додавати, додавати, додавати та додавати. Розбийте проекти.
Трайнко

31

Я думаю, що стандарт. В рамках .NET полягає в тому, щоб намагатися робити це, коли це можливо, але не створювати надмірно глибоких структур, щоб просто дотримуватися його як жорстке правило. Жоден з моїх проектів не відповідає структурі простору імен == 100% часу, іноді його просто чистіше / краще вирватися з таких правил.

У Java у вас немає вибору. Я б назвав це класичним випадком того, що працює в теорії проти того, що працює на практиці.


1
Я б сказав: "роби це, коли ти дуже хочеш, щоб щось було у власному просторі імен". Це повинно бути свідомим рішенням. Якщо ваші проекти належним чином ізольовані, це має бути одне простір імен на проект. Якщо ваш клас знаходиться в просторі імен, він повинен знаходитись у папці з цим простором імен АБО місце розташування підпапки, яке є принаймні таким же специфічним, як простір імен. Клас на зразок Car.Ford.Fusion (якщо Car.Ford - це єдиний простір імен) повинен знаходитися в папці, як Car / Ford АБО глибше, як Car / Ford / Sedans, таким чином, щоб папка була принаймні такою ж специфічною, як і область імен. Тільки не вкладайте це у Автомобіль / Непов’язаний / Форд; це заплутано.
Трайнко

25

@lassevk: Я погоджуюся з цими правилами та ще один додати.

Коли я вклав класи, я все одно розділяю їх по одному на файл. Подобається це:

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

і

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

5

Я б сказав так.

По-перше, буде легше знайти фактичні файли коду, дотримуючись простори імен (скажімо, коли хтось надсилає вам електронну пошту голим стеком викликів). Якщо ви дозволяєте папкам виходити з синхронізації з просторами імен, пошук файлів у великих кодових базах стає втомлюючим.

По-друге, VS буде генерувати нові класи, які ви створюєте в папках з однаковим простором імен його батьківської структури папок. Якщо ви вирішите плавати проти цього, це буде ще одна сантехнічна робота, яку потрібно робити щодня, додаючи нові файли.

Звичайно, це само собою зрозуміло, що слід бути консервативним щодо того, наскільки глибоко йде ієрархія xis папок / простору імен.


4

Так, вони повинні, інакше призводить лише до плутанини.


2

Що таке стандарт?

Не існує офіційного стандарту, але звичайно найчастіше використовується шаблон відображення простору папок-імен.

У бібліотеках класів папки зазвичай відповідають структурі простору імен чи це мішана сумка?

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.