哪一个更好 ?事件还是直接参考?

时间:2018-07-19 02:17:55

标签: coding-style software-design

您好,我想问问哪个更好,为什么? (或者也许有更好的解决方案,请咨询)

public class Player
{
    GameController _gameController;
    public Player
    {
        _gameController.OnPlayerGetHit += GetHit;
    }

    private void GetHit(float damage){}
}

public class GameController
{
    public delegate void PlayerHitCallback();
    public event PlayerHitCallback OnPlayerGetHit;

    public OnCollisionHit()
    {
        OnPlayerGetHit?.Invoke();
    }
}

public class Player
{
    public void GetHit(float damage){}
}

public class GameController
{
    Player _player;

    public OnCollisionHit()
    {
        _player.GetHit(damage);
    }
}

我想问一句顶级解决方案比后者更好或更糟(或者它们两者都不好),请帮忙,我需要一些建议。 预先感谢!

1 个答案:

答案 0 :(得分:2)

实际上,对于同一目标,Unity中提供了更多替代方案:传递信息并触发对象之间的动作。

  • 直接方法调用;
  • c#个事件;
  • 团结活动;
  • 联合国的消息系统;
  • 您自己的事件机制...

正如我和其他人在评论中所说,“最佳”选择取决于很多因素,例如:应用程序的大小和预期使用寿命,设计选择,编码人员的经验,要解决的特定问题,个人喜好...

绝不打算对此给出最终的答案,但我可以分享一个既定的观点,并考虑到这些因素。

毕竟,我只想说出我在评论中说的相同的内容:如果您正在做一个大型应用程序,其中包含许多类和组件,可能是由不同的人开发的,则这些类需要彼此了解很多可能会很不好,并且一个组件的更改可能会导致应用程序中各个位置的中断。但是,如果您的应用程序很小,并且类之间的关系非常明显,那么您就不应该费心把东西花哨,而应该费心处理更重要的事情,例如运送游戏

尽管如此,我想指出的那些工具的预期用途还是有一些差异。

直接在另一个对象上调用方法需要您的调用者执行以下两项操作:1)知道谁是调用对象(具有引用)以及在其中发生的事情(了解方法名称和目标)。它在很多情况下都可以使用。假设您的游戏控制器负责使玩家环游世界。您可能已经有一个球员的参考资料,并且想要修改,以知道何时移动。您最好致电player.move()

在对象中调用方法就像打电话给您的朋友说您今晚有空闲逛。

调用事件是其他事情。您的玩家可以死在世界上。许多组件可能会对知道玩家何时死亡的兴趣。音频管理员可能要播放SE。网络控制器可能希望与Web服务器通信。成就系统可能想要奖励,敌人可能想要庆祝...所有这些组成部分都应该已经订阅player.OnAboutToDie,并且所有这些都将在适当的情况下发生。通过事件,您可以与每个对您的消息感兴趣的人(也许没有人)进行交流,而无法控制他们对该信息的处理方式。就像您在Twitter上发布您今晚有空...

C#事件和Unity事件起着相同的作用,不同之处在于c#事件在所有c#软件包和程序中都是通用的,更加灵活和快速。非程序员可以在检查器中操纵统一事件,并具有其他与统一相关的好处。

还有Unity的消息系统。这就是使“更新”和“开始”之类的东西适用于所有单行为和事物的原因。这是我之前描述的消息传递隐喻的夸大其词。实现名为消息的消息的所有对象都将由SendMessage触发,甚至是带有BroadcastMessage的子对象。就像付钱给当地广播电台宣布您今晚有空...

编辑:我只是意识到OP在问题[:facepalm]中从未提到Unity。答案仍然适用。