1

ライセンスのさまざまな側面 (開始日、終了日、システム制限など) をチェックするライセンス システムを作成しました。たとえば、5 つを超えるユーザー アカウントを作成できないというライセンスの制限があります。一般的なメソッド (bool IsValidLicense など) を呼び出すメソッド (bool NumberOfUsersIsCoveredByLicense など) があります。IsValidLicense は、ライセンス ファイルが操作されているか、期限切れになっていないかなどを確認します。

現在の問題はエラー出力です。ご覧のとおり、戻り値が bool のメソッドがあるため、ライセンス違反があったことはわかりますが、ライセンス チェックのどの部分が失敗したかはわかりません。そこで、ライセンスのどの部分が違反されたかを示す値を返す方法を考えています。最も簡単な方法は、文字列値を返すことです。私は次のようにします

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

1

無効化の可能な状態を制限したい場合は、列挙を使用しても問題ありません。これにより、UI などが考えられる各状態を処理できるようになります。検証システムから多くのバリアント状態がある場合は、関連情報を保持する検証クラスを作成し、バリデーションからそれを返すことをお勧めします。

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

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

クラスの作成は軽量なプロセスであるため、提案された「アウト」ソリューションのようなものと比較して、パフォーマンスに関する考慮事項は最小限になります。

編集:さらに、バリデーターに例外を使用しないこともお勧めします。少なくとも私にとっては、バリデーターは入力を受け取り、それを検証するように設計されるべきです。try{} catch{} ブロックで処理しなくても、消費者が吐き出す無効なデータ エラーに対処できるようにします。例外は、ファイル アクセスの問題や COM の無効化など、消費者が直接処理できない予測不可能な外部の問題に対してのみ使用する必要があります。

于 2013-09-19T11:46:11.797 に答える