Utiliser langage commun dans le modèle ● Utiliser des constructeurs nommés ● Tous les paramètres obligatoires sont dans le constructeur ● Utiliser des méthodes plutôt que des setters ● Rendre les classes du domaines finales ● Utiliser des factories
Avec doctrine ? ● Utilisez le type embeddable pour les Object Value ● Utilisez le YAML/XML au lieu des annotations (dans la couche infrastructure) ● Attention aux jointures ● Les id en Object Value, c’est possible
QuestionRepository namespace GBProd\ICantDecide\CoreDomain\Question; interface QuestionRepository { public function find(QuestionIdentifier $id); public function save(Question $question); }
Une spécification namespace GBProd\ICantDecide\CoreDomain\Specification\Question; use GBProd\Specification\CompositeSpecification; class IsAvailable extends CompositeSpecification { public function isSatisfiedBy($candidate) { return $candidate->getEndDate() > new \DateTime('now'); } }
Une spécification avec paramètres namespace GBProd\ICantDecide\CoreDomain\Specification\Question; use GBProd\Specification\CompositeSpecification; class HasMoreVoteThan extends CompositeSpecification { public function __construct($minVote) { $this->minVotes = $minVotes; } public function isSatisfiedBy($candidate) { [...]