web-dev-qa-db-fra.com

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

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 première classe."

Quelqu'un peut-il expliquer en quoi consiste exactement la programmation orientée protocole et quelle valeur ajoutée cela apporte-t-il?

J'ai lu this et regardé la programmation orientée protocole en Swift vidéo , mais venant d'un arrière-plan Objective-C ne l'ai toujours pas J'ai bien voulu demander une réponse en anglais très en clair avec des extraits de code et des détails techniques sur la différence avec Objective-C.

Juste un des confusions que j'utilise utilise <tableViewDelegate, CustomDelegate> Ne pourrions-nous pas également nous conformer à plusieurs protocoles dans Objective-C? Encore une fois, comment est Swift nouveau?


EDIT: Voir Vues orientées protocole vidéo. Je trouve que cette vidéo est plus basique et plus facile à saisir un cas d'utilisation significatif. La vidéo WWDC elle-même est un peu avancée et nécessite plus d'étendue. De plus, les réponses ici sont quelque peu abstraites.

26
Honey

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

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

Dans les grandes hiérarchies d'héritage, les classes ancêtres ont tendance à contenir la plupart des fonctionnalités (généralisées), les sous-classes feuilles ne faisant que des contributions minimes. Le problème ici est que les classes ancêtres finissent par faire beaucoup de choses. Par exemple, un Car conduit, stocke du fret, fait asseoir des passagers, joue de la musique, etc. Ce sont de nombreuses fonctionnalités qui sont chacune assez distinctes, mais elles sont toutes indissociables dans la classe Car . Les descendants de Car, tels que Ferrari, Toyota, BMW, etc. apportent tous des modifications minimes à cette classe de base.

La conséquence de cela 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 plus facilement réutilisés. Car et BoomBox peut 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 indépendamment de sa classe d'implémentation, de sorte que de nombreuses classes peuvent simplement implémenter ce protocole et gagner instantanément sa fonctionnalité.

33
Alexander

Dans Objective C, le protocole est la même chose que l'interface dans la plupart des langues. Donc, dans le protocole Objective C, l'utilisation est limitée à SOLIDE principe " Dépend des abstractions. Ne dépend pas des concrétions."

Dans Swift ont été améliorés si sérieusement que comme ils peuvent toujours être utilisés comme interfaces, ils sont en fait plus proches des classes (comme classes abstraites en C++)

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

Conclusion:

La programmation orientée protocole est essentiellement la même chose que [~ # ~] oop [~ # ~] mais il accorde une attention supplémentaire au partage de fonctionnalités non seulement via l'héritage mais aussi via l'adoption du protocole ( Composition over héritage ).

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

9
Avt

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 (Objc) 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 à conserver.
  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 de la collection de types de référence pendant leur modification.

En 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 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 œil à la bibliothèque standard Swift ici , vous pouvez trouver que la majorité des types sont des structures qui sont de type valeur. Mais cela ne signifie pas que vous n'utilisez pas classe du tout, dans certaines situations, vous devez utiliser la classe.

La programmation orientée protocole n'est donc qu'un autre paradigme de programmation qui tente de résoudre les inconvénients de OOP.

8
brianLikeApple

Ajout à 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'énum doit avoir à respecter le contrat signifie qu'ils doivent implémenter toutes les méthodes et propriétés déclarées dans le protocole de superclasse .

Raison d'utiliser le protocole

Les classes fournissent un héritage unique et struct ne prend pas en charge l'héritage. C'est ainsi que des protocoles ont été introduits.

Extension Les méthodes déclarées à l'intérieur du protocole peuvent être implémentées à l'intérieur de l'extension pour éviter la redondance du code au cas où le protocole serait 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 nous pouvons restreindre l'extension à une liste de classes, seule la classe restreinte pourra utiliser la méthode implémentée à l'intérieur de l'extension tandis que les autres classes devront implémenter la méthode à l'intérieur de leur 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 l'utiliser In OOP supposons que nous avons une classe de base de véhicule héritée de l'avion, du vélo, de la voiture, etc. Ici, la pause, l'accélération peut être une méthode courante parmi trois sous-classe, mais pas la méthode pilotable de l'avion. Ainsi, si nous déclarons la méthode pilotable également dans la POO, la sous-classe vélo et voiture ont également la méthode pilotable héritée qui n'est d'aucune utilité pour cette classe. Ainsi dans le POP, nous pouvons déclarer deux protocoles un est pour les objets volables et d'autres pour les méthodes de pause et d'accélération. Et le protocole volant peut être limité à une utilisation par l'avion uniquement

4
Ankit garg

Programmation orientée protocole (POP)

  • Entré depuis Swift 2.0
  • classe (OOP)
    • est le type de référence
    • fuite de mémoire, données incorrectes stockées, condition de concurrence pour accéder dans des environnements complexes à plusieurs threads
    • peut être volumineux en héritant des membres des super classes au moment de la chaîne
  • struct (POP)
    • est un type de valeur - chaque fois qu'une nouvelle copie est faite en cas de besoin
    • fournit l'héritage multiple - hérite des protocoles
    • Protocole:
    • Définit les méthodes, propriétés et initialisations requises o Peut hériter d'un ou de plusieurs protocoles
    • Vous n'avez pas besoin d'utiliser un mot clé de remplacement pour implémenter les fonctions de protocole
  • Extensions:
    • Valeur par défaut et implémentation par défaut du protocole
    • Peut ajouter des membres supplémentaires au protocole
0
mehdi parsaei