это хорошая идея, чтобы классы с одинаковыми именами в разных пространствах имен в C #? - PullRequest
6 голосов
/ 14 сентября 2010

например, у нас есть два класса для анализа резюме, один для анализа 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{}

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

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

спасибо.

Ответы [ 5 ]

8 голосов
/ 14 сентября 2010

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

3 голосов
/ 14 сентября 2010

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

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

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

1 голос
/ 14 сентября 2010

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

1 голос
/ 14 сентября 2010

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

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

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

0 голосов
/ 14 сентября 2010

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

  • Можно разделить на разные сборки
  • Каждый парсер независим от других
...