2012-05-14 4 views
1

Disons que j'ai un objet générique, Personne. Une personne a un nom et un nom de genre doit être une chaîne, et le genre doit être male ou female. J'ai aussi un objet de collection, PersonList, qui a un tableau d'objets Person et permet des opérations sur l'ensemble (par exemple, retourner une liste de personnes d'un certain sexe.)Instancier des objets de collection

D'une part, ce serait bien pour créer le PersonList avec les données dans le constructeur ...

list = new PersonList([new Person('Alice', 'Female'), ...]); 

... mais nous ne savons pas si les données sont valides. Nous pouvons permettre à des objets personne invalide et vérifier leur validité lorsque nous les accès, ou nous pouvons donner une méthode personne vaild() et dire ...

list = new PersonList(); 
alice = new Person('Alice', 'Female'); 
if (alice->valid()) list->add(alice); 

... ou peut-être nous vérifions valide() dans ajouter(). Mais il me semble étrange d'avoir une méthode valide() du tout.

En général, comment instancieriez-vous ces objets? Est-ce une chose subjective, ou existe-t-il une «bonne voie» universelle?

Répondre

1

Si vous faites confiance à vous-même pour ne jamais créer d'objets invalides, vous n'avez pas vraiment besoin d'une méthode pour vérifier la validité. Cependant, si vous créez des objets potentiellement invalides en fonction des données de l'utilisateur, vous devriez avoir une méthode de vérification de la validité, et appeler cette méthode devrait être la dernière chose que fait le constructeur. Si des transformations de cet objet peuvent se produire et rendre invalide, cette méthode devrait également être appelée immédiatement après que lesdites transformations se sont produites. Les objets non valides devraient être attrapés instantanément, et l'utilisateur final de la classe ne devrait jamais avoir à s'en soucier, au-delà d'être jeté l'exception occasionnelle.

+0

D'accord, cela a du sens. Cela signifie-t-il que nous ne devrions jamais autoriser des objets invalides dans notre liste (plutôt que de les autoriser, mais de les marquer comme non valides et de les corriger plus tard)? Et si notre constructeur de liste reçoit une personne invalide, comment indiquons-nous que notre liste n'a pas été créée comme prévu? Cela ressemble à un argument pour ne pas avoir un constructeur, et à la place, l'utilisateur ajoute() chaque personne individuellement. ... ou est-ce si spécifique que la réponse est "ça dépend"? – ajp5103

+0

Si vous suivez les directives que j'ai énoncées ci-dessus, il ne devrait jamais y avoir d'objets Personne invalides, car toute possibilité de créer un est accompagnée d'une vérification pour s'assurer que cela ne s'est pas produit. S'il n'y a aucune personne invalide, votre liste ne doit jamais s'inquiéter de la possibilité. Vous pouvez avoir un constructeur pour votre PersonList si vous le souhaitez. Tout objet Person invalide sera intercepté avant que le constructeur de PersonList ne les voit. –

+0

Donc, vous dites de lancer une exception dès que la personne est jugée invalide? – ajp5103

0
  1. Une classe comme PersonList n'est pas générique. Il est couplé à Person.
  2. Il n'est pas clair pourquoi vous pensez que vos données codées en dur pourraient ne pas être valides.
  3. S'il est possible de construire un objet qui est dans un certain sens invalide, alors vous devriez toujours avoir une méthode pour tester sa validité dans ce sens.
+0

1. Vraiment, je ne sais pas pourquoi j'ai dit ça. 2. Ce serait des données utilisateur. 3. Merci! – ajp5103

Questions connexes