2011-06-10 123 views
0

我有一个enum DoStuff,其值为before,afternone。这些名字并不是真正的名字,但它可以说明问题。该班级有一个方法foo有没有更好的方式来编写这段代码?

下面是一组只读属性,不同类型的,每个看起来如下:

public [type] MyProperty { 
    get { 
     if(enumValue == DoStuff.Before) 
      foo(); 

     [type] result = //Do calculations here 

     if(enumValue == DoStuff.After) 
      foo(); 

     return result; 
    } 
} 

有抽象这些前/后计算召唤出来的一种方式?我现在能想到的两种解决方案:

  • 创建需要一个委托,并在适当的地方调用foo的私有方法。复杂的平台上缺乏泛型我写这个。

  • 让既没有包装调用一个不可基类,并从中获得一个前和子类访问基类的属性,与呼叫在适当的地方

后是否有一个众所周知的模式对于这种结构?

+2

作为对风格的一般评论,除了初始化目的外,我会避免更改属性getter中的状态。 – Reddog 2011-06-10 20:37:05

+1

无限递归! – 2011-06-10 20:38:55

+0

@丹涛:哎呀。我的错。 – Eric 2011-06-10 20:42:49

回答

1

请用这个语法的方法:

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; 
    } 
} 
+0

有两个问题。首先,这要求我为每种类型的返回值编写一个'DoHandler'函数,这会使代码更加混乱,而不是更清晰。其次,我在问题中说过我没有泛型支持,所以没有'Func '。 – Eric 2011-06-11 19:45:27

+0

好吧,你可以做得稍微不同。我会修改它。 – 2011-06-11 20:19:02

+0

你可以在c#中的lambdas中进行闭包吗? – Eric 2011-06-11 21:27:56

0

我会倾向于在适当的地方创建Before and After事件/委托并将foo()放在适当的位置,可能无论您在哪里设置enumValue。然后致电:

get { 
    BeforeDelegate(); 
    // Do calcs 
    AfterDelegate(); 
} 

什么是实际用途?你为什么需要这种模式?

旁注:如果我有一个吸气剂做这种逻辑我更可能把它放在一个方法。这不太可能让人感到惊讶。方法暗示我可能做了一些事情来获得你所要求的价值,而不仅仅是暴露一个标量值。

+0

代码是与一个硬件接口,所以使用属性似乎是合理的(因为它们是硬件的属性)。 [硬件](http://www.sparkfun.com/datasheets/Components/HMC6352.pdf)有三种模式:连续更新('Continuous',又名'DoStuff.None'),在请求时更新('Standby',又名'DoStuff.Before'),并在读取后更新('Query',又名'DoStuff.After')。 – Eric 2011-06-10 20:41:19

+0

嗯......我仍然更喜欢'GetPropertyValue()'调用,但这是一个挑剔的事情开始。在决策点中是否还有其他的“foo()”?我不认为这是一个“最好的模式”问题,而是一个“简洁的语义学”的东西。如果发生了这一切,并且这是它发生的唯一属性,那么枚举方法非常清晰。如果这种情况发生,我会倾向于采用委托/事件方法。 – 2011-06-10 22:20:32

0

我认为它能够更好地把枚举值中有一个名为EnamumValue和事件前后1个属性一个单独的类,并处理这事件在使用enamvalue类的类, 当enumvalue变化触发相应的事件

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(); 
     } 


    } 
} 
+0

这不符合通话合约。首先,'OnAfter'和'OnBefore'具有相同的功能。更重要的是,'foo'方法必须在大多数属性访问之前或之后调用。当模式改变时不需要调用它。 – Eric 2011-06-11 07:58:34

相关问题