2009-05-06 7 views
1

Disons que j'ai une classe Person qui a une collection d'objets Dog. La relation est bidirectionnelle.Les objets de domaine d'application Web contenant des collections doivent-ils avoir des méthodes d'élément "ajouter" et "supprimer"?

public class Person { 
    private List<Dog> dogs; 
    // getter and setter for dogs 
} 

public class Dog { 
    private Person person; 
    // getter and setter for person 
} 

Ok maintenant, si je viens de travailler avec ces objets, j'avoir des méthodes en personne pour ajouter un chien et la suppression d'un chien, de sorte que le client ne fonctionne pas directement avec la collection.

public void removeDog(Dog dog) { 
    dogs.remove(dog); 
    dog.setPerson(null); 
} 

public void addDog(Dog dog) { 
    dog.setPerson(this); 
    dogs.add(dog); 
} 

ou quelque chose dans le même sens.

Ma question vient lorsque vous travaillez avec ces objets dans la couche de service. Je peux ajouter un nouveau chien à une personne via addDog et simplement enregistrer la personne qui persistera automatiquement le nouveau chien. Cependant, enlever un chien via removeDog puis enregistrer la personne ne supprimera pas automatiquement le chien du stockage persistant ... il va juste mettre la référence du chien à null.

donc je me retrouve avec quelque chose comme:

Dog dog = dogDAO.getDogById(int id); 
dogDAO.remove(dog); 

Parce que c'est une application web et des personnes et les chiens ne sont pas conservées dans la mémoire, cela fonctionne très bien, et je jamais appelé Person.removeDog(). La prochaine fois que je chargerai la personne qui a initialement référé ce chien, elle ne contiendra pas le chien parce qu'il a été retiré du stockage. La même chose peut demander d'ajouter un chien:

Person person = personDAO.getPersonById(int id); 
Dog dog = new Dog(); 
dog.setPerson(person); 
dogDAO.save(dog); 

Encore une fois cela fonctionne très bien même et je jamais appelé Person.addDog().

Y a-t-il un quelconque intérêt à avoir les méthodes addDog et removeDog dans ma classe Person?

Répondre

1

Ceci est toujours difficile à faire sans intervention manuelle. Une fois que vous supprimez la référence d'objet et avez un objet périmé. Dans l'autre cas, vous supprimez simplement l'objet sur lequel pointe un autre objet (la liste). Cela devrait aussi être un problème. Si cela est accepté paresseusement, cela couvrira beaucoup d'erreurs.

Pour simplifier, vous pouvez ajouter l'opération dao remove à la personne removeDog(), mais le cas d'utilisation qui consiste à retirer le chien d'une personne et à l'ajouter à une autre ne serait pas possible. Quel est le problème que vous retirez le chien de la personne, puis le retirer de la persistance si vous savez qu'il doit être retiré du tout? Vous épargnez une étape. Donc, retour le chien enlevé vous apportera un modèle de

dogDAO.remove(person.removeDog(dog)) 

Avoir l'ajout et de suppression en personne vous permet non seulement de mimer le comportement de la liste, mais aussi d'avoir des fonctionnalités supplémentaires. Dans votre cas, il est difficile de décider parce que c'est une configuration facile et cela dépend de la façon dont les choses sont dao et où vous voulez mettre cela.

Vous devriez au moins avoir une impression de chaque cas d'utilisation que vous voulez prendre en charge. Ensuite, les liens et paramètres d'objets obligatoires et facultatifs doivent être définis. Avec un peu de pragmatisme (par exemple, coupler la persistance avec les objets), nous avons la possibilité d'effectuer une configuration orientée objet qui est facile (et par conséquent moins sujette aux erreurs)

1

Si, logiquement, ajouter et supprimer des chiens de personnes est comment cela sera fait, alors il n'y a aucune raison d'avoir des méthodes pour ajouter et retirer des personnes de chiens. Votre objectif est que votre modèle de données soit toujours dans un état cohérent. Si vous autorisez le retrait des chiens, le chien devra se retirer de la personne pour que votre modèle de données reste cohérent. Ensuite, vous devrez éviter la récursivité.

Il semble que la façon dont vous l'avez est bien et clair et sans ambiguïté. Si vous le souhaitez, vous pouvez toujours ajouter un commentaire à la classe Dog pour ajouter qu'il est utile qu'il n'y ait aucune méthode addPerson et removePerson, et que cela soit fait en enlevant le chien de la personne ou en ajoutant le chien à la personne.

Il n'y a pas besoin de symétrie parfaite ou d'orthogonalité parfaite dans le code. L'objectif n'est pas pour cela, mais pour garder votre modèle de données cohérent d'une manière propre et compréhensible.

Questions connexes