Est-il préférable de faire référence à un object ou de passer des atsortingbuts individuels dans un object en Java?

J’ai affaire à un code hérité et je vois constamment des appels de méthode avec plusieurs atsortingbuts du même object transmis dans une méthode:

update(user.getID(), user.getLanguage() etc...) 

Existe-t-il un avantage ou un inconvénient à le faire de cette manière ou devrais-je simplement passer l’object utilisateur (dans ce cas) et gérer les atsortingbuts de la méthode appelée?

Suivre:

Beaucoup d’excellentes réponses, merci. Toutes mes excuses pour le manque de précision dans la question, mais comme je l’ai dit, cela se voit dans tout le système sur lequel je travaille et cela semblait être un bel exemple simple. N’hésitez pas à transformer cette question en une question de wiki communautaire car aucune réponse ne peut être acceptée par rapport aux autres car elles sont toutes bonnes et ont des points valables.

Les deux ont leurs avantages. Je déciderais pour chaque méthode en fonction de ce qu’elle est censée faire. Pour le code hérité, cependant, je préférerais ne rien changer à moins d’un problème.

Pro plusieurs valeurs, référence d’object con:

  • vous n’êtes pas lié à une classe spécifique, vous pouvez transmettre des valeurs d’autres sources
  • méthode ne peut pas (de manière inattendue) modifier l’état de l’object (C ++ pourrait utiliser “const” pour cela)

Pro passant un object utilisateur unique:

  • vous êtes lié aux objects utilisateur, ce qui rend difficile la transmission accidentelle de valeurs non liées / invalides
  • il est évident que la méthode attend des données d’un object utilisateur
  • changer (par exemple, renommer) un getter nécessite des modifications à tous les invocations de la méthode et pas seulement dans sa mise en œuvre
  • similaire si une nouvelle propriété est ajoutée et doit être transmise
  • méthode peut changer l’état de l’object

Comme vous le voyez, une propriété peut être considérée comme un avantage ou un inconvénient en fonction de vos besoins.

En fait, il serait beaucoup, beaucoup mieux de passer une référence à l’object, pour deux raisons:

  • il évite la répétition de tous les accesseurs partout où la méthode est appelée (principe DRY)
  • cela conduit à des signatures de méthode plus courtes. Les méthodes ne devraient presque jamais avoir plus de trois parameters car il est trop facile de confondre la commande et difficile à refactoriser.

Pour éviter des listes de parameters trop longues, le refactoring recommandé consiste à créer un object contenant toutes les données. N’avez-vous pas la chance d’avoir déjà un tel object?

Cela dépend si vous acceptez la dépendance de la classe d’object de la méthode d’appel.

Lorsque vous utilisez cette

 update(user) 

La classe où la mise à jour est déclarée doit connaître la classe de l’utilisateur.

Si vous utilisez cette

 update(user.getID(), user.getLanguage() etc...) 

et les membres sont des primitives ou appartiennent à la bibliothèque standard Java, il n’y a plus de dépendance dans update () avec la classe de l’utilisateur …

  1. Ça a l’air bizarre
  2. Cela signifie que la signature de la méthode ressemble à update(Ssortingng, Ssortingng, Ssortingng...) ce qui introduit le risque de passer des arguments dans le mauvais ordre.
  3. Si vous devez prendre en compte un nouvel atsortingbut dans votre méthode de mise à jour à un moment donné, vous n’aurez pas besoin de modifier la signature de la méthode, mais uniquement son implémentation.
  4. Je ne sais pas ce que fait la update , mais il pourrait être judicieux de l’intégrer à la classe utilisateur: user.update(additionalInformation) .

Pour mon expérience, j’ai pensé que cela dépend de la méthode, si elle est liée à l’object contenant tous les parameters, il est préférable de passer l’object, par exemple dans un object DAO effectuant une mise à jour ou une sauvegarde. vaut mieux passer l’object Domain, sinon si la méthode est plus générique, et il est possible que tous les parameters ne proviennent pas du même object, il vaut mieux passer les parameters à la méthode.

C’est une sorte d’odeur de code qui me ferait penser à déplacer la méthode update () vers la classe utilisateur. L’un des grands principes de la conception orientée object est l’ encapsulation – regroupez vos données et vos opérations sur ces données.

Ensuite, vous avez le principe de dire, ne pas demander . Il vaut mieux dire à un object de faire quelque chose que de lui demander des informations.

Le code de procédure obtient des informations, puis prend des décisions. Le code orienté object indique aux objects de faire des choses.

Bien sûr, je n’ai pas assez de détails pour dire que vous devriez absolument faire une telle chose, mais c’est une chose à considérer.

C’est un peu difficile de dire ce que sont les mises à jour de votre méthode à partir de votre extrait de code. Mais si vous passez dans l’object utilisateur, vous aurez mis l’object utilisateur à la méthode. Si vous ne passez que des chaînes, des entiers, etc., vous pouvez utiliser la méthode avec des sources autres que l’utilisateur. Mon conseil est que vous ne devez pas forcer la méthode à être plus spécifique que nécessaire.

Étant donné que vous avez affaire à un code existant, vous devez vous assurer que le changement de méthode

la signature ne casse aucun code susceptible de l’appeler. Si vous avez un contrôle complet sur la base de code qui appellerait ces méthodes, alors oui, vous pouvez simplifier le code en transmettant simplement l’object user .

Vous devez également déterminer si l’object utilisateur doit utiliser un object «lourd» qui charge des données supplémentaires qui pourraient être inutiles à créer, chaque fois que vous appelez ces méthodes. Ce serait une des raisons pour lesquelles vous ne pouvez pas transmettre l’object user tant que paramètre. La même raison s’applique aux objects chargés paresseux.

L’autre raison possible pour ne pas transmettre l’object entier peut être que vous ne voulez pas qu’il soit mis à jour par la méthode et pour “une raison quelconque” ne peut être rendu immuable. Les méthodes d’accesseur pour les objects utilisateur peuvent être configurées pour renvoyer des “copies défensives sûres” des valeurs. Voir le code Java efficace de Joshua Bloch pour ce type de pratique de codage particulièrement utile dans les applications multi-thread.

Il n’y a aucun avantage à transmettre les propriétés d’ un object en tant qu’arguments séparés à une méthode. L’inconvénient est que le code devient difficile à lire et à maintenir. Les arguments inférieurs, le mieux. Si vous pouvez combiner les arguments dans un object, faites-le simplement.

Il existe une technique de refactorisation, au cas où vous souhaitiez refactoriser cela, appelée Conserver l’object entier . Vous pourriez également trouver ma réponse sur le même sujet utile.