C # шаблон кодирования вопрос - PullRequest
3 голосов
/ 11 июня 2011

У меня был следующий код:

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> на всех моих объектов, но почему-то после этого я чувствую, что с этим кодом что-то в корне не так, и не могу точно определить, почему я чувствую, что он некорректен.

Кроме того - как я могу наложить ограничения ИЛИ на общийспособ принимать только объекты типа INeedUpdating или INeedInitialize вместо расширения базового типа Object?

Может кто-нибудь помочь?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 июня 2011

Принцип поцелуя !

Похоже, это пример синдрома необычного кодирования.Я не вижу ничего полезного в общих процедурах и значительных расходах на дополнительный код для поддержки, отладки и тестирования.

0 голосов
/ 11 июня 2011

Да, это выглядит странно.Первое, что пришло мне в голову, - это создать эти коллекции, а затем просто зациклить их в методе.

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

И это может быть частью структуры сложных классов, просто добавляя больше элементов в коллекции без изменения или переопределения самих методов.

0 голосов
/ 11 июня 2011

Чтобы ответить на ваш вопрос, вы можете создать две копии функции, по одной для каждого интерфейса:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...