8
votes

Oop meilleure pratique: employé.getcars () vs voitures.getByemployee ()

Compte tenu des classes société , Employee et voiture Quelle est la pratique préférée pour les méthodes pour récupérer des voitures associées à une entreprise ou à l'employé? < Pré> xxx

ou: xxx

La première approche est celle que j'ai généralement utilisée et semblait toujours la plus intuitive pour moi. Mais après avoir vu une grande base de code qui a utilisé la deuxième approche, je dois admettre que cela se développe sur moi. Les deux choses que j'aime vraiment sur la deuxième approche sont les suivantes:

  • Il regroupe tous voiture Code associé ensemble dans un fichier, ce qui rend le code plus modulaire et plus facile à entretenir.
  • Il y a une logique intuitive à avoir une méthode avec une valeur de retour de voiture (ou plus comme list dans ce cas) groupé dans le Voiture classe.

    Y a-t-il une meilleure pratique qui couvre cela?


3 commentaires

Choisissez un ensemble de conventions et de règles concernant ces choses et rendez-les simplement conformes à chaque scénario similaire qui présente cette même décision. Le résultat de la décision est relativement sans importance.


De plus, dépend de ce que vous suivez, si cela va souvent être 4 voitures à un employé, je ferais des employés.gecars () parce qu'il rétrécit le champ dès le départ, mais si vous avez des millions d'employés et très peu de voitures , Je ferais des voitures.betbyemployee alors que les voitures seront le plus petit ensemble. Je suppose que je dis que je préfère: sous-ensemble.getsemperset () de sorte que la sélection plus étroite est la classe.


@JIMMY: Je n'appellerais pas nécessairement des voitures un sous-ensemble d'employés à moins que vous n'ayez un penchant d'embaucher des véhicules sensibles, mais je suis d'accord avec le point général que vous faites.


8 Réponses :


7
votes

J'utiliserais la première approche dans les classes d'entités. Il ne devrait y avoir aucun paramètre à ces méthodes car ils ne renvoient que toutes les associations. La deuxième approche qui implique une logique d'entreprise simple devrait être placée dans une classe d'assistance ou peut-être le Cardao, si vous en avez un.


1 commentaires

Grande suggestion TOB! J'aime vraiment cette approche car elle offre le meilleur des deux mondes.



-1
votes

C'est tout sur les relatives à la relève. Un employé peut-il avoir plus d'une voiture? (1: N) Ne faites jamais référence au 1 côté du côté N, c'est ce que mon professeur a dit. Idem pour les autres choses. Si vous avez un 1: 1, vous pouvez faire les deux. Employé.getcar et Car.Getowner; -)


1 commentaires

Il n'y a rien de mal à vouloir utiliser Employee.gecars () et Car.getdrivers (). et Vous ne répondez pas à la question, qui concerne Car.getcarsbyBewewner ().



2
votes

Je pense qu'il n'y a pas une solution unique. Cela dépend de la façon dont vous discutez. Si c'est responsable des voitures de savoir par qui ils appartiennent, je voudrais utiliser la deuxième approche. Mais s'il s'agit de la responsabilité de l'employé de savoir quelles voitures il a, alors j'utiliserais la première approche.

Cependant, je préférerais personnellement la première approche car elle semble être plus facile à mettre en œuvre.


0 commentaires

2
votes

Un employé a une voiture (ou certaines voitures, d'ailleurs), chaque employé sait naturellement quelles voitures qu'il utilise. Mais la voiture savait-elle ou soin de qui "possède"? Je dirais non. Cela peut savoir qui le conduit, mais c'est une question différente.

Soit la voiture saise quel employé le possède (ce qui est faux, c'est une relation étrange a-une relation), ou il doit rechercher tous les employés de se retrouver, ce qui est encore pire (illogique, lent, tout mais lâche couplage).


0 commentaires

2
votes

Les deux approches me paraissent un peu moi-même. Pourquoi le cours des employés devrait-il savoir sur la classe de voiture? Pourquoi la classe de voiture devrait-elle savoir sur l'employé? Aucune des classes n'a besoin de l'autre pour fonctionner, alors les coupler sont inutiles. Je ne ferais que stocker un dictionnaire quelque part qui a cartographié les employés à une collection de voitures et une autre que les entreprises mappées à une collection de voitures.


3 commentaires

Pourquoi une classe d'employés devrait-elle savoir sur l'âge ou le salaire de l'employé? Il suffit de faire une carte (une pour chaque attribut)! Et après un certain temps, quelqu'un décide de collecter toutes les cartes liées à la classe des employés dans une classe ...


Le problème ici est couplant. En général, vous devriez éviter de coupler une classe à une autre chaque fois que possible.


Je n'ai même pas pensé à cela, grand point, peut-être que la méthode appartient à une classe DAL et au lieu de retourner un employé qui a une liste de voitures, retourne un employé de classe dimensionnellebycar qui se comporte comme tuple ou quelque chose de la nature comme tuple



1
votes

Il n'y a pas de meilleur moyen. Cela dépend de ce que votre application doit faire. Deux applications utilisant les mêmes données peuvent avoir des modèles d'objet complètement différents, en fonction de leurs cas d'utilisation.


0 commentaires

1
votes

Exécuter ce problème par la loi du traitement de la logique Demeter. Très serviable, juste! hehe

La question est présentée d'une manière qui aura toujours un couplage entre les employés et les classes de voiture. Si vous pouvez modifier car.getbyemployee (...) à car.getbydriverslicensenumber (...) (ou quelque chose de similiaire) alors vous découpleriez les deux classes.

La meilleure approche serait de réduire le nombre d'objets couplés. Donc, tout dépend de la manière dont l'objet de niveau suivant dans la chaîne sera la voiture.

Je ne pense pas qu'il y ait une droite awwer à cette question, tout est sur la situation actuelle.


1 commentaires

FYI: Je sais que vous n'avez pas violé la loi de Demeter. Je suggère que les programmeurs américains devraient y penser avant que des violations ne se produisent.



0
votes

ni.

avoir une interface appelée icarowner implémenté par Employee et société (ou leurs dérivations), puis créez la classe la compagnie d'accueil avec attributs voiture (de type voiture ou icar ) et propriétaire (de type ICARELER ).

Lorsque vous devez avoir besoin de trouver une propriété de voiture, vous n'avez pas besoin de vous soucier de si le propriétaire est un employé ou une entreprise. Vous avez juste besoin de faire Chernowershersks.EtByByWeler (ICARELER) .

J'espère que cela vous aidera.


0 commentaires