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.
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é.
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.
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.
En programmation orientée protocole dans Swift:
La programmation orientée protocole n'est donc qu'un autre paradigme de programmation qui tente de résoudre les inconvénients de OOP.
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
Programmation orientée protocole (POP)