私たちのシステムには、Product
さまざまなカスタムプロパティを持つ可能性のあるエンティティがあります。プロパティのセットは製品ごとに異なる場合があり、タイプのフィールドに格納されList<Property>
ます。プロパティはさまざまなタイプ(strings、ints、double)であり、いくつかの特別な特性を持っている場合があります。たとえば、複数値、特定の範囲の値、指定されたリストの値などです。プロパティの値は常に次の場所に含まれます。文字列フィールドValue
。
現在の私の現在の問題は、これらのプロパティの検証を実装することであり、検証結果の表示の一部としてどのようなアプローチを取るかということに固執しています。私が満たさなければならない要件:-検証の結果は他のアプリケーション層で使用されるため、結果のAPIは明確で使いやすい必要があります-各エラーは明確に表現されている必要があります-APIのユーザーは理解するのに十分な情報を持っている必要がありますエラーの詳細(たとえば、範囲エラーの場合は、可能な最小値、可能な最大値、および実際の値を指定する必要があります)
これまでに検討したアプローチは次のとおりです。
クラス階層。基本抽象クラスが1つあり
ValidationError
、それぞれの特定のエラーは継承されたクラスに反映されます。エラーに詳細がある場合、対応するクラスには、すべての情報を格納するために必要なフィールドがあります。例:public abstract class ValidationError { // common fields and methods, if any } public class IncorrectFormatValidationError : ValidationError { // just empty class, nothing to add here } public class RangeValidationError : ValidationError { public object MinValue { get; set; } public object MaxValue { get; set; } }
このアプローチは、実際には空のクラスがさまざまであるため、私にはかなり冗長に思えます。さらに、そのようなAPIの使用法は正しくないようです(
if (typeof(error) == typeof(RangeValidationError))
-ナンセンス!)。しかし、これが私の頭に浮かんだ最初のことです。エラーの列挙と、必要に応じてクラス階層。すべてのエラーは列挙で表されます。ほとんどの場合に使用されるクラスが1つあり
ValidationError
、特定のエラーに追加情報が必要な場合は、基本的に最初のアプローチと同じ方法で継承者が作成されます。例:public enum ValidationErrors { IncorrectFormat, ValueNotWithinRange, ... } public class ValidationError { public ValidationErrors ErrorType { get; set; } public ValidationError(ValidationErrors type) { this.ErrorType = type; ... } // common fields and methods, if any } public class RangeValidationError : ValidationError { public object MinValue { get; set; } public object MaxValue { get; set; } public RangeValidationError(object minValue, object maxValue) : base(ValidationErrors.ValueNotWithinRange) { ... } }
このアプローチははるかに良く見えますが、欠点もあります。最大の問題は、APIユーザーとして、たとえばタイプのエラーが発生した場合、
ValueNotWithinRange
タイプのクラスを処理していることを保証できないRangeValidationError
ことです。そうでない場合は、どのように処理しますか?理想的には、私はAPIを開発する唯一の人物ではないので、そのような状況が存在することさえも防ぐような設計レベルの機能が欲しいと思います。このアプローチのもう1つの問題は、ほとんどのエラーが最終的に追加情報を必要とする場合、最終的に同じアプローチ番号1になることです。
誰かがこれらの2つのアプローチについて共有したり、より良いアプローチを提案したりする考えがありますか?ご回答いただければ幸いです。前もって感謝します。