В чем разница между идиомой и дизайном? Кажется, что эти термины где-то частично совпадают; где именно, я не знаю. Они взаимозаменяемы? Когда я должен использовать что?
Вот список идиом C ++. Могу ли я назвать их шаблонами дизайна?
Википедия определяет,
Идиома программирования как шаблон проектирования низкого уровня
Что это означает? Что значит «низкий уровень» здесь?
Этот вопрос вдохновлен другим вопросом: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent
Ответы:
Идиома - идея обойти причуды языка. Некоторые примеры, которые приходят на ум, - это любые идиомы C ++, которые вы связали в исходном вопросе. Они решают общую проблему на этом языке постоянным способом.
Шаблон дизайна похож на то, что он решает общую проблему. Но идеальный шаблон дизайна основан на общих чертах языка и, следовательно, не зависит от языка.
Тем не менее, существует неразрывная связь между идиомами и шаблонами проектирования, как и от языков низкого уровня до языков высокого уровня.
Шаблон Visitor является хорошим примером; если бы был только один язык, который поддерживал только одну динамическую диспетчеризацию, то мы могли бы считать шаблон Visitor идиомой этого языка. Но есть целые орды языков, которые напрямую не поддерживают множественную диспетчеризацию. Следовательно, шаблон посетителя родился.
Также на ум приходит шаблон Observer - C # поддерживает его напрямую, поэтому ему не нужна общая обходная форма шаблона.
Примером, идущим в другом направлении, являются ОО-характеристики (наследование, полиморфизм и т. Д.). C не поддерживает их напрямую. Если бы больше языков было похоже на C, то мы могли бы разработать шаблоны проектирования для реализации v-таблиц, безопасности типов и т. Д. Поскольку многие языки поддерживают эту функцию, мы бы назвали любое общее решение в C идиомой, а не называли обобщенное Решение шаблон дизайна.
источник
Шаблоны проектирования обычно не зависят от языка. Языковые идиомы имеют тенденцию зависеть от конкретной особенности языка (или класса языков) или обходить определенный недостаток в указанных языках.
источник
Я бы не стал вкладывать слишком много денег в определение Википедии.
По крайней мере, идиома специфична для языка, тогда как шаблон проектирования стремится или должен стремиться быть независимым от языка. Если пойти дальше, то идиомы обычно являются соглашениями для улучшения читабельности или превосходной альтернативой (по некоторым техническим причинам), когда есть несколько способов сделать что-то. Все эти вещи связаны с тем, как выражаются идеи (ясность, многословие, краткость), но не с самими идеями.
С другой стороны, шаблоны проектирования - это сущность повторяющейся идеи, идеи, которая априори может быть выражена на любых языках, которые ей подходят. Visitor - это реализация двойной отправки, основанная на однократной отправке и перегрузке, и она может использоваться на любом языке, который имеет однократную отправку и перегрузку. Знание шаблона не помогает писать более выразительный или более читаемый код, оно помогает решить связанную с этим проблему. В этом нет ничего идиоматического, потому что, например, в C ++ нет канонической формы Visitor.
источник
virtual
в некоторых местах, тогда как рукописный указатель на хитрость таблицы членов будет выглядеть просто глупо.do_something() or die "...";
(украденный из другого комментария здесь). Он основан на определенных языковых возможностях, но это распространенный способ использования этих функций. Это не кросс-язык, и, вероятно, не будет.Нормальное английское определение языка идиома. Это фраза, общепринятое значение которой не содержится в используемых словах. Примерами могут быть «Дождь кошек и собак» или «Где говядина?»
В языках программирования это обычно относится к синтаксическому ярлыку, который делает что-то не сразу очевидное из самого кода, но который используется достаточно часто, чтобы другие программисты сразу понимали смысл.
Perl, пожалуй, самый богатый язык. С такими конструкциями, как:
Чей смысл очевиден для опытного программиста Perl, но загадка для всех остальных
источник
do_something() or die "arrrrgh!";
Идиомы зависят от языка. Например
while (*dest++=*src++);
, это идиома C / C ++. Совершенно невозможно написать что-то похожее на Паскале или Java. Используйте слово "идиома", как вы используете его на английском языке. "Как дела?" как приветствие это идиома. Некоторые языки, такие как немецкий и французский, имеют одинаковую идиому. Но многие другие языки не будут «спрашивать» что-то вроде этого в качестве приветствия. Шаблон (объектно-ориентированный), с другой стороны, обычно может быть адаптирован к любому языку, который поддерживает наследование и делегирование. Идиома может быть такой же простой, как одна строка кода. Шаблон дизайна всегда включает в себя несколько классов.источник
A idiom might be as simple as one line of code. A design pattern always involves several classes.
Я нашел этот пост в поиске распространенных идиом C ++, так как в последнее время я довольно глубоко углубился в него и хотел бы, чтобы мой код выглядел не так, как мне кажется, любительским ... :-P
Проведя довольно много времени с Perl, я обнаружил, что идиомы на этом языке очень похожи на идиомы на естественных языках, таких как английский или испанский (только двух я знаю достаточно хорошо, чтобы знать некоторые идиомы).
Я не согласен с тем, что идиома похожа на «маленький шаблон дизайна». Я все еще не согласен, хотя и менее, что идиома - это способ обойти недостатки в языке.
Возможно , ответ Люка Дантона наиболее близок, но позвольте мне объяснить. Я думаю, что идиома, ну идиоматическая из тех, кто использует язык. Обычно это общее выражение или последовательность выражений, которые, хотя, возможно, и не очевидны, выполняют операцию или выражают намерение таким образом, который имеет смысл для тех, кто достаточно бегло , чтобы увидеть это раньше.
Возвращаясь к Perl, возможно, самая известная идиома - это « преобразование Шварца », выражение, которое выполняет сортировку данных компактным и эффективным способом. Это не самый очевидный способ выполнить такую операцию, но она лаконична, и те, кто видел ее раньше, сразу же знают, что она делает.
Еще одним примечательным примером является « Маневр Орка », который использует в Perl представления об истинных / ложных, богатых операторах и приоритетах операторов.
Тот, который мне лично очень нравится, в некоторой степени связан с маневром орков, но я не знаю его названия:
Это действительно не запутывание, а скорее ясное, компактное выражение того, что в противном случае заняло бы несколько строк. Если ключ присутствует в хэше и имеет истинное значение, отмените ссылку на него как на массив и вставьте $ some_value в этот массив. Если элемент хеша отсутствует или имеет ложное значение, присвойте ему пустой массив, затем разыменуйте этот массив и выполните push.
Стоит также отметить, что в Perl 5.14 часть этой идиомы устарела - теперь push может работать непосредственно с ссылкой на массив, не нужно @ {}! Также, в Perl 5.10 можно использовать // = вместо || =, что проверяет не правду, а определенность.
источник
some_dict.setdefault(key, []).append(some_value)
.смысл идиомы заключается в том, чтобы быть идеей или концепцией, охватывающей языки программирования, это способ ведения дел и процесс, который работает без особой концептуальной реструктуризации, когда вы берете его из одного и втыкаете в другой, как смиренная сортировка , Шаблоны проектирования - это конкретные реализации идиомы или расширения идеи для встраивания в язык, поэтому у вас есть шаблон проектирования javascript идиомы слушателя событий и т. Д.
источник
Design patterns are specific implementations of an idiom
? Как именно? Вы видели идиомы C ++ в ссылке на мой вопрос?Я не уверен на 100%, но идиомы - это просто термины, относящиеся к определенной области. Когда вы говорите «шаблоны проектирования», вы подразумеваете «шаблон наблюдателя», «цепь ответственности», «шаблон посетителя», «фабрику». Это общие шаблоны, используемые для решения общих проблем в программировании. Смотрите здесь полный список: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns
источник
Я полагаю, это означает, что это не высокоуровневый, абстрактный способ моделирования вашего приложения или компонентов вашего приложения, а вместо этого умное или распространенное использование языковой семантики.
например, установка переменной, если она имеет значение false (обычно используется для условной установки переменных nil):
источник
Вот пример идиомы (в C #) для обработки события. Вы не можете запускать событие, если к нему не подключены какие-либо обработчики, поэтому идиома - всегда проверять это первым.
Поэтому общая идиома для обработки событий становится:
Эта идиома специфична (но не исключительна) для языка C #.
В более общем смысле, однако, механизм событий C # является примером шаблона проектирования наблюдателя, который может быть реализован на любом языке.
источник