Qu'est-ce que la programmation orientée Protocole dans Swift? Quelle valeur ajoutée apporte-t-il?

Voir Vues orientées protocole vidéo. Je trouve cette vidéo plus basique et plus facile à trouver un cas d'utilisation facile. La vidéo WWDC elle-même est un peu avancée et nécessite plus de largeur.


Du propre site Web D'Apple: "au cœur de la conception de Swift se trouvent deux idées incroyablement puissantes: programmation orientée protocole et sémantique de valeur de première classe."

Quelqu'un peut-il préciser ce qu'est exactement la programmation orientée protocole, et quelle valeur ajoutée cela représente-t-il apporter?

J'ai lu CE et regardé la programmation orientée Protocole dans Swift video , mais venant D'un arrière-plan Objective-C ne l'a toujours pas compris. Je demande gentiment une très réponse en anglais simple avec des extraits de code et des détails techniques sur la façon dont il est différent de Objective-C.

Juste Un des confusions que j'ai utilise <tableViewDelegate, CustomDelegate> ne pourrions - nous pas aussi nous conformer à plusieurs protocoles en Objective-C? Encore une fois comment est Swift nouveau?

21
demandé sur Honey 2016-05-30 19:40:20

4 réponses

Préface: POP et poo ne s'excluent pas mutuellement. Ce sont des paradigmes de conception qui sont grandement liés.

L'aspect principal de la POP sur la POO est qu'elle préfère la composition à l'héritage . Il y a plusieurs avantages à cela.

Dans les grandes hiérarchies d'héritage, les classes d'ancêtres ont tendance à contenir la plupart des fonctionnalités (généralisées), les sous-classes de feuilles ne apportant que des contributions minimes. Le problème ici est que les classes ancêtre se terminent à faire beaucoup de choses. Par exemple, un Car conduit, stocke des marchandises, place des passagers, joue de la musique, etc. Ce sont de nombreuses fonctionnalités qui sont toutes distinctes, mais elles sont toutes regroupées de manière indivisible dans la classe Car. Les Descendants de Car, tels que Ferrari, Toyota, BMW, etc. tous apportent des modifications minimales à cette classe de base.

La conséquence de ceci est qu'il y a une réutilisation réduite du code. Mon BoomBox joue aussi de la musique, mais ce n'est pas une voiture. Hériter de la fonctionnalité de lecture de musique de Car n'est pas possible.

Ce que Swift encourage à la place, c'est que ces grandes classes monolithiques soient décomposées en une composition de composants plus petits. Ces composants peuvent ensuite être réutilisés plus facilement. Car et BoomBox peuvent utiliser MusicPlayer.

Swift offre plusieurs fonctionnalités pour y parvenir, mais les plus importantes sont de loin les extensions de protocole. Ils permettent à l'implémentation d'un protocole d'exister séparément de sa classe d'implémentation, de sorte que de nombreuses classes peuvent simplement implémenter ce protocole et gagner instantanément sa fonctionnalité.

27
répondu Alexander 2016-08-26 17:23:34

Dans le protocole Objective C est la même chose que l'interface dans la plupart des langues. Ainsi, dans Objective C, l'utilisation du protocole est limitée à SOLID principle " dépend des Abstractions. Ne dépend pas des concrétions."

Dans Swift, les protocoles ont été améliorés si sérieusement que, puisqu'ils pouvaient encore être utilisés comme interfaces, ils sont en fait plus proches des classes (comme Abstract classes en C++)

Dans Objective C, la seule façon de partager des fonctionnalités entre les classes est héritage. Et vous pourriez hériter de la seule un classe parent. Dans Swift, vous pouvez également adopter autant de protocoles que vous le souhaitez. Et puisque les protocoles de Swift peuvent avoir une implémentation de méthodes par défaut, ils nous donnent un héritage Multiple entièrement fonctionnel. Plus de flexibilité, une meilleure réutilisation du code-génial!

Conclusion:

La Programmation Orientée protocole est la plupart du temps la même que POO mais elle accorde une attention supplémentaire à partage de fonctionnalités non seulement via l'héritage mais aussi via l'adoption du protocole (Composition sur l'héritage ).

Il convient de mentionner qu'en C++ Les classes abstraites sont très similaires aux protocoles dans Swift mais personne ne dit que C++ supporte un type spécifique de POO. Donc, dans general POP est une des versions de la POO si nous parlons de paradigmes de programmation. Pour Swift POP est une version améliorée de la POO.

8
répondu Avt 2017-04-08 21:07:23

Cela m'a surpris qu'aucune des réponses ne mentionne le type de valeur dans POP.

Pour comprendre ce qu'est la programmation orientée protocole, vous devez comprendre quels sont les inconvénients de la programmation orientée objet.

  1. , Il n'a qu'un seul héritage. Si nous avons une hiérarchie d'héritage très compliquée, la classe inférieure peut avoir beaucoup d'état inutile à tenir.
  2. Il utilise la classe qui est un type de référence. Le type de référence peut rendre le code dangereux. par exemple Traitement collection de types de référence pendant leur modification.

Alors que dans la programmation orientée protocole dans swift:

  1. Il peut se conformer à plusieurs protocoles.
  2. Il peut être utilisé non seulement par la classe, mais aussi par les structures et les énumérations.
  3. Il a une extension de protocole qui nous donne des fonctionnalités communes à tous les types conformes à un protocole.
  4. il préfère utiliser le type de valeur au lieu du type de référence. Jetez un oeil à la bibliothèque swift standard ici , Vous pouvez trouver la majorité des types sont des structures qui est le type de valeur. Mais cela ne signifie pas que vous n'utilisez pas du tout la classe, dans certaines situations, vous devez utiliser la classe, par exemple Singleton.

Donc, la programmation orientée protocole n'est rien d'autre qu'un autre paradigme de programmation qui tente de résoudre les inconvénients de la POO.

5
répondu brianLikeApple 2016-10-26 16:32:46

Ajouter à la réponse ci-dessus

Protocol est une interface dans laquelle la signature des méthodes et des propriétés est déclarée et toute classe/struct/enum sous-classant l'enum doit obéir au contrat signifie qu'elle doit implémenter toutes les méthodes et propriétés déclarées dans le protocole superclass.

Raison D'utiliser le Protocole

Les Classes

Fournissent un héritage unique et struct ne prend pas en charge l'héritage. Ainsi protocoles a été présenté.

Extension les méthodes declare à l'intérieur du protocole peuvent être implémentées à l'intérieur de l'extension pour éviter la redondance du code dans le cas où le protocole est hérité dans plusieurs classes / structures ayant la même implémentation de méthode. Nous pouvons appeler la méthode en déclarant simplement l'objet de struct / enums. Même si nous pouvons restreindre l'extension à une liste de classes, seule la classe restreinte pourra utiliser la méthode implémentée dans l'extension pendant le reste des classes avoir à implémenter la méthode dans sa propre classe.

Exemple

protocol validator{

    var id : String{ get }
    func capitialise()-> (String)

}

extension validator where Self : test{
    func capitialise() -> String{
        return id.capitalized
    }
}

class test : validator {

    var id: String

    init(name:String) {
        id = name
    }
}

let t = test(name: "Ankit")
t.capitialise()

Quand utiliser dans la POO supposons que nous ayons une classe de base de véhicule héritée de l'avion, du vélo, de la voiture, etc. Ici break, l'accélération peut être une méthode commune parmi trois sous-classes mais pas la méthode flyable de l'avion. Ainsi, si nous déclarons la méthode flyable également dans la POO, la sous-classe bike et car a également la méthode Inherit flyable qui n'est d'aucune utilité pour ces classes. Ainsi dans la POP nous pouvons déclarer deux protocoles l'un est pour les objets flyable et l'autre est pour les méthodes de pause et d'accélération. Et le protocole flyable peut être limité à l'utilisation par seulement l'avion

3
répondu Ankit garg 2018-04-03 18:36:05