En Swift, se hace un gran énfasis en la Programación Orientada a Protocolos (POP). La idea principal de POP es diseñar la arquitectura comenzando desde los protocolos (interfaces) en lugar de las clases base. Los protocolos proporcionan flexibilidad para heredar comportamientos a través de múltiples cadenas, reduciendo el acoplamiento del código.
Swift permite que los protocolos tengan implementaciones por defecto (a través de extensiones), lo que facilita la reutilización del código sin la necesidad de jerarquías de clases. La OOP clásica se basa en la herencia entre clases, lo que está limitado a una sola cadena de herencia. POP está libre de estas limitaciones, permitiendo la composición y la extensibilidad.
Ejemplo de código:
protocol Drivable { func drive() } extension Drivable { func drive() { print("¡Conduciendo hacia adelante!") } } struct Car: Drivable {} let car = Car() car.drive() // Imprimirá: ¡Conduciendo hacia adelante!
¿Se puede agregar una propiedad almacenada en la extensión de un protocolo?
Respuesta: No, en las extensiones de los protocolos no se pueden agregar propiedades almacenadas, solo propiedades computadas y métodos. Por ejemplo,
// ¡Error! extension Drivable { var speed: Int = 0 // Error de compilación: Las extensiones no pueden contener propiedades almacenadas }
Historia
En un gran proyecto, los desarrolladores intentaron agregar propiedades almacenadas a través de extensiones de protocolos para el seguimiento del estado. El código se compiló con errores, lo que obligó a rehacer rápidamente la arquitectura en medio de un sprint para usar soluciones de terceros con objc_get/setAssociatedObject, lo que empeoró la legibilidad del código.
Historia
En el proyecto se implementó una clase base para diferentes tipos de entidades y se utilizó herencia múltiple a través de protocolos. Un desarrollador confundió el comportamiento de la implementación por defecto en la extensión y trató de sobrescribir este método en una estructura, esperando que se llamara específicamente a la implementación en la estructura. Como resultado, fue difícil rastrear el orden de las llamadas a los métodos.
Historia
Al escalar el módulo, se utilizaron protocolos para dividir la responsabilidad, pero debido a la falta de experiencia con POP, los desarrolladores no aseguraron dependencias claras entre los protocolos. Esto llevó a la duplicación de código y a conflictos de interfaces al fusionar varias extensiones en grandes equipos de desarrollo.