C#编码模式问题

3

我有以下代码:

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类型?
有人能帮忙吗?
谢谢!

我通常更喜欢使用命名规范 IInitializableIUpdatable - ChaosPandion
4
仅仅为了使用 ForEach() 而将集合转换为列表是一种可憎的行为!如果想要使用,只需使用适当的循环或创建适当的扩展方法来隐藏它。 - Jeff Mercado
3个回答

4

KISS原则!

这似乎是花哨编码综合症的一个例子。我认为通用程序中没有任何收益,而额外的代码维护、调试和测试成本相当高。


1
+1,谢谢...我认为没有必要使用如此复杂的方案来简单地调用几个方法。楼主把显而易见的行为变成了一些我需要花时间去弄明白的东西,只是为了意识到它是以“花哨”的方式调用几个方法。只需使您的代码尽可能简单... - Ed S.

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

或者说,只需保留原始内容即可,不需要进行循环处理。 - siride
当然,只是给他提供一些替代方案 :) - Blindy

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接