Як уникнути подібності імен між вашими класами та рідними? [зачинено]


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 .

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

І останнє, але не менш важливе значення, оскільки ви створюєте новий об'єкт, це означає, що нативний об’єкт не відповідає вашим потребам, щоб ваше ім’я вашого файлу електронної пошти могло бути налаштованоEmail , AdvancedEmail ... тощо


1
Погодився з вашим заключним пунктом, але чому було OAEmailб краще, ніж OurApplication.Email? OAEMailвпливає на кожну частину програмного забезпечення, тоді як позначення простору імен впливають лише там, де відбувається перетворення і обидва класи використовуються в одному вихідному файлі.
Стівен Євріс

1
Я думаю, що префікс - це гарна ідея, коли ваша мова не підтримує простори імен. Але якщо мова підтримує певну форму для простору імен, тоді використовуйте її (це проблема просторів імен була розроблена для вирішення!). `
Мартін Йорк,

@Steven Jeuris: Ім'я класу слід вибирати після його створення. Згодом я вважаю поганою практикою його змінювати ... через усі зайві наслідки.
Амін

@Loki Astari: я не знаю, який IDE ви використовуєте, але я вважаю, що інше ім’я класу легше обробляти під час пошуку чи відкриття заданого класу. Я бачив проекти, що мають індивідуальну версію "електронної пошти", і кожного разу, коли я хотів відкрити файл, мені довелося переглядати декілька просторів імен. Ваша думка є дійсною, я думаю, що це залежно від організації пакунків, скільки створених класів буде створено.
Амін

1
@Amine: Я не розумів, що ти насправді сперечаєшся з просторами імен. Я пропоную вам почитати про простори імен ще трохи, щоб побачити всі переваги їх використання: інкапсуляція, усунення неоднозначності, менша надмірність, ... Ps: Більшість сучасних IDE мають функції пошуку, які дозволяють швидко знайти вихідний файл без необхідності перегляду. ієрархія. Щодо вашого коментаря до мене: постійний рефакторинг є частиною розробки програмного забезпечення. Коли ви можете придумати більш підходящу назву, великий вплив чи ні, слід подумати про її перейменування. Найкраще, однак, спочатку обговорити це з колегами.
Стівен Євріс

3

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

В одному додатку Java цілком часто зустрічається однакове ім’я класу (наприклад, "Дата"), визначене в півдесятка просторів імен. Якщо одному класу потрібно використовувати два окремі класи дати, то один із класів Дата повинен бути повністю кваліфікованим скрізь, де він з’являється, оскільки Java не підтримує псевдоніми типів. У С ++ життя простіше; ви можете просто перейменувати один із них за допомогою typedef.


Я збирався розмістити аналогічну відповідь, але замість прикладу псевдоніму C ++ хотів згадати C # з використанням директиви псевдоніму .
Стівен Євріс

@Steven: Я збирався згадати C # замість C ++, але минуло кілька років, як я програмував на C #, і не був впевнений.
Кевін Клайн

2

Чи часто у вас є ця проблема? Як вам це вдається?

Це дійсно залежить від мови, якою ви користуєтесь. У c ++ та java ця проблема вирішується за допомогою просторів імен. Я використовую c ++, і трапляється, що у мене були різні класи з однаковою назвою. Це не проблема, оскільки вони знаходяться в різних просторах імен.

В інших мовах не існує способів, але можна вказати різні назви.


Для комп'ютера це не проблема, але для розробника це може бути, оскільки, наприклад, у вас є EmailMessage та MailMessage.
JSBach

@Oscar Очевидно. Для комп'ютера це може бути, xyz123і він все одно працює так само. Я не бачу іншого способу, як переходити дослідно (ви сказали в коментарях, що намагаєтесь цього уникнути).
BЈович

2

Ваше запитання дуже добре. Як щодо того, якщо ви префіксуєте свій метод з префіксом, таким як U (або u) або cls (короткий для класу)? Наприклад:

clsEMailMEssage або uEMailMEssage

Для цього не потрібно багато вводити текст, і ви можете відразу сказати, що тип "ваш".

Редагувати - У відповідь на перші 2 коментарі:

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

Шкода, пов’язана із системними позначеннями угорської мови, такими як іменування ідентифікатора intID, у вищенаведеній пропозиції немає.

Щоб дізнатися більше про це, подивіться на: Зробити неправильний код невірним - Joel On Software


3
Кожен раз, коли хтось рекомендує угорські позначення, Бог вбиває кошеня.
Конаміман

2
Також не допомагає BIgHUmpCAmelCAsing.
Стівен Євріс

Коментарі вище оцінені. Будь-ласка, дивіться мої зміни, хоча я знаю, що деякі з нас не передумають, адже хтось хоче, щоб кошеня було вбито? :)
NoChance

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

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