这绝对不是反射的目的。事实上,这里似乎存在许多问题。让我们在这里回顾一下 - 您想要更改以下方法:
public void ChangeColor(int RGBValue)
{
switch(...)
{
case ...
case ...
case ...
}
}
变成这样:
public void ChangeColor(int RGBValue)
{
thisColor.{something-from-RGBValue} += 5;
}
这样做的问题是:
方法的名称ChangeColor
, 并没有准确地描述该方法的实际作用。也许这是匿名化的产物,但对于该方法来说,它是一个可怕的名称。
参数 ,RGBValue
不能准确地描述参数是什么或做什么。名称RGBValue
和类型int
使它听起来像一个实际的 RGB 颜色值,即 0x33ccff 表示浅蓝色。相反,它选择将设置 R、G 或 B 中的哪一个。
该参数只有 3 个有效值,但可能值的范围完全不受限制。这是错误的秘诀。更糟糕的是,单个值在方法中被用作幻数。
但也许最重要的是,您所要求的“干净/快速方法”正是该方法声称提供的抽象! 您正在编写一种增强色调的方法,为了保持方法简短,您要求......一种增强色调的方法。这没有意义!
我只能假设您想要这样做,因为您可能想要对颜色执行许多不同的操作,例如:
public void Brighten(...) { ... }
public void Darken(...) { ... }
public void Desaturate(...) { ... }
public void Maximize(...) { ... }
等等等等。而且你试图避免switch
为所有人写声明。
很好,但不要完全消除switch
;这是迄今为止编写此代码的最有效和最易读的方式!更重要的是把它提炼成一个 switch
而不是多个,并解决上面提到的其他问题。首先,让我们从一个合理的参数类型开始,而不是int
- 创建一个枚举:
public enum PrimaryColor { Red, Green, Blue };
现在,从我们可能想要对复合颜色的一种原色执行许多操作的想法开始,因此编写通用方法:
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);
}
这样做的(显着)优点是:
最终,在某个地方,您实际上将不得不编写一些代码,我更希望代码是一个极其简单的switch
语句,而不是一团糟的反射、委托、字典等。关键是尽可能概括这项工作可能的; 一旦你完成了这些并创建了那个抽象,那么你就可以开始编写单行方法来完成“真正的”工作。