В то время как другие, более элегантные решения могут быть лучше использовать, если вы можете, строковые миксины могут быть чрезвычайно полезны. Они допускают как повторное использование кода, так и генерацию кода. Они проверяются во время компиляции. Полученный код точно такой же, как если бы вы написали его вручную, поэтому он не менее безопасен, чем если бы вы написали его вручную.
Проблема со строковыми миксинами состоит в том, что их сложнее контролировать, чем рукописный код, в том смысле, что он не представлен физически в вашем источнике таким же образом, что номера строк четко прослеживаются до ошибок, и это может быть сложнее отлаживать. Например, возьмите hello world со строкой mixin:
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.
Струнные миксины абсолютно безопасны, и в них нет ничего особенного, но в некоторых отношениях они усложняют обслуживание. Соответствующий рукописный код будет легче отлаживать. Тем не менее, строковые миксины достаточно мощны, так что они могут сделать много кода для вас и сэкономить вам много затрат на сопровождение в этом смысле, и они позволяют вам повторно использовать код, что также может быть большим выигрышем от обслуживания.
Так что использование строкового миксина - хорошая идея в конкретной ситуации, зависит от этой ситуации. Я не вижу в них ничего особенно плохого, и, конечно, я бы не назвал их анти-паттернами, но есть и плюсы, и минусы их использования, так что от того, что вы делаете, зависит, хорошая ли это идея. , Во многих случаях существуют более элегантные, более чистые решения, которые были бы лучше. В других это именно то, что доктор прописал.
Лично я считаю, что они фантастичны, если вы хотите сгенерировать код, избавляя себя от необходимости писать этот код вручную и, возможно, упрощая генерацию правильного кода для различных ситуаций и избегая рискуя создавать новые ошибки, как вы могли бы написать сами в каждом из тех мест, где вы использовали миксин. Это также один из способов прямого повторного использования кода без необходимости беспокоиться о стоимости вызова функции или проблемах с ограничениями одиночного наследования или чего-либо еще, что делает повторное использование кода более сложным путем вызова функций или наследования. Вы просто копируете и вставляете код в каждое место таким образом, что если вы измените код, изменения будут правильно вставлены везде, и вам не придется беспокоиться об их отслеживании, как если бы у вас было ручное копирование и вставили.
Итак, используйте строковые миксины, где это уместно, и, вероятно, лучше их не использовать, если они не нужны, но в их использовании нет ничего плохого.