Quels sont les avantages et les inconvénients d'écrire des méthodes de classe dans les classes de domaine grails ? Je pose la question parce que je ne vois pas souvent de projets grails avec des méthodes dans les classes de domaine, seulement des membres de données. Y a-t-il un inconvénient à le faire ?
Réponses
Trop de publicités?Lorsqu'une classe de domaine (pas seulement dans grails, mais dans la programmation orientée objet en général), ceci est connu comme un modèle de domaine anémique . Martin Fowler propose que la logique du domaine soit placée dans la classe du domaine pour créer un modèle de domaine riche. En procédant ainsi, les classes de domaine deviennent plus intelligentes et savent comment effectuer des opérations, plutôt que d'avoir une autre classe de service qui doit opérer sur la classe de domaine. L'avantage d'avoir un modèle de domaine riche est que la classe encapsule davantage son propre comportement et qu'elle est plus autonome. D'un autre côté, cela rend la classe de domaine plus complexe. Cependant, je pense que la classe de domaine devrait être plus qu'un simple objet d'entreprise.
Dans grails, j'ai tendance à essayer d'utiliser une combinaison d'un modèle de domaine riche et de l'utilisation de services. Il est difficile de dire de manière générale quand une méthode doit se trouver dans une classe de domaine et quand elle doit se trouver dans un service. En règle générale, cependant, si une opération est complexe et nécessite plusieurs collaborateurs, j'aurai tendance à la placer dans une classe de service. Si la méthode semble devoir avoir un comportement sur la classe de domaine, je l'y mettrai.
Pour donner un exemple plus concret, prenons une Person
classe.
class Person {
String firstName
String lastName
List<Person> friends
}
Dans notre application, une personne peut parler. Maintenant je peux avoir un TalkService
qui sait comment une personne parle. Mais dans ce cas, je pense que talk
est un comportement essentiel de la personne, donc j'ajouterais un talk
pour Person
.
Supposons que je dispose également d'une fonctionnalité qui me permette de trouver tous les amis des amis des personnes (amis au second degré). Pour moi, ce n'est pas le comportement de base d'une application Person
Je veux donc déléguer cette tâche à un service.
Pour récapituler, en général, j'ajoute des méthodes à la classe de domaine lorsqu'il s'agit du comportement de base de l'objet (par exemple, il s'agit d'une méthode de domaine), sinon, je les mets dans un service.
Dans un projet Java, vous devez avoir des classes POJO qui représentent le modèle. Par exemple : Personne, Facture, Livre, ...
Ensuite, il y a la couche de service, qui contient des interfaces pour que les utilisateurs puissent effectuer des requêtes de base de données, elle prend en paramètres votre modèle, et renvoie également le modèle, et il y a la couche de contrôleur qui est responsable de la redirection et de l'injection de vos services.
Dans grails, cela est très facile en utilisant l'injection de services dans votre contrôleur.
Maintenant, quand avons-nous besoin d'utiliser des méthodes à l'intérieur des classes de domaine ? C'est lorsque seul le modèle est responsable de ce que nous devons faire, par exemple, quel âge a une personne X (c'est à partir de la date de naissance), combien d'articles existent dans une facture (à partir de la liste), l'idée est que nous utilisons cela seulement lorsque nous manipulons les données de l'objet actuel.
Pour la méthode de sauvegarde par exemple, vous ne pouvez pas l'ajouter dans votre modèle
PersonController :
def personService
def save() {
...
Person person = ...
personService.save(person);
...
}
C'est plus évolutif