Que signifie “programme pour les interfaces, pas implémentations” signifie?
On tombe sur cette phrase lors de la lecture sur les modèles de conception.
Mais je ne le comprends pas, quelqu'un pourrait-il expliquer cela pour moi?
- Double Possible de Que signifie "programme pour une interface"?
Vous devez vous connecter pour publier un commentaire.
De codage par rapport à l'interface de moyens, le code client détient toujours un objet de l'Interface qui est fournie par l'usine. Toute instance retournée par l'usine serait de type Interface qui tout en usine candidat classe doit être mis en œuvre. De cette façon, le programme client n'est pas inquiet au sujet de la mise en œuvre et l'interface de signature détermine ce que toutes les opérations peuvent être effectuées. Ceci peut être utilisé pour modifier le comportement d'un programme au moment de l'exécution. Il vous aide également à écrire loin de meilleurs programmes à partir de la maintenance du point de vue.
Voici un exemple de base pour vous.
MODIFIER
J'ai mis à jour l'exemple ci-dessus et ajouté un résumé de haut-Parleur de la classe de base. Dans cette mise à jour, j'ai ajouté une fonction à tous les Spakers à "SayHello". Tous les haut-parleurs de parler de "Hello World". Donc, c'est une caractéristique commune avec des fonctions similaires. Reportez-vous au diagramme de classe et vous verrez que le haut-Parleur classe abstraite mettre en œuvre ISpeaker interface et les marques de la Parole() abstraite, ce qui signifie que chaque haut-Parleur de la mise en œuvre est responsable de la mise en œuvre de la méthode Parler, car il varie d'un haut-Parleur de haut-Parleur. Mais tous les haut-parleurs de dire "Bonjour" à l'unanimité. Donc, dans l'abstrait, haut-Parleur de la classe, nous définissons une méthode qui dit "Hello World" et chaque haut-Parleur de la mise en œuvre va dériver la méthode SayHello.
Prenons le cas où SpanishSpeaker ne peut pas Dire Bonjour donc, dans ce cas, vous pouvez remplacer la méthode SayHello pour l'espagnol de haut-Parleur et d'élever la bonne exception.
Et nous avons pu obtenir ce comportement en ajoutant simplement une base de classe abstraite de haut-Parleur et quelques modifications mineures dans la mise en œuvre de l'laissant ainsi le programme d'origine inchangé. C'est une fonction de votre choix de n'importe quelle application et il rend votre application facilement maintenable.
List
que le type, de votre demeure peut-être encore en supposant que l'accès aléatoire est rapide à plusieurs reprises d'appelerget(i)
.List aList = new ArrayList()
, vous êtes le codage de laList
interface, de ne pas leArrayList
de mise en œuvre (à l'aide de Java ici). Encore plus, si vous utilisez une classe avec aucune autre interface, tels queStringBuilder bldr = new StringBuilder()
(qui met en œuvre laCharSequence
interface, mais nous ne pouvons ignorer qu'ici) vous sont toujours codage pour une interface, pas de mise en œuvre (le implicite interface publique de la classeStringBuilder
).Penser à une interface comme un contrat entre un objet et ses clients. C'est l'interface spécifie les choses qu'un objet peut faire, et les signatures d'accès à ces choses.
Implémentations sont réels comportements. Disons par exemple que vous avez une méthode sort(). Vous pouvez mettre en œuvre QuickSort ou MergeSort. Qui ne devrait pas question pour le code client en appelant le tri tant que l'interface ne change pas.
Bibliothèques, comme l'API Java et la .NET Framework de faire un usage intensif des interfaces parce que des millions de programmeurs utilisent les objets fournis. Les créateurs de ces bibliothèques doivent être très attention à ne pas modifier l'interface pour les classes dans ces bibliothèques, car il aura une incidence sur tous les programmeurs à l'aide de la bibliothèque. D'autre part, ils peuvent changer la mise en œuvre autant qu'ils le souhaitent.
Si, en tant que programmeur, vous code par rapport à la mise en œuvre dès que ça change votre code d'arrêts de travail. Alors, pensez à les avantages de l'interface de cette façon:
Cela signifie que vous devriez essayer d'écrire votre code de sorte qu'il utilise une abstraction (classe abstraite ou une interface) au lieu de la mise en œuvre directement.
Normalement la mise en œuvre est injecté dans votre code par le constructeur ou d'un appel de méthode. Ainsi, votre code sait à propos de l'interface ou une classe abstraite et peut appeler tout ce qui est défini sur le présent contrat. Comme un objet réel (mise en œuvre de l'interface/classe abstraite) est utilisé, les appels sont opérationnels sur l'objet.
C'est un sous-ensemble de la
Principe de Substitution de Liskov
(LSP), le L de laSOLID
principes.Un exemple dans la .NET serait de code avec
IList
au lieu deList
ouDictionary
, de sorte que vous pouvez utiliser n'importe quelle classe qui implémenteIList
de façon interchangeable dans votre code:Un autre exemple de la Bibliothèque de classes de Base (BCL) est le
ProviderBase
classe abstraite - cela offre une certaine infrastructure, et surtout tous les moyens fournisseur implémentations peuvent être utilisés de façon interchangeable si vous code contre elle.Cette déclaration est à propos de couplage. Une des raisons possibles pour l'utilisation de la programmation orientée objet est de les réutiliser. Ainsi, par exemple, vous pouvez diviser votre algorithme de collaboration entre deux objets A et B. Cela peut être utile pour plus tard la création d'un autre algorithme, qui peut réutiliser l'un ou l'autre des deux objets. Toutefois, lorsque ces objets de communiquer entre eux (envoyer des messages - l'appel de méthodes), ils créent des dépendances entre eux. Mais si vous voulez utiliser l'un sans l'autre, vous devez spécifier ce qu'il faut faire quelque chose d'autre objet C n'ont pour objet que si l'on remplace B. Ces descriptions sont appelées interfaces. Cela permet à Un objet de communiquer sans changer, en fonction de l'objet en s'appuyant sur l'interface. La déclaration que vous avez mentionné dit que si vous prévoyez de réutiliser une partie de l'algorithme (ou plus généralement, d'un programme de), vous devez créer des interfaces et de s'appuyer sur eux, de sorte que vous pouvez changer la mise en œuvre concrète tout moment, sans modifier d'autres objets si vous utilisez la déclaration de l'interface.
Si vous deviez écrire une Classe de Voiture pendant la Combustion,-ère des Voitures, alors il ya une grande chance, vous pouvez implémenter les oilChange() en tant que partie de cette Classe. Mais, quand les voitures électriques sont introduites, il vous serait en difficulté, comme il n'y a pas d'huile de changement pour ces voitures, et pas de mise en œuvre.
La solution au problème est d'avoir un performMaintenance() de l'Interface dans la classe de Voiture et masquer les détails à l'intérieur de la mise en œuvre appropriée. Chaque type de Voiture donnerait sa propre application pour performMaintenance(). En tant que propriétaire d'une Voiture tout ce que vous avez à traiter est performMaintenance() et ne pas s'inquiéter s'adapter quand il y a un CHANGEMENT.
Explication complémentaire:
Vous êtes propriétaire d'une voiture qui possède plusieurs voitures. Vous tailler le service que vous souhaitez externaliser. Dans notre cas, nous souhaitons que de sous-traiter les travaux d'entretien de toutes les voitures.
Vous ne voulez pas à vous soucier de l'associer au type de voiture avec le fournisseur de service. Il suffit juste de préciser lorsque vous voulez planifier l'entretien et à l'appeler. Approprié de l'entreprise de service doit sauter et effectuer les travaux d'entretien.
Autre approche.
Vous appelez le travail et de le faire vous-même. Ici, vous allez faire le travail d'entretien appropriées de travail.
Qu'est-ce que la baisse de la 2ème approche?
Vous ne pouvez pas être l'expert à trouver la meilleure façon d'en faire l'entretien. Votre tâche est de conduire la voiture et d'en profiter. De ne pas être dans l'entreprise de son maintien.
Quel est l'inconvénient de la première approche?
Il est la surcharge de trouver une entreprise etc. Sauf si vous êtes une société de location de voiture, il peut ne pas être en vaut la peine.
Comme d'autres l'ont dit, cela signifie que votre code d'appel ne devrait connaître un résumé parent, PAS la réelle mise en œuvre de la classe qui va faire le travail.
Ce qui aide à comprendre c'est POURQUOI vous devriez toujours programme à une interface. Il y a de nombreuses raisons, mais deux des plus faciles à expliquer sont
1) de Test.
Disons que j'ai la totalité de mon code de base de données dans une seule classe. Si mon programme sait à propos de la classe de béton, je ne peux que tester mon code en cours d'exécution contre cette classe. Je suis aide -> pour dire "parle".
WorkerClass -> DALClass
Cependant, nous allons ajouter une interface pour le mélange.
WorkerClass -> IDAL -> DALClass.
De sorte que le DALClass implémente l'IDAL interface, et la catégorie des travailleurs SEULS les appels par le biais de ce.
Maintenant, si nous voulons écrire des tests pour le code, on pourrait au contraire faire une classe simple qui vient agit comme une base de données.
WorkerClass -> IDAL -> IFakeDAL.
2) Réutilisation
Suivant l'exemple ci-dessus, disons que nous voulons nous déplacer à partir de SQL Server (dont nos béton DALClass utilise) pour MonogoDB. Ce serait faire de grands travaux, mais PAS si nous avons programmé une interface. Dans ce cas, il nous suffit d'écrire la nouvelle classe DB, et le changement (via l'usine)
WorkerClass -> IDAL -> DALClass
à
WorkerClass -> IDAL -> MongoDBClass
interfaces de décrire les fonctionnalités. lors de l'écriture de code impératif, parlez-en sur les fonctionnalités que vous utilisez, plutôt que de certains types ou classes.