ProgrammationDéveloppeur iOS

Décrivez les caractéristiques du modèle 'Protocol Oriented Programming' en Swift et expliquez en quoi il se distingue de l'approche orientée objet classique.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Swift, une grande importance est accordée à la Protocol Oriented Programming (POP). L'idée principale de la POP est de concevoir l'architecture en commençant par des protocoles (interfaces), et non par des classes de base. Les protocoles offrent une flexibilité pour hériter des comportements à travers plusieurs chaînes, réduisant ainsi le couplage du code.

Swift permet aux protocoles d'avoir des implémentations par défaut (via des extensions), ce qui favorise la réutilisation du code sans nécessiter d'hierarchies de classes. L'OOP classique repose sur l'héritage entre classes, limité à une seule chaîne d'héritage. La POP est libre de ces limitations, permettant ainsi la composition et l'extensibilité.

Exemple de code :

protocol Drivable { func drive() } extension Drivable { func drive() { print("Driving forward!") } } struct Car: Drivable {} let car = Car() car.drive() // Affichera : Driving forward!

Question piège.

Peut-on ajouter une propriété stockée (stored property) dans une extension de protocole ?

Réponse : Non, dans les extensions de protocoles, on ne peut pas ajouter de propriétés stockées, seulement des propriétés calculées (computed properties) et des méthodes. Par exemple,

// Erreur ! extension Drivable { var speed: Int = 0 // Erreur de compilation : Les extensions ne peuvent pas contenir de propriétés stockées }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans un grand projet, les développeurs ont essayé d'ajouter des propriétés stockées via des extensions de protocoles pour suivre l'état. Le code compilait avec erreur, ce qui a nécessité une refonte urgente de l'architecture en plein sprint, pour utiliser des solutions tierces avec objc_get/setAssociatedObject — ce qui a dégradé la lisibilité du code.


Histoire

Dans le projet, une classe de base a été réalisée pour différents types d'entités et un héritage multiple a été utilisé via des protocoles. Un développeur a confondu le comportement de l'implémentation par défaut dans l'extension et a tenté de redéfinir cette méthode dans une struct, s'attendant à ce que l'implémentation dans la struct soit appelée. En fin de compte, il était difficile de suivre l'ordre d'appel des méthodes.


Histoire

Lors de l'extension d'un module, des protocoles ont été utilisés pour séparer les responsabilités, mais en raison d'un manque d'expérience avec la POP, les développeurs n'ont pas garanti des dépendances explicites entre les protocoles. Cela a conduit à la duplication de code et à des conflits d'interface lors de la fusion de plusieurs extensions dans de grandes équipes de développement.