命名事件和处理程序

命名事件及其处理函数的方式有很多种。 最近,我找到了一个适合我的。

让我给您一些选择,以便您选择最适合您的选择。

首先,让我们定义一个具有健康参数的Character类。 当健康降低时,该类将引发事件。 另一个名为CharacterAnimator的类将使用此事件并进行相应的处理。

  //处理主角逻辑 
公共课角色
{
减少健康的公共行动;
公共卫生; 公共CharacterAnimator动画师; 公共无效Init()
{
animator.Init(this);
} public void DecreaseHealth(int amount)
{
健康-=金额;
if(onHealthDecrease!= null)onHealthDecrease();
}}

让我们看一下前面的一些选项。

选项A

  //处理角色动画 
公共类CharacterAnimator
{public void Init(字符)
{
character.onHealthDecrease + = OnHealthDecrease;
} public void OnHealthDecrease()
{
//播放“伤害”动画
}
}

这可能是最常见的一种。 您使用onSomethingHappens格式来命名事件及其处理程序。 我认为可以,但是我不喜欢两个名字相同的事实。 同样,函数不是以动作命名的事实也困扰着我。

选项B

  //处理角色动画 
公共类CharacterAnimator
{public void Init(字符)
{
character.onHealthDecrease + =()=> {Play(“ hurt”);});
} public void Play(string animationName)
{
//播放“伤害”动画
}
}

此选项摆脱了上一个函数的混淆名称。 该函数的名称与其他函数一样,具有执行的功能。 主要缺点是仅查看该函数就无法立即告诉它它处理事件。

选项C

  //处理角色动画 
公共类CharacterAnimator
{public void Init(字符)
{
character.onHealthDecrease + = HandleCharacterHealthDecrease;
} public void HandleCharacterHealthDecrease()
{
播放(“伤害”);
} public void Play(string animationName)
{
//播放animationName
}
}

第三个选项是我当前正在使用的选项。 它解决了其他两个问题。

首先,它为函数指定了明确的名称以及将要执行的操作。 其次,在浏览代码时很容易发现该函数,并告诉它这是一个处理事件的函数。

奖励:接口

这也有助于我们在需要时为代码编写接口。 在上述情况下,我们可以简单地拥有:

 公共接口CharacterHealthChangeHandler 
{
void HandleCharacterHealthDecrease();
void HandleCharacterHealthReachZero();
}

现在想象一下,我们有另一个类似于动画的系统,但是这次它处理音频。

  //处理角色音频 
公共类CharacterAudio:CharacterHealthChangeHandler
{public void Init(字符)
{
character.onHealthDecrease + = HandleCharacterHealthDecrease;
character.onHealthReachZero + = HandleCharacterHealthReachZero;
} public void HandleCharacterHealthDecrease()
{
播放(“伤害”);
} public void HandleCharacterHealthReachZero()
{
播放(“死亡”);
}公共无效播放(字符串audioId)
{
//播放audioId
}
}

让我们也更新CharacterAnimator。

  //处理角色动画 
公共类CharacterAnimator:CharacterHealthChangeHandler
{public void Init(字符)
{
character.onHealthDecrease + = HandleCharacterHealthDecrease;
character.onHealthReachZero + = HandleCharacterHealthReachZero;
} public void HandleCharacterHealthDecrease()
{
播放(“伤害”);
} public void HandleCharacterHealthReachZero()
{
播放(“死亡”);
} public void Play(string animationName)
{
//播放animationName
}
}

把它们加起来:

  • 活动→“开” +动作
    示例:onAttack,onSpawn,onMove
  • 事件处理程序功能→“句柄” + ClassName + Action
    示例:HandleCharacterAttack,HandleCharacterSpawn,HandleCharacterMove
  • 事件处理程序界面→ClassName + EventArea +“ Handler”
    示例:CharacterCombatHandler,CharacterLifeCycleHandler和CharacterMovementHandler

编写这种代码的方法可能更多。 这些是一些选项。 请随时接受这些内容,并根据自己的喜好进行修改。