Відмінність ідіоми від дизайну?


39

Чим відрізняється ідіома від дизайну? Здається, ці термінології десь перетинаються; де саме, я не знаю. Вони взаємозамінні? Коли я повинен використовувати що?

Ось список ідіом C ++. Чи можу я назвати їх моделями дизайну?

Вікіпедія визначає,

Програмування ідіоми як модель дизайну низького рівня

Що це означає? Що тут означає "низький рівень" ?

Це питання наштовхується на інше запитання: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent


На практиці розрізнення може бути важко визначити (а між ідіомою та схемою дизайну може бути певний континуум). Але це, ймовірно, походить від терміна "ідіома" на природній мові: en.wikipedia.org/wiki/Idiom (що насправді не відповідає використанню).
Мерлін Морган-Грем

2
Це, мабуть, краще підходить програмістам SE.
Олівер Чарльворт

3
@Nawaz: "Шаблон дизайну" є відносно "високим рівнем" конструкції навколо мовного дефекту. «Ідіома» - відносно «низький рівень» конструкції навколо дефекту мови; )
Св. Тристан

@ Nawaz- +1 для гумору.
Jennifer S

Відповіді:


30

Ідіома - це ідея обійти химерність мови. Деякі приклади, які приходять вам на думку, - це будь-яка з ідіом C ++, з якими ви пов’язані в оригінальному запитанні. Вони вирішують загальну проблему на цій мові консервованим способом.

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

Між ідіомами та моделями дизайну існує континуум, як і від мов низького рівня до високого рівня.

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

Пам’ятка Observer також приходить до тями - C # безпосередньо підтримує її, тому йому не потрібна загальна обхідна форма шаблону.

Прикладом іншого напрямку є особливості ОО (спадкування, поліморфізм тощо). C безпосередньо не підтримує їх. Якби більше мов були схожими на C, ми могли б розробити схеми дизайну для впровадження v-таблиць, безпеки типу тощо. Оскільки багато мов підтримують цю функцію, ми б називали будь-яке загальне рішення на C ідіомою, а не називати узагальнену вирішити схему дизайну.


2
Ще один цікавий приклад: вільні API синтаксису. Вони компенсують той факт, що у вас немає прямої підтримки DSL у вашій мові, і це переходить через мовні межі. Я не впевнений, що він перейшов до статусу "Шаблон дизайну", і він звучить як синтаксична ідіома ...
Мерлін Морган-Грем

Той факт , що C # безпосередньо підтримує шаблон Observer , здавалося б, свідчить про те , що робить мати величезну потребу в моделі, так що вона перейшла реалізацію від розробників і в самій мові.
jaco0646

@ jaco0646 Я переформулював цей рядок, можливо, буде більш зрозумілим
Мерлін Морган-Грем

37

Шаблони дизайну зазвичай не є специфічними для мови. Мовні ідіоми, як правило, залежать від певної особливості мови (або класу мов) або вирішують певний дефіцит зазначеної мови.


+1 - намалювати відмінність з кількома словами та кількома неточностями.
Мерлін Морган-Грем

1
@Merlyn Morgan-Graham: Ви прокоментували майже всі відповіді, включаючи питання. То чому б вам не розмістити детальну відповідь, не маючи неточностей ? Я хотів би дізнатися ваші думки.
Наваз

1
@Nawaz: коментар стосувався інших відповідей. Цей вже майже ідеальний. В ідеалі я хотів би відповіді зразків, але, схоже, ніхто їх не виправив. Я, мабуть, не міг інакше, інакше я б із задоволенням зобов’язався :)
Мерлін Морган-Грем

@Nawaz: Гаразд, я все одно зробив знімок :)
Мерлін Морган-Грем

12

Я б не вкладав занадто багато валюти у визначення Вікіпедії.

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

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


1
+1; Гарна відповідь. Того я схильний вірити всьому тут, крім останнього шматочка. Є мови, які мають пряму підтримку для багаторазового відправлення, тому шаблон відвідувачів там не потребує існування. З їх точки зору, "візерунок" може бути більше ідіомою. З точки зору вищого рівня, всі зразки можуть стати ідіомами ...
Мерлін Морган-Грем

@Merlyn Що ідіоматичне в повторному застосуванні першокласної функції мови? Хто це робить?
Люк Дантон

В тім-то й річ. Користувачі цієї мови вважають ідіому "схемою дизайну", оскільки мова їх крутіша :)
Мерлін Морган-Грем

@Merlyn Це не відповідає моєму використанню ідіоми. Ідіома мови - це те, чого ви очікуєте від розпізнавання випадкового, досвідченого користувача мови; повторна реалізація першокласної функції буде виглядати чужою і непомітною. Немає ідіоми C ++ для одноразового відправлення, її просто використовують virtualу деяких місцях, тоді як рукописний вказівник на таблицю підступників для членів буде виглядати просто нерозумно.
Люк Дантон

1
Мені подобається, куди ти йдеш, коли визначення ідіоми відрізняється від "схеми дизайну бідної людини", яка є такою, як моя модель ставиться до цього (див. Мою відповідь). Менше "ось як це втілити в життя" і більше "тут правильний спосіб цього здійснити". Наприклад, я не можу уявити, що "Велика трійка" перетворюється на модель дизайну. І тут є синтаксичний компонент, наприклад do_something() or die "...";(вкрадений з іншого коментаря тут). Він заснований на конкретних мовних особливостях, але це звичайний спосіб використання цих функцій. Це не мовна мова, і, мабуть, не буде.
Мерлін Морган-Грехем

6

Нормальне визначення англійської мови Idiom. Це фраза, прийняте значення якої не міститься у вживаних словах. Прикладами можуть бути "Дощові коти та собаки" або "Де яловичина?"

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

Perl - чи не найбагатша мова. З такими конструкціями:

while (<IN>) {
    print $_
}

Чий сенс очевидний для досвідченого програміста Perl, але загадка для будь-кого іншого


Я думаю, "де яловичина" - це більше мем, ніж ідіома. Можливо, там буде інший континуум;) Ідіома може бути більше, ніж просто реалізацією в мові, оскільки речі можуть бути частковими або невдалими реалізаціями цієї ідіоми - наприклад, «Велика трійка» C ++. У цьому випадку ідіома - це назва та опис "Великої трійки".
Мерлін Морган-Грем

2
Перл має найкращі ідіоми -do_something() or die "arrrrgh!";
cxfx

2

Ідіоми є мовними. Наприклад, while (*dest++=*src++);ідіома C / C ++. Зовсім неможливо написати щось віддалено схоже на Pascal або Java. Вживайте слово "ідіома" так, як ви його використовуєте англійською мовою. "Як справи?" як привітання - це ідіома. Деякі мови, як німецька та френська, мають однакову фразу. Але багато інших мов не будуть "просити" щось подібне як привітання. З іншого боку, (об'єктно-орієнтований) візерунок зазвичай може бути адаптований до будь-якої мови, яка підтримує успадкування та делегування. Ідіома може бути такою ж простою, як і один рядок коду. Шаблон дизайну завжди включає кілька класів.


+1. Хороший момент:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Наваз

2

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

Провівши зовсім небагато часу з Perl, я виявив ідіоми на цій мові подібні до тих, що зустрічаються на природних мовах, наприклад, англійській чи іспанській (лише двох я досить добре знаю, щоб знати деякі ідіоми).

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

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

Назад до Perl, можливо, найвідомішою ідіомою є " Трансформація Шварца ", вираз, який виконує сортування даних компактно та ефективно. Це не найочевидніший спосіб здійснити таку операцію, але це лаконічно, і ті, хто її бачив раніше, миттєво знають, що вона робить.

Ще одним помітним прикладом є " Маневри Оркіша ", який використовує переваги уявлень Perl про справжні / хибні, багаті оператори та пріоритет оператора.

Те, що мені особисто дуже подобається, дещо пов’язане з маневром оркішів, але я не знаю цього імені:

push @{ $some_hash{$key} ||= [] }, $some_value;

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

Варто також зазначити, що станом на Perl 5.14 частина цієї ідіоми застаріла - тепер функція push може працювати безпосередньо на посилання на масив, ні @ {} не потрібно! Також, на Perl 5.10, можна використовувати // = замість || =, що перевіряє не на істинність, а на визначені.


в пітоні : some_dict.setdefault(key, []).append(some_value).
Йонас Келькер

0

суть ідіоми - це ідея чи концепція, яка охоплює мови програмування, це спосіб робити речі та процес, який працює без особливої ​​концептуальної перебудови, коли ви берете його з одного і вставляєте в інше, як низькорозвистий міхур . Шаблони дизайну - це конкретні втілення ідіоми або розширення ідеї, яка вписується в мову, тому ви маєте шаблон дизайну javascript в ідіомі слухача події тощо.


Слухач подій - це мовна функція, яка реалізує сигнал / слоти (шаблон?) або шаблон спостерігача. Також у C ++ є речі, що називаються ідіомами, які просто не мають значення або не вміщуються в інших мовах (наскільки я знаю) - наприклад, ідіома копіювання та заміни.
Мерлін Морган-Грем

Design patterns are specific implementations of an idiom? Як саме? Ви бачили ідіоми C ++ за посиланням у моєму запитанні?
Наваз

0

Я не впевнений на 100%, але ідіоми - це просто терміни, що стосуються певного поля. Коли ви говорите "шаблони дизайну", ви думаєте про "Шаблон спостерігача", "Ланцюг відповідальності", "Шаблон відвідувачів", "фабрика". Це загальні зразки, які використовуються для вирішення загальних проблем у програмуванні. Тут ви знайдете повний список: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

Що це означає? Що тут означає "низький рівень"?

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

наприклад, встановлення змінної, якщо вона оцінюється як false (зазвичай використовується для умовного встановлення змінних нуля):

var ||= some_default_value

0

Ось приклад ідіоми (в C #) для обробки події. Вам не дозволяється запускати подію, якщо до неї не додано жодних обробників, тож ідіома завжди завжди перевіряти це.

Тому загальною ідіомою поводження з подіями стає:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

Ця ідіома є специфічною (хоча й не винятковою) мовою C #.

Однак у більш загальному випадку механізм події C # є прикладом моделі дизайну спостерігача, яка може бути реалізована будь-якою мовою.

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