SPÉCIFICATION
Je sais que vous avez déjà accepté une réponse, mais, vous avez posé une question sur DDD, et la correspondance exacte pour cela est ce qu'Evans appelle une `` spécification '':
lien direct Google Books
Si ce lien ne fonctionne pas, vérifiez le livre dans ces résultats
C'est la page 226 si vous avez le livre.
À la page 227, vous trouverez 3 utilisations pour les spécifications: validation, sélection, construction d'un nouvel objet spécial. Le vôtre est «sélection» - IsExpired.
Une autre chose à propos du concept de `` specificaiton '' est qu'il admet que - pour des raisons d'efficacité - vous pouvez avoir besoin d'une version de code pour fonctionner sur les objets en mémoire, et d'une autre version du code pour interroger efficacement le référentiel sans avoir à obtenir au préalable tous les objets en mémoire.
Dans un monde simple, cela signifierait de mettre une version SQL dans votre référentiel et une version objets dans votre modèle, bien sûr qui présente des inconvénients. La logique est à 2 endroits (mauvais, quelqu'un va oublier de mettre à jour ces endroits) et il y a une logique de domaine dans votre référentiel.
La réponse est donc de mettre les deux ensembles de logique dans une spécification. La version en mémoire, bien sûr, mais aussi une version de référentiel. Si vous utilisez par exemple n-hibernate, vous pouvez utiliser son langage de requête intégré pour la version du référentiel.
Sinon, vous devrez créer une méthode de référentiel spéciale pour cette spécification qui est utilisée à partir de l'objet de spécification. Les appels de collecitons d'objets correspondant à la spécification passeraient par la spécification et non par le référentiel. Et au moins le code crie «je suis à 2 endroits, ne l'oubliez pas» aux futurs responsables. Il y a un merveilleux exemple à la page 231-232 pour résoudre un problème très similaire.
La spécification est une fuite / glissement «autorisée» de la «pureté» du DDD. Il pourrait ne pas répondre à vos besoins à diverses fins. Par exemple, l'ORM peut générer un mauvais SQL; il pourrait y avoir trop de codage supplémentaire. Vous devrez donc peut-être appeler des méthodes de référentiel de sorte que cela ressemble presque à mettre SQL dans la spécification. Une mauvaise chose bien sûr. Mais n'oubliez pas, votre programme doit fonctionner à une vitesse raisonnable. Il n'a pas à gagner un prix de pureté DDD. Donc, une réalité de changer de magasin de données pourrait signifier une intervention chirurgicale à l'ancienne tout au long du programme. C'est aussi une mauvaise chose. Mais pas aussi mauvais qu'un programme lent (aka SUCKing). Si la sortie de la boîte sur diverses bases de données est une réalité, vous dupliquerez évidemment les règles métier pour chaque magasin de données pour chaque spécification. Au moins, vous avez le doigt sur la question et vous pouvez utiliser le modèle de stratégie lorsque vous échangez des référentiels. Mais si vous utilisez déjà une base de données spécifique, souvenez-vousYAGNI.
Concernant CQRS: la citation de Fowler par pdr ci-dessus reste vraie ici: "avoir le même modèle conceptuel pour les commandes et les requêtes conduit à un modèle plus complexe qui ne fonctionne pas bien" ... et vous devrez peut-être utiliser CQRS ou similaire. Mais c'est beaucoup plus cher du point de vue du développement et de la maintenance. Si vous êtes un fournisseur de packages en concurrence avec d'autres, cela pourrait payer. Si vous écrivez une application LOB personnalisée pour un client, la recherche de la perfection est un mauvais choix. Vous devez décider si la valeur d'avoir un modèle complètement ou principalement double vaut l'effort supplémentaire. spécificationest un bon compromis car il vous permet de faire cette séparation en une seule petite partie du programme qui en a besoin, avec la rapidité (de développement) et la simplicité d'un modèle. Bonne chance!