7

ウィキペディアによると、仕様パターンは、ブール論理を使用してビジネスロジックをチェーン化することにより、ビジネスロジックを再結合できる場所です。リストまたはコレクションからフィルタリングオブジェクトを選択することに関しては、DynamicLINQを使用すると同じことを実行できるように思えます。私は何かが足りないのですか?同様に考慮されるべき仕様パターンの他の利点はありますか?


編集:

LINQと仕様パターンの組み合わせについて説明している投稿をいくつか見つけました。

Linq仕様プロジェクト

Nicloas Blumhardt(Autofac dude)によるLinqを介した仕様パターンの実装

誰かがこの道を進んだことがあり、維持するのが複雑になりましたか?

4

4 に答える 4

6

私はC#開発者であり、ビジネスドメインに近いため、仕様パターンを使用するのが好きです。さらに、このパターンに驚くことはありません。仕様クラスが存在する場合は、機能するはずです。Linqを使用すると、基盤となるプロバイダーが一部の機能を実装していない可能性があり、実行時までそれを知ることはできません。

しかし、間違いなく、linqに対する仕様の最大の利点は、ビジネスに近いことです。これはミニDSLです。私にとってのLINQは、ビジネスドメイン用ではなく、コレクションクエリ用のDSLです。

于 2009-09-21T11:35:04.513 に答える
3

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クエリ内で仕様を使用できます。

于 2016-01-06T16:10:56.657 に答える
2

動的LINQは、文字列式を使用して動的クエリを構築できるようにします。したがって、実際には、そこでの型安全性は失われます。密接に関連するインカネーションであるデコレータパターンのようなラッパーパターンを使用するのに対し、仕様パターンを使用すると、コードで型の安全性を維持できます。クエリを再利用して動的に構築するために、デコレータパターンをクエリラッパーとして使用する方法を検討します。コードプロジェクトに関する記事は、 LinqQueryWrappersにあります。

または、私のブログを確認することもできます。

于 2010-07-15T13:29:36.663 に答える
1

LINQについてはよくわかりませんが、一般に宣言型クエリシステムは仕様パターンに関連しているようです。特に、オブジェクト指向環境でオブジェクトを一緒に構成することにより、宣言型クエリシステムを実装します。LINQの機能に似たIIRCで、構文糖衣の層を提供します。

LINQがパターンを完全に廃止したかどうかはわかりません。LINQでは表現できないコーナーケースがあるのではないでしょうか。

于 2009-09-21T11:35:57.627 に答える