web-dev-qa-db-fra.com

Y a-t-il une telle chose que la programmation orientée protocole?

Je copie/colle mon commentaire de -- this article Sumarizing A Post sur Reddit:

Je ne pense vraiment pas que "l'orientation du protocole" est quelque chose de nouveau ... Vous avez des protocoles dans Obj-C, vous avez des interfaces dans Java, des classes abstraites en C++, etc.

Vous pouvez séparer les interfaces et éviter l'héritage en le remplaçant de composition dans n'importe quel langage OO ...

Aidez-moi à comprendre ce qui rend l'orientation du protocole différente ou nouvelle. Il semble être plus d'un mot à buzz coiné par Apple _ peut-être pousser les développeurs à être conscient et respecter les principes SOLID dans leurs applications ... en aucun cas une mauvaise chose, mais Aussi pas quelque chose de nouveau.

Quelle est la programmation orientée du protocole?

Est-ce un nouveau paradigme de programmation qui pourrait être aussi révolutionnaire que la programmation structurée et abolir le dangereux "goto" de OOP?

Ou simplement une façon d'appliquer de bonne conception solide dans la conception OOP bases de code?

Et puisque rien n'est jamais une balle d'argent, quels sont les pièges de la pop?

3
Lescai Ionel

Apple Inc. appelle des interfaces "Protocoles". Quand ils disent "Orient de protocole", ils signifient la programmation à l'aide d'interfaces au lieu d'héritage.

À partir de là: http://www.tutorialspoint.com/objective_c/objective_c_protocols.htm

Objective-C vous permet de définir des protocoles, qui déclarent que les méthodes devraient être utilisées pour une situation particulière. Les protocoles sont mis en œuvre dans les classes conformes au protocole.

De l'objectif-C successionnement:

Dans l'objectif-C, un protocole est un groupe de méthodes pouvant être mises en œuvre par n'importe quelle classe. Les protocoles sont essentiellement identiques aux interfaces en C # et ont tous deux des objectifs similaires. Ils peuvent être utilisés comme type pseudo-données, ce qui est utile pour s'assurer qu'un objet dactylographié dynamiquement peut répondre à un certain ensemble de messages. Et, étant donné que toute classe peut "adopter" un protocole, ils peuvent être utilisés pour représenter une API partagée entre des classes complètement non liées.

De l'objectif-c pour les débutants absolus:

Apple définit un protocole simplement comme une liste de déclarations de méthodes, non attachées à une définition de classe. Les méthodes énumérées pour les protocoles sont supposées être mises en œuvre par vous.

Ainsi, la programmation orientée du protocole est de savoir ce que l'objectif-C et Swift appellent ce que le reste d'entre nous appelle favorable à la mise en œuvre d'interfaces sur l'extension de classes (héritage).

Est-ce un nouveau paradigme de programmation qui pourrait être aussi révolutionnaire que la programmation structurée et abolir le dangereux "goto" de OOP?

Non, ce n'est rien de nouveau, juste un nom différent utilisé dans le Apple Developer Communitorer. La composition sur l'héritage présente des avantages énormes, bien que cela ait été discuté de manière approfondie dans ce forum.

Et puisque rien n'est jamais une balle d'argent, quels sont les pièges de la pop?

Au début, personne n'est venu à mon esprit, mais je viens de trouver cela dans un forum dans le codéranche, postes par l'utilisateur Jim Yingst:

Un inconvénient des interfaces est celui que vous les publiez à d'autres codeurs en dehors de votre propre contrôle, ils représentent un engagement public qui peut être difficile à changer plus tard. Vous ne savez pas qui d'autre utilise l'interface et que vous ne savez pas comment, vous ne pouvez donc pas simplement ajouter une nouvelle méthode à l'interface sans risquer de casser le code des clients existants (si/quand ils mettent à niveau). En comparaison, si vous avez utilisé une classe abstraite ou en béton, vous pouvez simplement ajouter une nouvelle méthode concrète sans problèmes (généralement).

Il est possible de contourner cela en créant une nouvelle interface avec étend ou complète l'original, puis modifiant vos implémentations concrètes pour implémenter la nouvelle interface, au lieu de ou en plus de l'ancien. De cette façon, vous ne brisez pas le code client existant. C'est généralement plus de travail que d'ajouter une méthode à une classe serait, mais c'est possible.

Cet inconvénient n'est pas une raison d'abandonner les interfaces, mais c'est une raison de concevoir vos interfaces avec précaution et de réfléchir soigneusement avant de publier une nouvelle interface dans une nouvelle version. Passer des efforts supplémentaires concevoir des choses bien maintenant peut vous faire économiser de nombreux maux de tête plus tard.

11
Tulains Córdova

Sur une grande différence entre un protocole SWIFT/Objectif-C et une interface like Java, c'est que les méthodes de l'ancien peuvent avoir implémentations par défaut. Ce n'est pas quelque chose que vous pouvez faire avec un Java interface. C'est presque comme ayant des classes abstraites C++ et une héritage multiple.

Est pop nouveau? Comme mentionné déjà, Objective-C a également des protocoles, alors l'appelant une "nouvelle chose" est un peu d'étirement. Cependant, quoi est Nouveau à Swift=== est la possibilité de mettre en œuvre ces protocoles à l'aide de types de valeur plutôt que de types de référence et c'est le gros problème qui a été présenté dans la présentation d'Apple où Pop a été présenté.

4
Daniel T.