Заслуги імен / пакетів


14

Деякі мови програмування (наприклад, Java та C ++) мають мовні функції, що називаються "пакетами" або "просторами імен". Наскільки насправді є простори імен? Можна позначати функції та класи як належність до певної бібліотеки без використання такої мовної функції, як, наприклад, SDL (наприклад, SDL SDL_BlitSurface()). Чи простори імен недостатньо корисні, щоб їх варто було б мати? Чи корисні вони в бібліотеках, але не в додатках? Чи корисні вони скрізь, крім невеликих проектів? Думки?

Відповіді:


16

Не є префікси імен тим самим, що й пробіг імен , за винятком того, що це робиться менш корисним і складніше читати / розбирати? Чи не відповідає питання саме по собі?


Просто встановити префікс на початку імені ідентифікатора - це не те саме, що використовувати функцію мови, як простори імен. Наприклад, в C ++ ви можете сказати, що ви є usingпевним простором імен, і тоді вам не доведеться ставити префікс на початку ідентифікаторів у цьому просторі імен.
комман

2
@ user9521 - це моя думка ...
Ніколь,

+1 Великою перевагою просторів імен є те, що ви можете пропустити / скоротити префікс, коли він не потрібен - у просторі імен, де визначена конкретна річ using, користувачем import xxxxxxxxx as yyy, користувачем тощо

1
Оскільки більшість програмістів ледачі, ви б не хотіли декларувати using SDL;або мусити вводити SDL_*всюди?
Берін Лорич

2
+1, але я думаю, ви насправді мали на увазі "менш корисне, складніше для читання і не перевірене компілятором".
Ларрі Коулман

5

Більшість (усі?) Мов з просторами імен, як правило, орієнтовані на об'єкти. Багато разів зрозуміле для людини ім’я для типу є доречним, навіть якщо є кілька несумісних реалізацій. (це спричиняє інші проблеми щодо об'єктно-орієнтованого повторного використання, але це не те, про що йдеться). Наприклад, у Java у вас є Таймер, який використовується для фонових завдань користувальницького інтерфейсу, і Таймер, який використовується для фонових програм (не прив’язаних до AWT / Swing). Простір імен дозволяє вам мати одноіменні об'єкти, що живуть у різних під-API.

Причина виникнення просторів імен була пов'язана з необгрунтованою задачею передбачити, як інші розробники назвуть їх об'єкти. C ++ запровадив цю концепцію (або, принаймні, це була перша мова, до якої я зазнав цієї концепції), і це було корисно, хоча не було вказівок щодо найкращих практик використання. Java адаптувала концепцію та додала деякі "найкращі практики", які включали назву вашої компанії в область імен. Таким чином вам довелося лише хвилюватися про власну компанію.

Префіксація може стати досить безладним. Коли ви застосовуєте його? Коли ви не застосовуєте його? Чи отримують префікс структури / класи / глобальні методи? Що з методами? Як щодо властивостей у структурі. Я бачив усі ці речі в коді, хоча, на щастя, не всі відразу. Простори імен забезпечують деяку передбачуваність усіх цих питань, а це робить його мовною особливістю, а не особистим "найкращим досвідом".


Haskell має простори імен (модулів) і не орієнтований на об'єкти.
Джеремі Хайлер

3

Я думаю, що простори імен - чудова ідея. Вони допомагають запобігти конфліктування імен, обмежуючи сферу дії імені. У пакетах Java запропонована умова іменування пакетів заснована на доменних іменах, які повинні бути унікальними, що допомагає запобігти конфліктам імен щодо користувацьких бібліотек. Загалом, вони роблять названня трохи більш унікальним у широкому розумінні, в той же час дозволяючи програмісту трохи більше свободи в називанні своїх творів, не дотримуючись деяких незрозумілих умов іменування.


1
Однак у випадку конкретної конвенції Java не у кожного є веб-сайт. Крім того, якщо ви коли-небудь переміщаєте свою програму з одного веб-сайту на інший (наприклад, Sourceforge на Github), було б доцільно, але незручно міняти пакети, якщо інші речі залежать від вашого коду.
комман

1
Змова Java застосовується до вашої організації, а не до місця її розміщення. Ви можете просто оголосити себе організацією і зробити це з нею. Існує також проблема URL-адрес, що дозволяють символам, які не можна використовувати в назвах пакетів. Але ми туди не підемо. Тож для вас просто використовуйте "me.user9521" як назву вашого пакета, і ви налаштовані.
Берін Лорич

1
Конвенція стосується не веб-імен, а доменних імен. Ви можете мати домен без веб-сайту.
Девід Торнлі

1

Простори імен / Модулі / Пакети корисні для уникнення конфліктів імен. Так є префіксація імен, але простори імен мають додаткову зручність можливості імпорту символів у поточну область імен, так що вам не доведеться турбуватися з усім простором імен :: *.

Деякі мови (наприклад, Python) розширюють цю здатність, дозволяючи імпортувати лише певні символи у поточний модуль або імпортувати символи як інше ім’я. Це корисно, якщо вас цікавлять лише кілька класів / функцій / констант або якщо деякі символи суперечать символам у вашому просторі імен, а деякі ні.

Деякі мови (наприклад, Ruby) дозволяють включати методи модуля у свій клас. Це корисно для поліморфізму та генериків. Наприклад, якщо у вас є кілька класів, у яких є ітератори, які діють однаково, ви можете змішати методи до всіх цих класів з окремого модуля, який забезпечує методи сортування та фільтрації даних в об'єкті. Це дозволяє has aвідносини, а також is a(спадкові) відносини.

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