【问题标题】:Which is better: A single delegate for multiple events vs multiple delegates for multiple events?哪个更好:多个事件的单个代表与多个事件的多个代表?
【发布时间】:2015-01-23 20:39:43
【问题描述】:

我很好奇单个委托来管理大量事件是否比使用多个委托来处理所有这些事件更好。

例如,假设我有 50 个事件都属于相同的“类别”和类。这些事件可以分为 5 个组。您是只为所有 50 个相关事件指定 1 个代表,还是为每个 10 个事件的特定组指定 5 个代表?

编辑:这听起来像是一个显而易见的问题,但我没有足够的理解力来自信地为自己回答这个问题。

Edit2:这是一些示例代码。

    //## Left-Button
public delegate void LeftButtonHandler();
public static event LeftButtonHandler LeftButtonHeldEvent;
public static event LeftButtonHandler LeftButtonUpEvent;
private static void LeftButton(){
    if (Input.GetButton("KeyLeft")){
        if (LeftButtonHeldEvent != null)
            LeftButtonHeldEvent();
    }
}
private static void LeftButtonUp(){
    if(Input.GetButtonUp("KeyLeft")){
        if (LeftButtonUpEvent != null)
            LeftButtonUpEvent();
    }
}

//## Down-Button
public delegate void DownButtonHandler();
public static event DownButtonHandler DownButtonHeldEvent;
public static event DownButtonHandler DownButtonUpEvent;
private static void DownButton(){
    if (Input.GetButton("KeyDown")){
        if (DownButtonHeldEvent != null)
            DownButtonHeldEvent();
    }
}
private static void DownButtonUp() {
    if (Input.GetButtonUp("KeyDown")) {
        if (DownButtonHeldEvent != null)
            DownButtonUpEvent();
    }
}

问题是关于这个,我有更多的意见要轮询。只为所有密钥创建一个委托比为每个密钥使用一个新委托更好吗?

注意:这是统一的,但这不是统一的特定问题。我知道发布事件的输入轮询有点荒谬,但是统一没有提供订阅自己的 UI 事件的方法。我此时并不特别关心这一点,只关心我应该使用 1 个委托还是多个委托。

【问题讨论】:

  • 我绝对不想维护一个包含 50 个不同代表的代码库,它们都做同样的事情。讨厌到这样的地步,如果未来的雇主在面试中向我透露了这一点,并随后向我提出了要约,我可能会拒绝他们。
  • 也就是说,我可能更讨厌一个带有包含 >5 个案例的 switch 语句的单个委托...看,这就是为什么发布一些代码来提供你所面临的情况的例子。这里没有真正的 100% 防弹答案。
  • 那么你会说,对于给出的例子,一个代表最好吗?我只是确保唱出答案似乎如此明显,我在质疑我是否真的知道。编辑:明白了,我会放一些代码。

标签: events delegates


【解决方案1】:

根据您的示例,我将有一个处理程序,该处理程序接受一个包含按下/按住键的值的参数,例如:

public delegate void ButtonHandler(object sender, string whichButton);
public static event ButtonHandler ButtonHeldEvent;
public static event ButtonHandler ButtonUpEvent;

private static void ButtonHeld()
{
  string keyHeld = "..."; //Todo: Code to get which button is being held
  if (ButtonHeldEvent != null)
  {
     ButtonHeldEvent(this, keyHeld);
  }
}

private static void ButtonUp()
{
  string keyUp = "..."; //Todo: Code to get which button is up
  if (ButtonUpEvent != null)
  {
    ButtonUpEvent(this, keyUp);
  }
}

让事件的订阅者弄清楚如果是 KeyLeft、KeyDown 等该怎么做。

【讨论】:

  • 感谢您的回复。因此,我没有为每个按键设置一个事件,而是让订阅的事件处理程序通过 if/else 或开关来计算它。最终只有一个代表才能工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多