1

返回错误代码的最佳做法是什么?

有时我们会遇到类方法操作不成功的情况,但也不例外。如果失败的原因多种多样,那么我们需要一种方法来告诉调用者失败的原因。

例如,我有Actor::equipItem()将项目装备到 RPG 角色对象的方法。失败的原因可能是:

  • 人物等级不够高。
  • 角色职业无法装备该物品。
  • 人物属性不够(如强度不够)。
  • 该项目已损坏。
  • 该物品是一把双手武器,角色已经挥舞着匕首。
  • 等等

在我看来,上述情况并不例外。我可以Actor::equipItem()通过两种方式实现。

  • 首先是返回int码,比如0成功和1等级不够,2错误的字符类等等。
  • 第二个是返回 boolean TRUEor FALSE,并实现Actor::getLastErrorCode()调用者可以检查它是否需要向用户提供反馈。

两者中哪一个是 OOP 和 API 设计方面的最佳实践?有替代品吗?是否有处理非异常情况的错误代码的最佳实践?

4

1 回答 1

3

就像我说的,我同意 cHao 的观点,即抛出异常是处理这个问题的正确方法。但是,我想评论一下您可能决定如何处理所有这些规则。这种情况对于规则引擎来说是一个完美的情况,使用良好的 ol' 多态性。(检查责任链(CoR)设计模式将对此有好处。)

你可以在你的方法中使用一堆if语句。或者,更好的是,让每个if检查都有自己的类,实现类似 IEquipItemRule 的东西:

public interface IEquipItemRule
{
    bool CanEquip();
}

if然后,您的消费代码可以处理所有规则,而不是语句:

List<IEquipItemRule> equipRules = GetEquipRules();  // This is where the CoR pattern comes in

foreach (IEquipItemRule rule in equipRules)
{
    // Note: Instead of throwing immediately, you could collect all of the
    //       messages and return all of the failure reasons.
    if (!rule.CanEquip()) { throw new AppropriateException(rule.Message); }
}

这样做的好处是这个检查可以用它自己的方法。所以,如果你想先检查这个方法是否成功,消费者可以调用上面的代码。当实际方法运行时,它也可以调用这个检查代码。

注意:设备规则的示例可能如下所示:

public class CharacterLevelRule : IEquipItemRule
{
    public bool CanEquip()
    {
        if (characterLevel <= necessaryLevel) { return false; }
        return true;
    }
}
于 2013-03-07T03:34:42.107 回答