LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
仕様:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- ビジネスロジックは仕様にカプセル化されています(それが何であるかを示す名前が付けられています)。
- DRY:コードに対してそのlinqを繰り返さず、仕様を使用するだけです
ルールがコードで明示的になるほど重要であり、エンティティに自然に属していない場合は、仕様を使用するのが好きです。
例:
public class Customer
{
//...
public bool IsAbleToReceiveCredit(decimal creditValue)
{
var secureAge = this.Age > 18 && this.Age < 60;
var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;
return secureAge && personalAssetsGreaterThanCreditValue;
}
}
彼がいくらかの信用を受け取ることができるかどうかを決定するのCustomer
は責任からですか?銀行は顧客にローンを受け取ることができるかどうか尋ねますか?
おそらくそうではありません。
したがって、仕様を使用すると、そのロジックをCustomer
(に属していなかった)から削除できます。のようなものを作成しIsAbleToReceiveCreditSpecification
、そこにすべてのロジックを配置できます。さらに進んで仕様を組み合わせることができます。たとえば、aSecureAgeSpecification
とaを作成し、AssetsGreaterThanSpecification
それらを使用してを作成できますIsAbleToReceiveCreditSpecification
。
したがって、LINQが仕様に取って代わるとは思いません。実際、それはパターンを改善します。LINQを内部で使用する仕様の実装がいくつかありますIQueriable<T>
。これにより、リポジトリ/DataAcessレベルのORMクエリ内で仕様を使用できます。