Как я могу убедить скептически настроенных коллег в правильных пространствах имен в .Net? - PullRequest
5 голосов
/ 20 декабря 2008

Моя команда работает над проектом конверсии для преобразования одного продукта (но с несколькими аспектами) из VB6 в .Net (у нас более ~ 300 тыс. LOC). Перед тем, как я попал на борт, было принято решение, что независимо от расположения сборки или структуры папок все классы / структуры будут находиться в одном пространстве имен:

.

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

Ответы [ 11 ]

7 голосов
/ 20 декабря 2008

Хороших ответов, уже

Я прочитал много хороших ответов (например, образ папки на диске - хороший, как и разделение / организация объектов / концепций).

Тем не менее, некоторые другие, менее «технические» аргументы могут помочь не для объяснения того, почему пространства имен лучше альтернативы, а для выявления дурных причин, пространства имен не используются.

Аргумент власти

Каждый C #, VB.NET, Java, C ++, любой разработчик, достойный своей соли на этой планете, признает, что пространства / пакеты имен - это хорошая вещь. Эй, они даже рассматривают это в JavaScript Mozilla .

Я полагаю, что ваш вопрос о переполнении стека имеет отношение к "Аргументу авторитета" ... ^ _ ^

Старые привычки умирают усердно

Я полагаю, что вы попали в случай "старых привычек".

Хотя у меня нет прямого опыта использования VB.NET против старых привычек VB6, я делаю это для C ++ против урезанного C-like, C ++.

Половина работы ...

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

Например (это наиболее верно для разработчиков C ++, сталкивающихся со "старым способом", кодом, подобным C, но, я думаю, это жизнеспособно везде), используют ли они префиксы для своих символов.

Есть ли у них:

  • Счет Пользователь
  • Счет Цена
  • Счет Id
  • Логин Пользователь
  • Логин Пароль

классов / символов и объясните, что «Пользователь» Учетной записи не совпадает с «Пользователем» при входе в систему, и, следовательно, префикс для их дифференциации?

«Шаблон» идет прямо сквозь потолок, когда они префиксируют свои символы модулем (что, безусловно, относится к вашему коду, если он достаточно большой):

У вас есть MyUtil DLL, а также MyKernel DLL и MyGui DLL? Таким образом, у вас есть:

  • MyUtil_ Что-то
  • MyUtil_ SomethingElse
  • MyKernel_ YetAnotherObject
  • MyKernel_ AnotherThing
  • MyGui_ SomeGui

классы / символы

Если да, то они должны подтвердить, что они уже используют пространства имен.

Если нет, то либо ваша кодовая база слишком мала (но ваши «9 проектов» говорят мне, что это не так), либо они регулярно являются проблемами конфликта имен ... Что может быть решено либо с помощью префикса, описанного выше, либо даже лучше по пространствам имен.

Другая половина ...

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

Опять же, вы можете использовать аргумент от власти ( Что? Вы уверены, что знаете лучше, чем инженеры Top Gun из Microsoft? ), но в этом случае вам следует привести примеры того, почему. Пространства имен NET (или что-то еще) лучше, чем те, которые они используют (или не используют).

Для VB.NET/.NET хороших аргументов уже более чем достаточно, и я не буду останавливаться на аргументах за пространствами имен C ++, потому что это было бы не по теме.

Но, по крайней мере, использование встроенных пространств имен делает упомянутый выше префикс необязательным. Приведу пример из интернета (я не очень хорошо знаю VB.NET):

Imports MyWholeProject

Class HelloWorld

   Public Sub Main()
      Dim o As MyModuleAAA_MyObject = New MyModuleAAA_MyObject
      Dim t As MyModuleBBB_MyThing = New MyModuleBBB_MyThing
      Dim g As MyModuleCCC_MyGizmo = New MyModuleCCC_MyGizmo
      REM etc.
   End Sub

End Class

Более многословно, чем включенное пространство имен:

Imports MyWholeProject.MyModuleAAA
Imports MyWholeProject.MyModuleBBB
Imports MyWholeProject.MyModuleCCC

Class HelloWorld

   Public Sub Main()
      Dim o As MyObject = New MyObject
      Dim t As MyThing = New MyThing
      Dim g As MyGizmo = New MyGizmo
      REM etc.
   End Sub

End Class

А многословие приводит к более неясному коду и, следовательно, к ошибкам. Конечно, вы можете заменить MyModuleAAA чем-то менее длинным, например, MMAAA ... Но тогда это приведет к более неясному коду и т. Д. И т. Д.

Googling может найти более широкое использование пространств имен в .NET, например: http://www.vbdotnetheaven.com/UploadFile/ggaganesh/NamespacesInVbDotNet04202005005133AM/NamespacesInVbDotNet.aspx

Проект / Карьера

Эти причины больше связаны с управлением проектами / карьерой ...

Техническое обслуживание не является обязательным

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

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

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

Этот аргумент предназначен для инженеров, которые имеют карьеру и должны продолжать свою работу: как и приложения, инженеры-программисты могут устареть.

А это значит, что устаревший разработчик при подаче заявки на другую работу тоже проиграет. Потому что, эй, кто хочет платить за того, кто просто не может получить что-то такое простое, как пространства имен?

Опыт - это хорошая вещь, когда он сочетается со знанием современного уровня техники. Если нет, то это всего лишь динозавр, старый циничный и бесполезный бродячий о " как это было лучше (читай: проще) , в мое время, когда нам не нужны были все эти штуковины, подобные объектам ».

Поддерживать себя в курсе не является обязательным (со стороны менеджера)

Отказываясь адаптироваться к новым возможностям языка (обычно потому, что « мы знаем лучше, вы знаете? »), инженеры просто надевают бетонные ботинки, в то время как конкуренты, вероятно, ставят кроссовки. Это означает, что приложение, созданное устаревшей командой, в конечном итоге потеряет. Период.

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

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

5 голосов
/ 20 декабря 2008

Правильное использование пространств имен заключается в обеспечении упорядоченной структуры логически сгруппированных классов, интерфейсов, перечислений и т. Д. Это все равно, что поместить все ваши файлы в одну папку ... или, что еще хуже, поместить их все в корень диска C: ...

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

3 голосов
/ 20 декабря 2008

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

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

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

2 голосов
/ 20 декабря 2008
  1. Разборчивость и организация кода, как отмечали многие.

  2. Разделение классов с одинаковыми именами на разные «пробелы», такие как Network.Session, Meeting.Session, WebServer.Session и т. Д. В реальном мире существует множество объектов, которые имеют одинаковые или похожие имена. Вот почему имена должны иметь свои собственные пробелы, чтобы квалифицировать их. Пространства имен также облегчают именование сборок при правильном использовании, например System.Web.DLL и System.Messaging.DLL . Это помогает повторно использовать код, поскольку вы разделяете код на более мелкие функциональные блоки (DLL), которые могут быть включены по мере необходимости, без учета всей гигантской массы (или беспорядка).

  3. Пространства имен - это границы, которые разделяют код различных проектов, целей и категорий. В более крупных проектах, где многие файлы DLL используются совместно и используются повторно, программистам необходим легко запоминающийся способ ссылаться на правильные классы и избегать ссылок на неправильные классы. Можно ли представить себе неуправляемое безумие, если Microsoft решила поместить все классы .NET в одно пространство имен System? Как любой программист может даже начать писать код для вызова этих классов? Кроме того, вам нужно иметь дело с классами, именуемыми как WindowsFormsTextBox и WebUIWebControlsTextBox или с чем-то более длинным. Наличие правильных пространств имен помогает программистам быстро и безопасно писать код.

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

2 голосов
/ 20 декабря 2008

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

  1. Установите жесткие цифры на стоимость отсутствия пространств имен (ремонтопригодность, отладка и т. Д.) И получите исполнительное руководство на борту.

  2. Доброволец для создания соглашений о пространстве имен и выполнения ВСЕХ работ по преобразованию проектов.

К сожалению, по моему опыту, когда-то столь же широко распространенное, как соглашение о пространстве имен, было принято, требуется акт Конгресса, чтобы его изменить.

1 голос
/ 20 декабря 2008

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

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

Скажите им, что это физическое представление наличия одного пространства имен - таблица конференции - это пространство имен, книги - это модули / классы / проекты.

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

Если они все еще не получают его, сдавайтесь и начинайте искать другую работу. Вы не хотите работать с такими толстыми людьми! ; -)

0 голосов
/ 20 декабря 2008

Как они думают, для чего нужны пространства имен? Почему они думают, что BCL использует их?

0 голосов
/ 20 декабря 2008

Если разработчики довольны VB6 и структурой существующего проекта VB6, возможно, имеет смысл структурировать перенесенный проект так же, как оригинал, даже если он подрывает некоторые из лучших практик в .net. (Я предполагаю, что VB6 не поддерживает пространства имен?) Пространства имен могут быть введены позже, когда новая кодовая база будет стабильной, а разработчики станут более комфортными с .net.

0 голосов
/ 20 декабря 2008

Если вам нужно убедить их в том, что разделение пространств имен, а не просто «Единого истинного пространства имен» - это хорошая, желанная вещь, то это, похоже, указывает на то, что вы, вероятно, не сможете убедить их в этом. Просто чтобы быть честным.

0 голосов
/ 20 декабря 2008

Если у меня есть хорошо спроектированная схема пространства имен, операторы using / Imports в верхней части файла кода документируют то, что я использую в этом файле.

...