20. 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
21. QuestionRepository
final class Question
{
public static function ask(
QuestionIdentifier $id,
Author $author,
$text,
array $options,
DateTimeImmutable $endDate
) {
}
private function __construct(...)
{
}
24. 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
30. Une spécification avec paramètres
<?php
namespace GBProdICantDecideCoreDomainSpecificationQuestion;
use GBProdSpecificationCompositeSpecification;
class HasMoreVoteThan extends CompositeSpecification
{
public function __construct($minVote)
{
$this->minVotes = $minVotes;
}
public function isSatisfiedBy($candidate)
{
[...]
31. Composition
<?php
$manyVotes = new HasMoreVoteThan(1000);
$available = new IsAvailable();
$byMe = new IsAskedBy(‘gbprod’);
$isPopular = $available
->andX($manyVotes)
->andX($byMe->not())
;
$isPopular>isSatifiedBy($question);