C#编码模式问题

时间:2011-06-11 17:40:11

标签: c# .net design-patterns .net-4.0

我有以下代码:

protected void Initialize(){
  this.Fonts.Initialize();
  this.Screens.Initialize();
  this.Menu.Initialize();
}

protected void Update(){
  this.Screens.Update();
  this.Menu.Update();
}

写完这篇文章后,我将代码重新计算为:

protected void Initialize(){
  this.CallMethod<INeedInitialization>(
  (i) => { i.Initialize(); }
  , this.Fonts, this.Screens, this.Menu
  );
}

protected void Update(){
  this.CallMethod<INeedUpdating>(
   (i) => { i.Update(); }
    , this.Screens, this.Menu
  );
}

private void CallMethod<T>(Action<T> action, params T[] items){
  items.ToList().ForEach(i => action(i));
}

然后,我意识到在我的代码库中,有很多重用CallMethod<T>类型的操作,所以我进一步重新考虑到:

public static extensions{
  // I use object type as I can have INeedInitialization, INeedUpdate etc...
  public static void CallMethod<T>(this object obj, Action<T> action, 
params T[] items){
   items.ToList().ForEach(i => action(i));
  }
}

现在,我可以在所有我的对象上获得CallMethod<T>,但不知怎的,在这样做之后,我觉得这个代码&amp;有一些根本性的错误。无法确定为什么我觉得它不正确。

此外 - 如何将通用方法的OR约束仅接受INeedUpdatingINeedInitialize类型的对象,而不是扩展基类Object类型?

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

KISS principle

这似乎是花式编码综合症的一个例子。我没有看到通用例程所带来的任何好处以及额外代码中的大量费用来维护,调试和测试。

答案 1 :(得分:0)

要回答您的问题,您可以创建该功能的两个副本,每个接口一个:

public static void CallMethod<T>(this INeedUpdating obj, Action<T> action, 
params T[] items){
   items.ToList().ForEach(i => action(i));
}
public static void CallMethod<T>(this INeedInitialize obj, Action<T> action, 
params T[] items){
   items.ToList().ForEach(i => action(i));
}

但我不得不怀疑,你的纠结混乱是否真的比单纯说:

更具可读性
foreach(var item in new INeedInitialization[]{this.Fonts, this.Screens, this.Menu})
    item.Initialize();

答案 2 :(得分:0)

是的,看起来很奇怪。我遇到的第一件事是创建theese的集合,然后简单地将它们循环到方法中。

List<INeedInitialization> InitializedComponents = new List<INeedInitialization> {Fonts, Screens, Menus};
List<INeedUpdating> UpdatedComponents = new List<INeedUpdating> {Screens, Menus}

protected void Initialize(){
  foreach(var i in InitializedComponents)
    i.Initialize();
}

protected void Update(){
  foreach(var u in UpdatedComponents)
    u.Update();
}

通过简单地将更多项添加到集合中而不更改或覆盖方法本身,这可以很好地成为复杂类层次结构的一部分。