В то время как другие, более элегантные решения могут быть лучше, если вы можете использовать, строковые миксины могут быть чрезвычайно полезными. Они позволяют как повторно использовать код, так и генерировать код. Они проверяются во время компиляции. Полученный код точно такой же, как если бы вы написали его вручную, поэтому он не менее безопасен, чем если бы вы написали его вручную.
Проблема со строковыми примесями заключается в том, что их труднее контролировать, чем написанный от руки код, в том смысле, что он физически не расположен в вашем исходном коде таким же образом, а номера строк четко отслеживаются до ошибок, и его может быть сложнее отлаживать. Например, возьмем hello world со строковым миксином:
import std.stdio;
void main()
{
mixin(hello());
}
string hello()
{
return "
writeln(\"hello world\");
";
}
Если бы мы убрали точку с запятой после writeln()
, то получили бы ошибку
d.d(7): found 'EOF' when expecting ';' following statement
Миксин выполняется в строке 5. Строка 7 — пустая строка. Таким образом, номер строки здесь имеет ограниченную полезность. Теперь этот миксин достаточно короткий, чтобы мы могли поместить его в одну строку и заставить сказать, что ошибка находится в той же строке, что и миксин, но с более сложными миксинами это, очевидно, не сработает. Таким образом, при использовании строкового миксина ваша способность выяснить, где ошибка, снижается. Если код генерируется с использованием CTFE, то становится намного сложнее понять, как именно выглядит код, чтобы выяснить, что с ним не так. Это очень похоже на выяснение того, в какой код превращается макрос в стиле C, за исключением того, что это может быть хуже, потому что они могут быть сгенерированы, а не прямой заменой. Однако они не заменяют, за исключением случаев, когда вы явно указываете им, поэтому они намного безопаснее, чем макросы в стиле C.
Строковые примеси абсолютно безопасны, и в них нет ничего особенно плохого, но в некотором смысле они усложняют обслуживание. Соответствующий написанный от руки код будет легче отлаживать. Тем не менее, строковые примеси достаточно мощны, чтобы генерировать за вас большой объем кода и в этом смысле сэкономить вам много затрат на сопровождение, а также позволяют повторно использовать код, что также может быть большим выигрышем в обслуживании.
Итак, является ли использование строкового миксина хорошей идеей в конкретной ситуации, зависит от этой ситуации. Я не вижу в них ничего особенно плохого, и я, конечно, не назвал бы их анти-шаблоном, но в их использовании есть как плюсы, так и минусы, так что хорошая ли это идея зависит от того, что вы делаете. . Во многих случаях есть более элегантные и чистые решения, которые были бы лучше. В других они именно то, что доктор прописал.
Лично я думаю, что они просто фантастические, если вы хотите генерировать код, избавляя себя от необходимости писать этот код вручную и, возможно, упрощая генерацию правильного кода для различных ситуаций и избегая риска создания нового. ошибки, как если бы вы написали это сами в каждом из тех мест, где вы использовали миксин. Это также один из способов просто повторно использовать код, не беспокоясь о стоимости вызова функции или проблемах с ограничениями одиночного наследования или о чем-либо еще, что затрудняет повторное использование кода путем вызова функций или наследования. Вы просто копируете и вставляете код в каждое место таким образом, что если вы измените код, изменения будут правильно вставлены везде, и вам не придется беспокоиться об отслеживании их всех, как если бы вы вручную копировали и наклеено.
Итак, используйте строковые примеси там, где это уместно, и, вероятно, лучше не использовать их, если они не нужны, но в их использовании нет ничего плохого.
person
Jonathan M Davis
schedule
21.07.2010