2017-05-13 1 views
0

Je travaille actuellement sur un projet DDD et j'ai récemment fait face à un problème concernant l'utilisation des DTO.DDD: Utilisation de DTO avec une logique différente

J'ai la DTO suivante dans mon domaine (le code est en php, mais pourrait être dans toutes les langues):

class TranslationDto { 
    private $locale; 
    private $text; 

    public function getLocale(...); 
    public function getText(...); 
} 

L'objectif est que l'interface utilisateur donnera le domaine d'un DTO avec un lieu et son correspondant texte. Ainsi, par exemple, si les paramètres régionaux « FR » ne se traduit pas, le DTO ressemblera à ce qui suit:

// UI => domain, for example when willing to persist the data (write) 
TranslationDto [ 
    'locale' => 'FR', 
    'text' => null, 
] 

Maintenant la question:

Sur le flux interface utilisateur à domaine, si un lieu est non traduite, la valeur $text du DTO sera null. J'ai implémenté le même type de logique du côté Domain-to-UI, ce qui signifie que si les paramètres régionaux ne sont pas traduits, alors la valeur $text du DTO sera null.

Toutefois, un développeur de mon équipe a ajouté une logique de repli. Par exemple, si les paramètres régionaux FR n'existent pas, le domaine renvoie les paramètres régionaux par défaut (par exemple, EN). Le retour objet de domaine à l'interface utilisateur ressemblera alors à ceci:

TranslationDto [ 
    'locale' => 'FR', 
    'text' => 'The fallback text, in english', 
] 

j'embarassed avec cela, comme l'interface utilisateur à domaine « logique » sera brisée par le domaine à l'interface utilisateur « logique » Par conséquent, du point de vue du développeur, nous devrons faire attention à ce DTO en le lisant, car nous ne le ferons pas maintenant s'il était fallback ou non. En d'autres termes: nous ne pouvons pas vraiment "faire confiance" à cette DTO. D'autre part, cette logique de repli est plus pratique sur la couche d'interface utilisateur, car l'interface utilisateur ne se soucie pas de traduire l'objet après l'avoir demandé au domaine: il contiendra toujours le texte correct. De plus, comme nous avons besoin de gérer ces traductions (dans un backend d'administration par exemple), nous aurons maintenant 2 points de terminaison au lieu d'un: un pour demander les DTO avec leur valeur "réelle" (sans repli), et un pour les demander avec leur valeur de repli. Qu'est-ce que vous en pensez, quelle est la meilleure pratique? Ou y a-t-il une meilleure méthode alternative?

Vive

Répondre

1

Tout d'abord, vous ne devriez pas interroger votre domaine afin que le DTO devrait vraiment être juste pour l'interface utilisateur à domaine.

Le côté de la requête peut très bien renvoyer une structure simple pour représenter les données mais l'intention est différente. Comme ces données de localisation ne seront pas fournies par le domaine, vous finirez probablement soit par produire des fichiers de localisation pour interroger directement puis effectuer un repli sur le frontal (disons dans un cas SPA) ou vos fichiers de localisation primaire produits contiennent déjà un repli .

Même si vous deviez retourner une structure, ou même un DTO, et que vous décidez d'effectuer le repli sur le serveur, il peut être utile de fournir le texte de remplacement ou d'indiquer que le texte fourni était une valeur de repli, si:

{ 
    locale: 'fr', 
    text: undefined, 
    fallback: 'Anglais' 
} 

ou,

{ 
    locale: 'fr', 
    text: 'Anglais', 
    fallback: true 
} 

ce que j'ai généralement dans mes solutions SPA fait était d'utiliser i18next.js et il, en interne, prend en charge les solutions de repli depuis une loca de secours le est fourni. Si la ressource demandée est manquante, la solution de repli est récupérée; sinon, la clé demandée est affichée. De toute façon, juste quelques pensées :)