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:
Pro passant un object utilisateur unique:
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:
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 …
update(Ssortingng, Ssortingng, Ssortingng...)
ce qui introduit le risque de passer des arguments dans le mauvais ordre. 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.