Как избежать сходства имен между вашими классами и родными? [закрыто]

9

Я просто столкнулся с «интересной проблемой», о которой я хотел бы узнать ваше мнение:

Я занимаюсь разработкой системы и по многим причинам (т.е. абстракция, технологическая независимость и т. Д.) Мы создаем свои собственные типы для обмена информацией.

Например: если есть метод, который называется SendEmail и вызывается бизнес-логикой, он может иметь параметр типа OurCompany.EMailMessage, который является полностью независимым от технологии объектом и содержит только «данные, относящиеся к бизнесу» (для Например, нет информации о кодировании головы).

Внутри функции SendEmail мы получаем эту информацию из нашего объекта EMailMEssage и создаем объект MailMessage (это зависит от технологии), чтобы его можно было отправлять по сети.

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

У вас есть эта проблема часто? Как тебе это удается?

Редактировать: @mgkrebbs только что прокомментировал использование полностью определенных имен. Это наш нынешний подход, но слишком многословный, ИМХО. Я хотел бы что-нибудь чище, если это возможно.

И.С.Бах
источник
2
Всегда использование квалификации кажется приемлемым решением, хотя и немного многословным. Используйте OurCompany.EMailMessage для одного типа и SendEmailClass.EMailMessage (или любой другой) для другого. Есть ли проблема с этим подходом?
mgkrebbs
Да, я думал об этом, но это становится многословным. Я бы хотел что-нибудь «чище», но предложенное вами решение - мое текущее. Я добавлю это к объяснению
JSBach
3
Имена приходят в контексте. Обычно это пространство имен или что-то в этом роде. Так что это не должно быть проблемой.
Deadalnix
+1, мне нравится этот вопрос. Однажды я задал этот вопрос инструктору около 7 лет назад, и он подумал, что я полный "...." :)
NoChance
Какой язык вы используете? Ответ зависит от языка. В общем случае ответ «использовать пространство имен». В одном приложении Java довольно распространено использовать одно и то же имя класса, которое используют полдюжины библиотек.
Кевин Клайн

Ответы:

3

Это проблема с пространством имен, которое вы собираетесь использовать для своего проекта.

По сути, пространство имен - это набор ключевых слов, предоставленных всеми вашими классами и / или всеми классами, которые вы хотите использовать в своем проекте (включая стандартные классы, обычно предоставляемые с языком / компилятором / IDE).

Поскольку пространство имен является коллекцией, применяются некоторые правила, чтобы предотвратить путаницу терминов без какого-либо связанного поведения, а некоторые языки, такие как C #, также позволяют вам определять свое собственное пространство имен, как обычно, и также использовать его в других классах.

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

Тема широко обсуждается в сети, я могу предложить базовый поиск с терминами «пространство имен [ваш язык]» или что-то в этом роде. Я не отвечаю прямо на ваш вопрос просто потому, что вы можете по-разному подходить к разным языкам.

Микро
источник
3

Ну, моя старая команда разработчиков использует для добавления аббревиатуру приложения в каждом настраиваемом классе. У нас был, например, класс ABCEmail .

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

И последнее, но не менее важное: поскольку вы создаете новый объект, это означает, что собственный объект не отвечает вашим потребностям, поэтому ваше имя файла электронной почты может быть CustomizedEmail , AdvancedEmail ... и т. Д.

Амин
источник
1
Договорились до вашего последнего пункта, но почему бы OAEmailлучше чем OurApplication.Email? OAEMailоказывает влияние на каждую часть программного обеспечения, в то время как нотация пространства имен оказывает влияние только там, где происходит преобразование, и оба класса используются в одном и том же исходном файле.
Стивен Джеурис
1
Я думаю, что префикс - это хорошая идея, когда ваш язык не поддерживает пространства имен. Но если язык поддерживает какую-то форму в пространстве имен, тогда используйте ее (это проблема имен, которые были разработаны для решения!). `
Martin York
@ Steven Jeuris: имя класса должно быть выбрано после его создания. После этого я считаю плохой практикой менять это ... из-за всех ненужных воздействий.
Амин
@Loki Astari: я не знаю, какую IDE вы используете, но я считаю, что другое имя класса легче обрабатывать при поиске или открытии данного класса. Я видел проекты с настроенной версией «электронной почты», и каждый раз, когда я хотел открыть файл, мне приходилось просматривать несколько пространств имен. Ваша точка зрения остается в силе. Я полагаю, что это субъективно для организации пакета, сколько пользовательских классов будет создано.
Амин
1
@ Амин: я не понимал, что вы на самом деле спорите с пространствами имен. Я предлагаю вам прочитать о пространствах имен еще немного, чтобы увидеть все преимущества их использования: инкапсуляция, устранение неоднозначности, меньшая избыточность, ... PS: большинство современных IDE имеют функции поиска, которые позволяют быстро находить исходный файл без необходимости просматривать иерархия. Что касается вашего комментария ко мне: постоянный рефакторинг является частью разработки программного обеспечения. Когда вы можете придумать более подходящее имя, большое влияние или нет, вы должны рассмотреть его переименование. Однако лучше сначала обсудить это с коллегами.
Стивен Джеурис
3

Какой язык вы используете? Ответ зависит от языка. В общем случае ответ «использовать пространства имен». Я бы почти никогда не искажал имя типа, чтобы избежать конфликта с каким-либо внешним пространством имен.

В одном приложении Java довольно часто иметь одно и то же имя класса (например, «Дата»), определенное в полдюжине пространств имен. Если одному классу необходимо использовать два отдельных класса Date, тогда один из классов Date должен быть полностью квалифицирован везде, где он появляется, поскольку Java не поддерживает псевдонимы типов. В С ++ жизнь проще; Вы можете просто переименовать один из них с помощью typedef.

Кевин Клайн
источник
Я собирался опубликовать аналогичный ответ, но вместо примера псевдонима C ++ хотел упомянуть, что C # использует директиву псевдонима .
Стивен Джеурис
@Steven: я собирался упомянуть C # вместо C ++, но прошло несколько лет с тех пор, как я программировал на C #, и не был уверен.
Кевин Клайн
2

У вас есть эта проблема часто? Как тебе это удается?

Это действительно зависит от языка, который вы используете. В C ++ и Java эта проблема решается с помощью пространств имен. Я использую c ++, и бывает, что у меня разные классы с одинаковыми именами. Это не проблема, поскольку они находятся в разных пространствах имен.

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

BЈовић
источник
Для компьютера это не проблема, но для разработчика это может быть так, например, у вас есть EmailMessage и MailMessage.
И.С.Бах
@ Оскар Очевидно. Для компьютера это может быть, xyz123и он все еще работает так же. Я не вижу другого пути, чем становиться многословным (вы сказали в комментариях, что пытаетесь избежать этого).
BЈовић
2

Ваш вопрос очень хороший. Как насчет того, если вы префикс вашего метода с префиксом, например, U (или U) или CLS (сокращение от класса)? Например:

clsEMailMEssage или uEMailMEssage

Это не требует большого набора текста, и вы можете сразу сказать, что тип «ваш».

Изменить - В ответ на первые 2 комментария:

Я хотел бы обратить внимание читателя на тот факт, что: не все венгерские обозначения созданы равными. Мы должны различать System Hungarian и Apps Hungarian. Я предполагаю, что приведенное выше предложение соответствует типу Apps Hungarian, который не является вредным.

Вред, связанный с системной венгерской нотацией, такой как присвоение имени идентификатору intID, в приведенном выше предложении отсутствует.

Чтобы узнать больше об этом, взгляните на: Создание неправильного кода - неправильный - Joel On Software

Без шансов
источник
3
Каждый раз, когда кто-то рекомендует венгерскую нотацию, Бог убивает котенка.
Конамиман
2
BIgHUmpCAmelCAsing тоже не помогает.
Стивен Джеурис
Комментарии выше приветствуются. Просьба посмотреть мои правки, хотя я знаю, что некоторые из нас не передумают, в конце концов, кто хочет, чтобы котенка убили? :)
NoChance
Я убрал голосование против, теперь, когда вы добавили веские аргументы. Тем не менее, я не согласен с тем, что Apps венгерский более подходит, чем пространства имен в этом сценарии. Когда язык поддерживает псевдонимы, это гораздо более подходящее решение. Смотрите ответ Кевина Клайна .
Стивен Джеурис
@ Стивен Джеурис, спасибо за ваш комментарий. Пространства имен идеальны, за исключением того, что они довольно длинные, чтобы продолжать печатать, я проверю предоставленную вами ссылку.
NoChance