如何处理非法参数的验证

时间:2017-04-20 10:07:46

标签: c# validation exception

我知道网站上已经解决了这个问题。虽然,有许多不同的意见,我想更深入地了解如何面对某些特定的情况。 我们说我有以下代码。我会用C#编写,但它不是一个严格相关的C#问题。

class Player
{
    private int dexterity;
    public int Dexterity{
        get => dexterity;
        set{
           //Here I need to validate: problem 2
           dexterity = value;
           UpdateArmorClass(); //Armor class should be modified any time dex is
        }
    private int armorClass;

    public Player(int dex){
        Dexterity = dex;
    }

    private void UpdateArmorClass(){
        //Should I validate here? Problem 3
        armorClass = 10 + Dexterity;
    }
}
//Here is main with user input: problem 1

让我们说要求用户输入其敏捷性,必须是非负的,以创建其角色。现在我面临三种情况:

  • 问题1:用户输入验证:阅读时,我确信我不会使用例外来验证用户输入,因为它经常发生。我想我可以通过使用布尔值isValid来解决这个问题,并且如果它是假的,则再次要求用户输入他的值。这是一个很好的解决方案吗?
  • 问题2:构造函数中的验证嗯,它实际上不在构造函数中,我把它放在灵巧的setter中,它将由构造函数调用。先验地,不需要检查这一点,因为如果用户输入已经被验证,则数据将是正确的。 虽然,我可以在代码中的其他地方创建播放器(所以我想检查程序员级别而不是用户级别)和灵巧性shuold绝不允许是消极的。在这里,我面临着一个巨大的困境:是否使用例外? 我个人使用它们来阻止程序生成无效对象。但是,许多人因为价格昂贵而不鼓励使用异常。我能想到的唯一解决方案是在给定值错误的任何时候给出默认值。虽然,对我来说这似乎是一个棘手的解决方案,因为程序会不受干扰地进行,我不会知道默认值已被放置(这对我的情况可能是错误的)。所以,真正的问题是:我应该使用异常来处理总结构(或设置器)中的这种情况吗?
  • 问题3:方法验证:现在我知道也不应该允许armorClass为负数。在我的情况下,我有一个私有方法,可以在修改灵巧时随时更新armorclass。所以这里真的没有必要来再次验证。现在假设我创建了另一个用于进行简单战斗的类,并且我在此帖子的末尾显示了该方法,该方法计算被击中的概率。它希望得到一些armorClass值,虽然我可能是另一个程序员,但不知道Player中的armorClass是否已经过验证。所以我检查它是否是否定的。抛出这样一个检查的异常似乎很多,但如果我检查它的非负性,当armorClass为负时我必须返回一个默认值,这看起来很棘手。 在这种情况下我该怎么做?

这是最后一种方法:

public float Hit(int armorClass){
    if(armorClass >=0) //calculate probability of being hit
    //return probability
}

奖金问题(当然与以前的问题有关):实例化一个新的异常真的那么贵吗?或者它只是尝试捕获部分?对我而言,它似乎是在实例化一个新对象,而这就是全部。虽然,我可能是错的,这就是为什么许多人说如果不是真的需要你就不应该使用例外。

1 个答案:

答案 0 :(得分:2)

  

在这里,我面临着一个巨大的困境:是否使用例外? ID   个人使用它们来阻止程序生成无效   宾语。虽然,许多人不鼓励因使用异常而使用异常   价格昂贵。

使用例外。引发异常只是昂贵的,引发异常总是比最终损坏的对象更好。如果您的值来自用户输入,请分别从用户处获取无效值。这样,您可以安全地从代码中调用这些方法/设置值,并且在用户输入无效值时不会引发异常。另外,有时您可能希望使用特殊值,不允许用户输入。

问题3: 如果您的私有字段在设置之前始终经过验证,则无需检查其是否在get上有效。在您的代码示例中,将10添加到任何非负数都将始终返回非负值。

奖金问题: 所有引发的异常都必须在某个地方处理,所以我认为如果它是一个昂贵的,或者是捕获部分的提升异常部分那么重要。