可能であれば、他のよりエレガントなソリューションを使用する方がよい場合もありますが、ストリングミックスインは非常に便利です。これらは、コードの再利用とコード生成の両方を可能にします。それらはコンパイル時にチェックされます。結果として得られるコードは、自分で手書きした場合とまったく同じであるため、自分で手書きした場合と同じくらい安全です。
文字列ミックスインの問題は、エラーまで明確に追跡可能な行番号と同じようにソースに物理的に配置されていないという意味で、手書きのコードよりも制御が難しく、デバッグが難しい場合があることです。たとえば、文字列ミックスインを使用してhelloworldを取得します。
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行目は空白行です。したがって、ここでは行番号の有用性は限られています。さて、このミックスインは十分に短いので、1行に配置して、エラーはミックスインと同じ行にあると言うことができますが、より複雑なミックスインでは、明らかに機能しません。したがって、ストリングミックスインを使用すると、エラーがどこにあるかを把握する能力が損なわれます。コードがCTFEを使用して生成された場合、コードの何が問題になっているのかを把握するために、コードがどのように見えるかを正確に把握することは非常に困難になります。これは、Cスタイルのマクロがどのコードに変わるかを理解するのとよく似ていますが、直接置き換えるのではなく生成される可能性があるため、さらに悪い場合があります。ただし、明示的に指示した場合を除いて、それらは置き換えられないため、
ストリングミックスインは完全に安全であり、特に問題はありませんが、いくつかの点でメンテナンスが難しくなります。対応する手書きのコードは、デバッグが簡単です。ただし、文字列ミックスインは十分に強力であるため、多くのコード生成を実行でき、その意味で多くの保守コストを節約できます。また、コードを再利用できるため、保守の大幅な向上にもなります。
したがって、特定の状況で文字列ミックスインを使用することが適切かどうかは、その状況によって異なります。私はそれらに特に悪いことは何も見ていません、そして私は確かにそれらをアンチパターンとは呼びませんが、それらを使用することには賛否両論があり、それらが良いアイデアであるかどうかはあなたがしていることに依存します。多くの場合、よりエレガントでクリーンなソリューションがあります。他では、それらはまさに医者が注文したものです。
個人的には、コードを生成することを検討している場合、それらは素晴らしいと思います。手作業でそのコードを作成する手間を省き、さまざまな状況で正しいコードを生成しやすくし、新しいコードを作成するリスクを回避できます。ミックスインを使用した場所のそれぞれで自分で書いたかもしれないようなバグ。これは、関数呼び出しのコストや、単一継承の制限など、関数や継承を呼び出すことによってコードを再利用するのを困難にする問題を気にせずに、コードを完全に再利用する方法の1つでもあります。コードを変更した場合に、コードを変更した場合に、コードをコピーして各場所に貼り付けるだけです。
したがって、必要に応じて文字列ミックスインを使用します。不要な場合は使用しないのがおそらく最善ですが、実際に使用しても問題はありません。