有没有更好的方法来编写这个代码
本文关键字:代码 更好 方法 有没有 | 更新日期: 2023-09-27 17:58:49
我有一个枚举为DoStuff
的类,其值为before
、after
或none
。这些名字不是真名,但它能让人明白这一点。该类有一个方法foo
。
下面是一组不同类型的只读属性,每个属性看起来如下:
public [type] MyProperty {
get {
if(enumValue == DoStuff.Before)
foo();
[type] result = //Do calculations here
if(enumValue == DoStuff.After)
foo();
return result;
}
}
有没有一种方法可以抽象出这些计算前/计算后的调用?我目前可以想到两种解决方案:
创建一个接受委托的私有方法,并在适当的位置调用
foo
。由于我为之写这篇文章的平台上缺少泛型,情况变得复杂起来。制作一个不带包装器调用的不可实例化基类,并派生一个访问基类属性的Before和After子类,调用位于适当的位置
这种结构有一个众所周知的模式吗?
使用以下语法创建一个方法:
delegate void Handler();
void DoHandler(Handler handler)
{
if(enumValue == DoStuff.Before)
foo();
handler();
if(enumValue == DoStuff.After)
foo();
}
然后在您的房产
public [type] MyProperty
{
get
{
[type] result = default(type);
DoHandler(() =>
{
int a = 5;
int b = 6;
result = a + b;
});
return result;
}
}
我倾向于在适当的地方创建一个Before和After事件/委托和slap-foo(),可能是现在设置enumValue的地方。然后呼叫:
get {
BeforeDelegate();
// Do calcs
AfterDelegate();
}
实际用途是什么?你为什么需要这个图案?
旁注:如果我有一个getter做那种逻辑,我更有可能把它放在一个方法中。它不太可能让人们感到惊讶。方法暗示我可能在幕后做了一些事情来获得您要求的值,而不仅仅是公开标量值。
我认为最好将枚举值放在一个单独的类中,该类有一个名为enamvalue的属性,并将其处理为事件BEfore和After,并将此处理为使用enamvalue类的类中的事件,当枚举值发生变化时,触发相应的事件
public class EnumValueClass
{
public event BeforeDelegate OnBefore();
public event AfterDelegate OnAfter();
private EnumType enumValue;
public EnumType EnumValue
{
get {
return enumValue;
}
set{
this.enumValue = value;
if(enumValue == DoStuff.Before)
if(OnBefore!=null)
OnBefore();
if(enumValue == DoStuff.After)
if(OnAfter!=null)
OnAfter();
}
}
}