Идиома (программирование)
Идиома программирования — устойчивый способ выражения некоторой составной конструкции в одном или нескольких языках программирования. Идиома является шаблоном решения задачи, записи алгоритма или структуры данных путём комбинирования встроенных элементов языка.
Идиому можно считать самым низкоуровневым шаблоном проектирования, применяемым на стыке проектирования и кодирования на языке программирования. Идиома предписывает конкретный способ реализации определённых деталей и отношений между ними средствами конкретного языка. Набор идиом зависит от языка программирования, и одна и та же идиома может выглядеть в двух разных языках по-разному, либо в ней может не быть надобности в одном из них[1].
Идиома может представлять собой воспроизведение в языке элементов семантически иного языка, которые в данном языке тоже могут быть применимы, но не провоцируются самим языком (то есть не входят в число его идиом). С этой позиции многие шаблоны в объектно-ориентированном проектировании рассматриваются как идиоматическое воспроизведение элементов функциональных языков[2][3].
Примеры простых идиом
Инкремент
В языках типа BASIC идиома для единичного приращения значения переменной выглядит так:
i = i + 1
Укороченный вариант в C-подобных языках:
i += 1; /* i = i + 1; */
++i; /* тот же результат */
i++; /* тот же результат */
Pascal содержит процедуру аналогичного назначения:
i := i + 1;
Inc(i); (* тот же результат *)
Обмен значениями (swap)
В большинстве языков обмен значениями между двумя переменными выглядит следующим образом:
temp = a;
a = b;
b = temp;
В Perl это выглядит элегантнее:
($a, $b) = ($b, $a);
Бесконечный цикл
while true do begin
do_something();
end;
В C-подобных языках есть много способов организации бесконечных циклов, но нижеследующий пример наиболее очевидным образом показывает это:
for (;;) {
do_something();
}
Perl поддерживает как C-синтаксис, так и другие варианты:
do_something() while (1); # укороченный бесконечный цикл
while (1) { do_something() }; # аналогично
# Using a "naked block" and the redo operator
{
do_something();
redo;
}
Ada:
loop
do_something;
end loop;
while True:
do_something()
Выборка из ассоциативного массива
Во многих языках имеется реализация ассоциативного массива, т. н. хеш-таблица.
Реализация ассоциативного массива в Perl:
my %elements = map { $_ => 1 } @elements;
Критика
Автор книги «Learn Ruby The Hard Way» Зед Шоу отмечает, что отношение к идиомам в сообществах разработчиков говорит о том, что применение идиом следует отнести к категории нравов, так как при письме на естественном языке, требующем чёткости изложения, идиом следует избегать[4]. Им приводится следующий пример из «Ruby Styleguide»[5]:
arr = [1, 2, 3]
# bad
for elem in arr do
puts elem
end
# good
arr.each { |elem| puts elem }
Использование цикла for, согласно официальному стилю Ruby, не приветствуется, а вместо него следует использовать конструкцию .each
. Позиция Шоу состоит в том, что изучающие языки программирования должны изучать не только идиомы конкретного языка программирования, но и альтернативные способы кодирования — это позволяет избежать индоктринации и облегчает переход на другие языки.
См. также
Ссылки
- C++ programming idioms (англ.) в Wikibooks.
- Moshe Zadka, Idioms and Anti-Idioms in Python (англ.)
Примечания
- Buschmann, F. and Meunier, R. and Rohnert, H. and Sommerlad, P. and Stal, M. Pattern-Oriented Software Architecture, A System of Patterns. — Wiley, 2013. — 350 p. — ISBN 9781118725269.
- Design Patterns in Haskell
- Peter Norvig — Design Patterns in Dynamic Languages (slides)
- Zed A. Shaw, Programming Languages Have Social Mores Not Idioms (недоступная ссылка)
- Ruby Styleguide (англ.)