это хорошая идея иметь классы с тем же именем в другом пространстве имен в С#?

например, у нас есть два класса для анализа резюме, один для анализа Excel, а другой для анализа HTML. Что мои коллеги любят делать, так это называть эти два класса одним и тем же именем и помещать их в разные пространства имен, как показано ниже:

namespace XX.ResumeParsers.Excel
class ResumeParser{}

namespace XX.ResumeParsers.Html
class ResumeParser{}

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

//in Excel folder under ResumeParsers folder
namespace XX.ResumeParsers
class ExcelResumeParser{}

//in Html folder under ResumeParsers folder
namespace XX.ResumeParsers
class HtmlResumeParser{}

таким образом, иерархия все еще существует в папке, но пространство имен такое же (не точно соответствует иерархии папок), это нормально?

и если я прав, есть идеи, как убедить моих коллег? или есть существенный недостаток в их решении?

благодаря.


person John Cai    schedule 14.09.2010    source источник
comment
согласно Джону, здесь есть 2 решения: 1. Должны ли они быть в разных пространствах имен или нет — это отдельное решение. 2, по возможности сохраняйте имя класса уникальным, особенно когда они оба используются одним и тем же потребителем.   -  person John Cai    schedule 14.09.2010


Ответы (5)


Обычно это не очень хорошая идея, особенно если вам нужно использовать оба класса из одного и того же кода. Должны ли они находиться в разных пространствах имен или нет — это отдельное решение, но я бы определенно назвал их HtmlResumeParser и ExcelResumeParser вместо того, чтобы пытаться сделать так, чтобы пространство имен сообщало контекст. Это значительно облегчит определение того, о чем вы говорите, когда читаете код.

person Jon Skeet    schedule 14.09.2010

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

В общем, для людей, пишущих код, всегда ясно, какой класс используется и почему — но подумайте о людях, читающих его — смогут ли они с первого взгляда сказать, какой парсер используется в вашем коде?

Также бывает случай, когда вам нужны оба класса в одном и том же методе - Джон уже упомянул об этом - тогда вы получите конфликты и вам нужно будет использовать полное пространство имен - это боль. И даже если вы знаете, что это не так, в будущем это может понадобиться кому-то другому. И, вероятно, тоже захочет завладеть вами :).

person Dan C.    schedule 14.09.2010

Здесь нет абсолютно правильного или неправильного решения, но помещение похожих классов в одно и то же пространство имен кажется хорошей идеей.

Вы можете посмотреть на StreamReader и StringReader как на аналогичный пример во фреймворке. Оба они реализуют один и тот же интерфейс (TextReader) и оба находятся в пространстве имен System.IO, хотя класс StringReader не выполняет никакого фактического ввода-вывода, поскольку он читает из строки в памяти.

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

person Guffa    schedule 14.09.2010
comment
А также вы можете посмотреть форматтеры Soap и Binary, и вы увидите, что у них разные пространства имен. И я думаю, что мой пример более применим для этого вопроса :) - person SeeSharp; 14.09.2010
comment
Мне нравится точка зрения Джона Скита: должны ли они быть в разных пространствах имен — это другое деление. вы должны попытаться сделать имена классов уникальными, это тоже мой вариант. спасибо вам всем. - person John Cai; 14.09.2010

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

person ChrisW    schedule 14.09.2010

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

  • Можно разделить на разные сборки
  • Каждый парсер независим от другого
person SeeSharp    schedule 14.09.2010
comment
но даже если вы назовете классы HtmlResumeParser и ExcelResumeParser, вы также можете разделить их на разные сборки. - person John Cai; 14.09.2010
comment
Наличие их в одном пространстве имен не мешает вам поместить их в отдельные сборки и, таким образом, сделать их независимыми. - person Guffa; 14.09.2010
comment
И у вас могут возникнуть проблемы с тем, чтобы дать другое имя для этих сборок, конечно, если вы хотите указать пространство имен для имени файла. - person SeeSharp; 14.09.2010
comment
Каким образом имя решает, независимы ли парсеры друг от друга? - person Jon Skeet; 14.09.2010
comment
Вы должны добавить использование, если хотите повторно использовать логику одного парсера для другого. И, как результат, иметь больше контроля над зависимостями между прохожими. - person SeeSharp; 14.09.2010