2010-10-08 21 views
1

je le constructeur suivant pour ma classeInjection dépendante OU objet de configuration?

public MyClass(File f1, File f2, File f3, Class1 c1, Class2 c2, Class3 c3) 
{ 
.......... 
} 

Comme on le voit, il a 6 paramètres. En voyant ce code, un de mes aînés a dit qu'au lieu de passer 6 paramètres je devrais plutôt passer un objet de configuration.

J'ai écrit le code de cette façon parce que j'ai lu récemment "Dependency injection", qui dit que "les classes doivent demander ce qu'elles veulent". Donc je pense que passer un objet de configuration sera contre le principe.

Mon interprétation de "injection de dépendances" est-elle correcte? OU Devrais-je prendre le conseil de mon aîné?

+0

Comment propose-t-il d'instancier l'objet "configuration"? Je pense, en général, que votre approche est bonne. Mais je suis un peu inquiet que vous y passiez trop de choses. –

+0

L'objet de configuration utilise la classe Java Properties. Il a besoin d'un fichier .properties. – athena

Répondre

10

"Objet de configuration" est un terme obtus à appliquer dans cette situation; il encadre vos efforts dans un sens purement mécanique. L'objectif est de communiquer votre intention au consommateur de la classe; Réfléchissons à cela.

Des méthodes ou des constructeurs avec de nombreux paramètres indiquent une relation lâche entre eux. Le consommateur doit généralement faire plus d'inférences pour comprendre l'API. Quelle est la particularité de ces 3 fichiers ainsi que ces 3 classes? C'est l'information qui n'a pas été communiquée.

Ceci est une opportunité pour créer une interface plus significative et révélatrice d'intention en extrayant un concept explicite d'un concept implicite. Par exemple, si les 3 fichiers sont liés à cause d'un utilisateur, un paramètre UserFileSet l'exprimerait clairement. Peut-être f1 est apparenté à c1, f2 à c2, et f3 à c3. La déclaration de ces associations en tant que classes indépendantes réduit de moitié le nombre de paramètres et augmente la quantité d'informations pouvant être dérivées de votre API.

En fin de compte, le refactoring dépendra fortement de votre domaine de problème. Ne supposez pas que vous devriez créer un seul objet pour remplir une liste de paramètres; essayer de refactoriser le long des contours des relations entre les paramètres. Cela donnera toujours un code qui reflète le problème qu'il résout plus que le langage utilisé pour le résoudre.

+1

Je seconde chaque mot de ce :) – vulkanino

2

Je ne pense pas que l'utilisation d'un objet de configuration contredit l'utilisation d'un modèle d'injection de dépendance. Il s'agit plus de la forme dans laquelle vous injectez vos dépendances et une question générale de savoir s'il est préférable d'avoir une fonction (dans ce cas le constructeur) qui prend 20 paramètres ou combine ces paramètres dans une classe afin qu'ils soient regroupés. Vous pouvez toujours utiliser l'injection de dépendance, c'est-à-dire construire l'objet de configuration par une fabrique ou un conteneur et l'injecter dans le constructeur lors de la création d'une instance de votre classe. Que ce soit ou non une bonne idée dépend également du cas particulier, il n'y a pas de balles d'argent;)

+0

Dans notre projet, il n'y a qu'un seul objet de configuration, qui contient toutes les propriétés. Mon souci de l'utiliser était que, je vais devoir créer l'objet de Class1, Class2 et Class3 à l'intérieur de mon constructeur. Cela semble être contre le principe de "l'injection de dépendance". – athena

+0

Bien sûr, c'est une autre question comment les objets de Class1 etc.être créé, mais du point de vue de la classe MyClass ils sont injectés des dépendances qu'ils soient passés individuellement ou ensemble dans un objet. Dans quel constructeur instanciez-vous Class1 etc. - dans le constructeur de l'objet de configuration? –

+0

Oui. Tous les objets requis sont instanciés dans le constructeur de l'objet de configuration. Je suis confus parce que je ne comprends pas comment utiliser un objet de configuration est différent de l'utilisation d'une usine. – athena