Question

Je sais qu'il ya beaucoup de raisons pour lesquelles vous composeraient un certain objet dans un autre. Certaines écoles de pensée ont explicité les raisons pour architecturer un programme d'une certaine manière par exemple « Conception axée sur les données » ou «conception pilotée par le domaine. Je suis encore un débutant à la POO, et il est souvent difficile pour moi de comprendre pourquoi un objet doit être contenu par un autre. Parfois, je me retrouve avec un objet qui semble impressionnant, et j'arrive au point où je me rends compte, « D'accord, maintenant je dois mettre ce quelque part? » Le raisonnement derrière cela semblable à l'endroit où je décide de mettre un fichier sur mon disque dur?

J'ai quelques principes directeurs pour cela:

  • Si ce modèle une relation dans le monde physique.
  • Si le compositeur a des données nécessaires pour construire l'objet.
  • Si l'objet composé écoutera le compositeur.

Que cherchez-vous lorsque vous prenez cette décision?

Était-ce utile?

La solution

Eh bien, un concept très simple qui m'a aidé à cela est tout simplement le concept de « a » et « est un ». Demandez-vous, est l'objet contenu quelque chose contenant l'objet a, ou est-ce quelque chose de l'objet contenant est? Si c'est quelque chose de l'objet contenant a, alors le confinement est approprié. Sinon, peut-être vous devriez regarder l'héritage.

Un chien est un animal, et a un nez, il est donc:

class Animal
{
}

class Dog : Animal
{
    Nose n;
}

Maintenant, cela fonctionne très bien. Un « problème » avec cette approche est que vous bien quelques nez et les chiens, donc parfois vous verrez des choses comme contenant un pointeur d'interface plutôt qu'un objet, ou vous pourriez Google « injection de dépendances ». Mais, comme le dit le dicton, « a un » et « est un » est souvent suffisant pour le travail du gouvernement près.

Dès le début, essayez beaucoup d'exemples et au fil du temps, il deviendra naturel. Si vous vous retrouvez avec des spaghettis, jeter quelques boulettes de viande et à essayer à nouveau! :)

Autres conseils

Quelles alternatives envisagez-vous? Parlez-vous de confinement par rapport à l'héritage, les commentaires de John Lockwood au sujet de l'aide Hasa et isA cette question.

Ou sont vos parle peut-être au sujet, le confinement par rapport à l'Association? Il existe différentes saveurs de Hasa. Par exemple, une personne peut Haveâ conjoint, mais ne clairement pas containA conjoint. Il y a une différence entre la modification d'un conjoint et la modification d'un nez.

Les types de relation que vous considérez comme:

  • Durée de vie: Est-il judicieux de créer une personne sans nez? Peut-Noses exister sans une personne? une personne peut-elle exister sans un conjoint? Les réponses à ces questions conduisent le genre d'opération que vous choisissez d'avoir sur la personne. Probablement ne ont pas besoin d'une méthode setNose (), mais peut-être que nous avons besoin d'une méthode wipeNose (), et nous ne probablement besoin d'une méthode marier (personne).

  • Cardinalité: Combien de Noses pour une personne? Combien de roues et des sièges fait un véhicule ont? Les réponses à cette déterminer les types de structures de données? Juste une référence? Une liste? Une table de hachage?

Je l'ai trouvé utile de lire sur la modélisation UML, en particulier des diagrammes de classes. Cela reflète une grande expérience de la façon de saisir utilement divers types de relations.

  

Parfois, je me retrouve avec un   objet qui semble impressionnant, et je   arriver au point où je me rends compte,   « D'accord, maintenant je dois mettre cette   quelque part? "

De la phrase ci-dessus, il semble que vous essayez de concevoir de bas vers le haut. L'une des années chose que j'ai appris au fil des ans est que la conception de haut vers le bas est le chemin à parcourir. Vous ne devez écrire la classe après que vous savez où il doit être utilisé . Sinon, vous venez de finir d'écrire des classes qui « semble impressionnant » et contient un code qui pourrait ne pas être utile à tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top