Cela ne répond pas exactement à votre question, mais je vois le contraire de la conception axée sur le domaine comme une conception axée sur la base de données. Dans une conception pilotée par base de données, le schéma de base de données est créé en premier, puis vous créez vos classes en toute connaissance de l'aspect du schéma. L'avantage est que vous comprenez mieux ce qui se passe «sous le capot» et minimisez les effets de l'inadéquation de l'impédance. Cependant, l'inconvénient est que le schéma de base de données, parce qu'il est relationnel plutôt qu'objectif, ne traduit pas vraiment aux objets (par exemple, il n'y a pas de concept de collection dans les bases de données relationnelles). Dans la conception pilotée par domaine, vous créez en théorie vos objets de données comme vous le feriez pour n'importe quelle autre classe, et vous traitez la base de données simplement comme une couche de persistance. En termes de Layman, la base de données est seulement un conteneur de stockage et vous ne vous souciez pas comment les objets sont stockés, seulement qu'ils sont stockés en quelque sorte. Cela élimine le décalage d'impédance et vous avez une chose de moins à s'inquiéter. En pratique, cependant, vous devez toujours être conscient de la façon dont les objets sont stockés, et il peut y avoir des problèmes de performances lorsque l'ORM que vous utilisez essaie de cracher une requête SQL complexe.
Edit:
Voici un exemple de ce que la conception pilotée par le domaine devrait être, en principe. Disons que vous avez une classe de personne, comme si (en C#):
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public ICollection<Person> Relatives { get; set; }
public Company Employer { get; set; }
}
Maintenant, dans une base de données relationnelle, cela traduira probablement 3 tables, une table de personne, table d'adresses, et table de l'entreprise, avec tas de relations entre eux. Cependant, ceci est très différent de la façon dont le programmeur voit cet objet. Le programmeur le voit comme une instance d'un objet Person avec 4 paramètres, dont l'un est ICollection
. Cela ne correspond pas très bien à la structure de la table de base de données, d'où la «non concordance d'impédance», ou en termes de Laymen, une différence de disposition entre le modèle relationnel et le modèle objet.
Dans la conception pilotée par le domaine, je devrais être en mesure de le faire:
Person person = new Person();
// set each property to something
Database.Save(person);
Maintenant, l'objet de personne est sauvée. Je peux le récupérer comme ceci:
Person databasePerson = Database.Get<Person>(idOfPerson);
et il va retourner mon objet Person
, tout comme la façon dont il était avant que je sauvé. De cette façon, je ne suis pas du tout préoccupé par la façon dont la base de données est en train de l'enregistrer, ou de s'inquiéter de la non-concordance d'impédance. Je l'enregistre simplement et le récupère au besoin.
C'est en théorie cependant. En pratique, vous devrez probablement spécifier manuellement le 'mapping', ou comment les classes savent quelle table/colonne dans la base de données pour obtenir des données. Cela peut devenir assez complexe lorsque vous essayez de mapper des types plus complexes tels que des dictionnaires et autres ADT, et aussi lorsque vous essayez de tirer des données de plusieurs tables dans une classe.
Malheureusement, il est très difficile de décrire les avantages dans une réponse courte. Si vous écrivez un système qui contient beaucoup de comportement, par opposition à simplement insérer/mettre à jour/supprimer, vous pouvez bénéficier de l'encapsulation de la logique dans un ensemble de classes (vos modèles de domaine). Vous ne verrez probablement pas les avantages tant que vous n'aurez pas une solution suffisamment grande et que la logique de votre domaine est suffisamment complexe. Dans ce cas, il est très agréable que votre logique de domaine soit encapsulée dans un seul endroit. –