C#编码模式问题

本文关键字:问题 模式 编码 | 更新日期: 2023-09-27 17:59:00

我有以下代码:

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>,但不知何故,在这样做之后,我觉得这段代码有一些根本性的问题&无法指出为什么我觉得它不正确。

此外,我如何对泛型方法设置OR约束,以仅接受INeedUpdatingINeedInitialize类型的对象,而不是扩展基本Object类型?

有人能帮忙吗?

谢谢!

C#编码模式问题

KISS原理!

这似乎是幻想编码综合症的一个例子。我看不到从常规例程中获得任何好处,也看不到维护、调试和测试额外代码的巨大开销。

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

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();
是的,看起来很奇怪。我想到的第一件事是创建se的集合,然后简单地在方法中循环它们。
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();
}

这可以很好地成为复杂类层次结构的一部分,只需在不更改或覆盖方法本身的情况下向集合中添加更多项。