Я понимаю, что «идиома» - это обычная операция или шаблон, который на определенном языке не упрощается синтаксисом основного языка, например, целочисленным шагом:
i = i + 1;
В C ++ эта идиома упрощается оператором:
++i;
Однако, когда кто-то использует термин «идиоматический», я не уверен, как это понимать. Что делает кусок кода "идиоматическим"?
Ответы:
Идиоматический способ написания некоторого кода - это когда вы пишете его очень специфическим образом из-за языковых идиом, которых нет в других языках.
Например, в C ++ использование идиомы RAII приводит к написанию кода для C ++, который управляет идиоматическими ресурсами.
Другим примером может быть использование списков в Python для генерации списков. Это идиоматично, потому что вы использовали бы понимание списка в идиоматическом Python, но вы могли бы сделать то же самое, используя функцию генератора на любом другом языке или даже в Python.
Часто тот, кто пробует новый язык без использования специфических для этого языка идиом, не будет писать идиоматический код.
источник
TryAdd()
для общегоDictionary
класса, чтобы сначала проверить,!Contains()
а затем вызватьAdd()
, это было бы идиоматично? Я использую особенность методов расширения C #.Нормальное определение
Определение программирования
источник
Идиоматика в контексте программирования обычно может быть определена как «наиболее естественный способ выразить что-либо на языке»
Я вижу, что идиоматическое слово особенно часто встречается в Ruby. В Ruby имеются широкие возможности метапрограммирования, и для написания идиоматического кода на Ruby вы обычно должны их использовать.
Обратите внимание, что только то, что фрагмент кода является идиоматическим, не означает, что он чистый или даже лаконичный. Много раз вы должны идти на компромиссы.
Таким образом, в основном идиоматический чаще всего относится к наиболее распространенному способу написания чего-либо на языке, часто в том числе «сленг» (идиомы). Если фрагмент кода не является идиоматическим, он может быть отлично читаемым, кратким, чистым и правильным, но он может выглядеть / выглядеть неловко на используемом языке. Это предпочтение вкуса в отношении того, будет ли переписывание такого фрагмента кода идиоматически действительно полезным и должно оцениваться в каждом отдельном случае.
Например, идиоматический английский может зависеть от региона. Использование этого слова
bum
, вероятно, требуется для идиоматического английского в Великобритании, тогдаbutt
как больше подходит для английского в США. (Я не знаю много британского английского, к сожалению: /)источник
Лучший пример, который я могу придумать, идиотизм, для чего-то идиоматического, - это Ruby.
На множестве языков вы можете выполнять итерации с помощью:
Или что-то очень похожее. Многие языки также имеют
foreach(x in SetOfXes)
конструкцию. Но итерация для Ruby включает в себя такие вещи, как:и даже
Я считаю их идиоматическими, потому что они представляют собой способ сделать что-то менее распространенное, и это представляет собой нечто в основе философии своей области. У Ruby есть философия взаимодействия с объектами, которая, хотя и не уникальна, не является вездесущей.
На семантической ноте, когда я слышу слово «идиоматический», мой мозг автоматически завершает мысль как «идиоматический для ...» - я просто рефлексивно разбираю его как относящийся к определенному предмету.
источник
collection.each do |current|
отличается отforeach(current in collection)
? Оба являются циклами, которые устанавливаютсяcurrent
для каждого элементаcollection
.Идиомы обычно являются наилучшим из возможных способов выражения общей, относительно сложной ситуации в языке. Увеличение не идиома или что-то в этом роде. Используя префикс приращения вместо постфикса, можно утверждать, что это идиома C ++.
Идиомы - лучший способ использовать язык, как определено опытными пользователями. Настоящая идиома C ++ - это функциональные объекты. Другой идиомой был бы RAII. В языке нет ничего, что говорило бы вам о том, что вы должны освободить ресурсы в деструкторе. Но это идиоматично. Другой пример - шаблоны - идиоматично использовать шаблоны для всего, что вы можете, но ничто не мешает вам чрезмерно использовать наследование.
источник
Ваше определение не кажется мне правильным. Идиома - это способ написать что-то, что может или не может быть возможным на других языках, но это является обычным явлением в этом языке. Обычно это короче, чем альтернатива, но это не является обязательным требованием.
Это может быть проще объяснить, говоря о том, что не является идиоматическим. В C ++ довольно идиоматично писать:
Еще более идиоматично писать:
Этот код делает то же самое - некоторые новички в C ++ могут прочитать его как тестирование, чтобы увидеть, равно ли p тому, что возвращает функция, но это не то, что она делает.
Сравните с тем, что кто-то может написать, совсем не идиоматически, кто пришел с другого языка:
Вы также увидите, что эти вещи выбиты как не-идиоматические:
Потому что идиоматический подход
Неидиоматические способы не являются неправильными, но они обычно занимают больше времени, чтобы печатать, и они всегда занимают больше времени, чтобы читать, для тех, кто знает идиомы. Если я назову вас «мальчиком, который плакал волком», и вы узнаете историю, это будет быстрее, чем если бы я объяснил, как ложные тревоги заставляют людей игнорировать вас. Проблема, конечно, в том, что если вы не знаете историю и не знаете, как волки связаны с тем, о чем мы говорим. Точно так же это может быть проблемой, если вы никогда не видели
return x<y;
раньше и действительно не знаете, что он делает.источник
if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
Когда есть несколько способов выразить что-либо, наиболее распространенный или общепринятый способ. Например, используя структурированный оператор в C вместо точного эквивалента, используя операторы goto.
источник