Идиома (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Идиома программирования — устойчивый способ выражения некоторой составной конструкции в одном или нескольких языках программирования. Идиома является шаблоном решения задачи, записи алгоритма или структуры данных путём комбинирования встроенных элементов языка.

Идиому можно считать самым низкоуровневым шаблоном проектирования, применяемым на стыке проектирования и кодирования на языке программирования. Идиома предписывает конкретный способ реализации определённых деталей и отношений между ними средствами конкретного языка. Набор идиом зависит от языка программирования, и одна и та же идиома может выглядеть в двух разных языках по-разному, либо в ней может не быть надобности в одном из них[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);

Бесконечный цикл[править | править вики-текст]

Pascal:

  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;

Python:

    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. Позиция Шоу состоит в том, что изучающие языки программирования должны изучать не только идиомы конкретного языка программирования, но и альтернативные способы кодирования — это позволяет избежать индоктринации облегчает переход на другие языки.

См. также[править | править вики-текст]

Ссылки[править | править вики-текст]

Примечания[править | править вики-текст]

  1. 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.
  2. Design Patterns in Haskell
  3. Peter Norvig — Design Patterns in Dynamic Languages (slides)
  4. Zed A. Shaw, Programming Languages Have Social Mores Not Idioms
  5. Ruby Styleguide (англ.)