Думки про псевдоніми / синоніми типу?


10

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

Різні мови в різному ступені підтримують псевдоніми типів. C # дозволяє псевдоніми типів оголошувати на початку кожного файлу коду, і вони дійсні лише у всьому цьому файлі. Такі мови, як ML / Haskell, використовують псевдоніми типу, ймовірно, настільки ж, наскільки вони використовують визначення типів. C / C ++ є на зразок Дикого Заходу, typedefі #defineчасто використовується, здавалося б, взаємозамінно для псевдонімів.

Зовнішні типи псевдоніму не викликають занадто великих суперечок:

  • Це дозволяє зручно визначати складові типи, які природно описані мовою, наприклад, type Coordinate = float * floatабо type String = [Char].
  • Довгі імена можуть бути скорочені: using DSBA = System.Diagnostics.DebuggerStepBoundaryAttribute.
  • У таких мовах, як ML або Haskell, де параметри функцій часто не мають імен, псевдоніми типів надають вигляд самодокументації.

Мінус - дещо складніший: псевдоніми можуть поширюватися, утрудняючи читання та розуміння коду чи вивчення платформи. API Win32 - хороший приклад, DWORD = intі його, HINSTANCE = HANDLE = void*і його, LPHANDLE = HANDLE FAR*і таке. У всіх цих випадках навряд чи має сенс розрізняти HANDLE та недійсний покажчик або DWORD та ціле число тощо.

Якщо відмовитись від філософської дискусії про те, чи повинен король дати повну свободу підданим, і нехай вони будуть відповідальні за себе чи чи слід втручатися у всі їх сумнівні дії, чи може бути щасливий засіб, який би дозволив отримати переваги згладжування типу? пом'якшення ризику його зловживань?

Наприклад, питання довгих імен можна вирішити за допомогою хороших функцій автозаповнення. Наприклад, Visual Studio 2010 дозволить вам ввести DSBA, щоб віднести Intellisense до System.Diagnostics.DebuggerStepBoundaryAttribute. Чи можуть бути інші особливості, які б безпечніше забезпечували інші переваги типу сшивання?


Інтеллісенс чи ні, System.Diagnostics.DebuggerStepBoundaryAttribute набагато менш читабельний у коді, ніж DSBA, особливо коли він використовується часто.
zvrba

@zvrba: на самому справі, DebuggerStepBoundaryAttributeнабагато більш читабельним , ніж DSBA. У першому випадку ви знаєте, що це означає. У другому ви поняття не маєте. Тепер уявіть, що ви використовуєте в коді двадцять різних псевдонімів. Хто-небудь матиме достатньо сміливості, щоб спробувати прочитати і зрозуміти ваш код?
Арсеній Мурценко

Відповіді:


3

На думку мені приходять дві особливості:

Переносність. У таких мовах , як C, де типи дані , як intце від платформи, псевдонім , як DWORDробить його легше переконатися , що ви дійсно використовуєте 32bit підписаного цілого всюди, коли це є вимогою для вашої програми, навіть якщо порт програма на Plattform , де intзнаходиться наприклад, 16-бітний без підпису і тому DWORDмає бути псевдонімом signed long.

Абстракція. У своїй програмі ви можете використовувати безліч цілих чисел із числами з плаваючою комою для різних цілей. Створюючи псевдоніми , як SPEED, HEIGHT, TEMPERATURE, це відносно легко змінити один з тих , хто , наприклад , від floatдо doubleі залишити іншим , як вони є.


Це не відповідає на питання, хоча ...
Rei Miyasaka

@Rei, ви праві, що ammoQ не відповів на питання, але дійсно прокоментував його. Тим не менш, P.SE не допускає форматованих чи довгих коментарів ... Я думаю, що він не заслуговує голосу: його коментар є темою і хорошим.
Андо

@Andrea це, мабуть, не є результатом того, щоб прочитати питання в повному обсязі; окрім примітки про переносимість (що є лише ще одним пунктом, який слід внести до списку переваг), це лише перерахунок.
Рей Міясака

2

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

Я думаю, що середовище Happy буде типовим безпечним typedefs, ймовірно, що дозволяє явне перетворення між реальним типом і typedef, але запобігає імплікаційному перетворенню.

тобто головна проблема, яку я бачу з typedefs у багатьох мовах, - це те, що вони насправді не вводять новий тип, а просто псевдонім, хоча це корисно, це не так корисно, як новий тип, як старий тип, але з новим назва. А склад або спадщина занадто важкі, якщо ви хочете лише переконатися, що ви не змішуєте пару змінних.


1
Я не міг погодитися більше, мені дуже хотілося б бачити такий «обмежений» поліморфізм. Якщо type Name = String, тоді Stringне можна передати функцію, очікувану a Name, але можлива зворотна.
Матьє М.

1

Я думаю, що псевдоніми типів дають ледачому програмісту (дуже) дешеву інкапсуляцію. Тож можливо альтернативою може бути просто використання правильної (дорогої) інкапсуляції.

Існує також аргумент, що перший також набагато більш оптимізований для машини / мови, що використовується, ніж останній.

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