2017-09-30 6 views
-1

Si je suis un principe d'injection de dépendances pour un design de classe, je devrais m'assurer que ma classe n'essaie pas d'instancier ses dépendances dans ma classe, mais plutôt de demander l'objet via le constructeur. De cette façon, j'ai le contrôle des dépendances que je fournis pour la classe lors des tests unitaires. C'est ce que je comprends. Mais ce dont je ne suis pas sûr, est-ce que cela signifie qu'un bon design de classe qui suit le principe de l'injection de dépendances signifie que ses champs ne devraient jamais être initialisés en ligne? Devrions-nous totalement éviter l'initialisation en ligne pour produire du code testable?L'injection de dépendance signifie-t-elle pas d'initialisation en ligne?

EDIT

Quel est le meilleur 1 ou 2?

public class Car { 
     private Tire tire = new Tire(); // 
    } 
public class Car { 

    private Tire tire; 
    public Car(Tire tire) { 
     this.tire = tire 
    } 
} 
+0

Cela dépend évidemment des types de champs.Cela n'a aucun sens d'injecter des types "basiques" comme des classes "Number", "date" ("java.time") ou par exemple "StringBuilder", quand vous en avez seulement besoin dans cette classe. – Tom

+1

Que voulez-vous dire par "initialisation en ligne"? Que les champs sont initialisés dans le constructeur par la classe elle-même ou quoi? – lexicore

+0

* Je devrais m'assurer que ma classe n'essaie pas d'instancier ses dépendances dans ma classe *: Absolument. Néanmoins, c'est exactement ce que fait votre premier extrait. Donc vous avez votre réponse. La dépendance doit être fournie depuis l'extérieur de la classe. Ce n'est clairement pas le cas de votre premier extrait. –

Répondre

0

À mon avis, En général, si vous pensez que le champ de données est une dépendance, puis laisser le conteneur de gestion des dépendances doit gérer. Ce qui compte une dépendance et ce qui n'est pas une dépendance est une question difficile, et vous seul pouvez décider. Par exemple: si votre conception de voiture permet de travailler avec différents types de pneus, alors c'est une dépendance. Sinon, dans une voiture de classe, vous devrez travailler avec une sorte de TyreFactory, ce qui n'est pas vraiment raisonnable.

Si vous travaillez avec un conteneur DI, tester la classe sera un jeu d'enfant. Vous devrez fournir un talon/mock à la classe qui est évidemment un avantage réel. Donc, dans votre exemple, si vous allez avec la première solution alors, comment allez-vous tester que votre voiture fonctionne avec différents types de pneus?

0

Non, cela ne signifie certainement pas l'initialisation en ligne. Je ne suis pas un utilisateur Java mais ce terme est pertinent pour de nombreux langages de programmation. Fondamentalement, au lieu d'avoir vos objets créant une dépendance ou demandant à un objet d'usine d'en créer un pour eux, vous passez les dépendances nécessaires dans l'objet en externe, et vous en faites le problème de quelqu'un d'autre.

public SomeClass() { 
    myObject = Factory.getObject(); 
} 

"injection de dépendance" est un terme de 25 dollars pour un concept de 5 cents. [...] L'injection de dépendance consiste à donner à un objet ses variables d'instance. [...].

L'injection de dépendances fournit essentiellement les objets dont un objet a besoin (ses dépendances) au lieu de le construire lui-même. C'est une technique très utile pour tester, car elle permet de se moquer des dépendances ou de les écrabouiller.

Toute application est composée de nombreux objets qui collaborent entre eux pour effectuer des tâches utiles. Traditionnellement, chaque objet est responsable de l'obtention de ses propres références aux objets dépendants (dépendances) avec lesquels il collabore. Cela conduit à des classes fortement couplées et à du code difficile à tester.

A lot of reference from here