1

我编写了一个许可系统,它检查许可证的不同方面(例如开始日期、结束日期、系统限制等)。例如,我在许可证中有一个限制,即您不能创建超过 5 个用户帐户。我有一个方法(例如 bool NumberOfUsersIsCoveredByLicense),它调用一个常用方法(例如 bool IsValidLicense)。IsValidLicense 将检查许可证文件是否被操纵、过期等。

现在的问题是错误输出。如您所见,我的方法具有布尔返回值,因此我知道存在许可证违规,但我不知道许可证检查的哪一部分失败。所以我在想,如何返回一个值,它描述了许可证的哪一部分被违反了。最简单的方法是返回一个字符串值,我会做类似的事情

var licenseValidationResult = NumberOfUsersIsCoveredByLicense(4)
if(licenseValidationResult.Equals(String.Empty))
{
    //Success
}
else
{
    ErrorMessage = GetErrorMessageByErrorCode(licenseValidationResult);
}

因此,如果许可证有效,我将返回一个空字符串,如果它无效,它将以 error1;error2;error3 之类的形式返回错误代码。我实际上不确定这是否是一个好的解决方案。另一种可能性是枚举,如下所示:

[Flags]
public enum LicenseErrorCodes
{
    None = 0x00,
    LicenseExpired = 0x01,
    LicenseManipulated = 0x02,
    MaxNumberOfUsersReached = 0x04,
    [...]
}

但同样,我不确定这是否是一个不错的解决方案。是否有解决此类问题的“通用方法”/最佳实践?

4

3 回答 3

2

如果您认为违反许可证的行为失败错误,那么在失败的地方抛出异常可能是合理的。

所以,定义你的InvalidLicenseException..

于 2013-09-19T11:17:26.393 回答
1

如何使用out 参数。所以你仍然可以返回一个布尔值来表示成功或失败,还可以在 isValidLicence 方法中添加一个 out messageString 参数。或者定义一个许可证违规类并使用它。

于 2013-09-19T11:20:26.980 回答
1

如果您想限制可能的失效状态,则使用枚举很好。这将允许您的 UI 等处理每个可能的状态。如果您的验证系统中有许多变体状态,那么我建议您只创建一个包含相关信息的验证类并从您的验证器返回该信息,例如:

static IValidationInfo Validate(ILicense someLic)
{
    // Implementation
}

interface IValidationInfo
{
    IEnumerable<LicenseErrorCodes> KnownErrors { get; }
    IEnumerable<string> WierdErrors { get; }
}

创建类是一个轻量级的过程,因此与建议的“out”解决方案相比,性能考虑将是最小的。

编辑:此外,我还建议不要对验证器使用异常。至少对我来说,应该设计一个验证器来接受输入并验证它。让消费者处理它吐出的任何无效数据错误,而不必在 try{} catch{} 块中这样做。异常只应真正用于无法由消费者直接处理的不可预测/外部问题,例如文件访问问题或 COM 失效。

于 2013-09-19T11:46:11.797 回答