有没有更好的方法来编写这个代码

本文关键字:代码 更好 方法 有没有 | 更新日期: 2023-09-27 17:58:49

我有一个枚举为DoStuff的类,其值为beforeafternone。这些名字不是真名,但它能让人明白这一点。该类有一个方法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();
        }

    }
}