これは間違いなく反射の目的ではありません。実際、ここには多くの問題があるようです。ここで確認してみましょう - 次のメソッドを変更します。
public void ChangeColor(int RGBValue)
{
switch(...)
{
case ...
case ...
case ...
}
}
このようなものに:
public void ChangeColor(int RGBValue)
{
thisColor.{something-from-RGBValue} += 5;
}
これに関する問題は次のとおりです。
メソッドの名前 は、メソッドが実際に何をするかを正確にChangeColor
表していません。おそらくこれは匿名化の成果物ですが、それでもこのメソッドの名前はひどいものです。
パラメーター は、引数の内容または動作を正確に説明RGBValue
していません。名前とタイプから、実際の RGB カラー値のように聞こえます。つまり、水色は 0x33ccff です。代わりに、R、G、または B のどれを設定するかを選択します。RGBValue
int
パラメータの有効な値は 3 つだけですが、可能な値の範囲は完全に制限されていません。これはバグのレシピです。さらに悪いことに、個々の値はメソッド内でマジック ナンバーとして使用されます。
しかし、おそらく最も重要なのは、あなたが求めている「クリーン/クイックメソッド」は、まさにこのメソッドが提供しようとしている抽象化です! 色相を強調するメソッドを書いていますが、メソッドを短くするために、色相を強調するメソッドを求めています。意味がありません!
たとえば、次のように、色に対して実行したいことがたくさんあるため、これを実行したいと思います。
public void Brighten(...) { ... }
public void Darken(...) { ... }
public void Desaturate(...) { ... }
public void Maximize(...) { ... }
などなど。そして、あなたはswitch
すべての人のために声明を書くことを避けようとしています.
switch
結構ですが、完全に排除しないでください。これは、このコードを記述する最も効率的で読みやすい方法です。より重要なことは、それを多数ではなく1 つ に絞り込み、switch
上記の他の問題を修正することです。int
まず、列挙型を作成する代わりに、適切なパラメーター型から始めましょう。
public enum PrimaryColor { Red, Green, Blue };
ここで、合成色の原色の 1 つに対して実行したい多くのアクションがある可能性があるという考えから始めて、汎用メソッドを記述します。
protected void AdjustPrimaryColor(PrimaryColor pc, Func<byte, byte> adjustFunc)
{
switch (pc)
{
case PrimaryColor.Red:
internalColor.R = adjustFunc(internalColor.R);
case PrimaryColor.Green:
internalColor.G = adjustFunc(internalColor.G);
default:
Debug.Assert(pc == PrimaryColor.Blue,
"Unexpected PrimaryColor value in AdjustPrimaryColor.");
internalColor.B = adjustFunc(internalColor.B);
}
}
このメソッドは短く、読みやすく、おそらく変更する必要はありません。それは良い、きれいな方法です。これで、個々のアクション メソッドを非常に簡単に記述できます。
public void Brighten(PrimaryColor pc)
{
AdjustPrimaryColor(pc, v => v + 5);
}
public void Darken(PrimaryColor pc)
{
AdjustPrimaryColor(pc, v => v + 5);
}
public void Desaturate(PrimaryColor pc)
{
AdjustPrimaryColor(pc, v => 0);
}
public void Maximize(PrimaryColor pc)
{
AdjustPrimaryColor(pc, v => 255);
}
これに対する(重要な)利点は次のとおりです。
列挙型は、呼び出し元が失敗して無効なパラメーター値を渡すのを防ぎます。
一般的なAdjust
方法は読みやすいため、デバッグや保守が容易です。また、リフレクションベースまたはディクショナリベースのアプローチよりも優れたパフォーマンスを発揮します。ここでパフォーマンスが問題になる可能性はありませんが、主にこれを言っているのは、確かに悪化することはないということです.
switch
繰り返しステートメントを書く必要はありません。個々の修飾子メソッドは、正確に 1 行です。
最終的には、どこかで実際にコードを書かなければならなくなりますが、コードはswitch
、リフレクション、デリゲート、辞書などの混乱よりも、非常に単純なステートメントである方がよいでしょう。重要なのは、この作業を可能な限り一般化することです。可能; それを行ってその抽象化を作成したら、「実際の」作業を行うためのワンライナー メソッドを書き始めることができます。