objective-c - programacion - protocolos swift 4
¿Qué es la programación orientada al protocolo en Swift? ¿Qué valor añadido aporta? (4)
Ver video de Vistas Orientadas al Protocolo . Encuentro que este video es más básico y más fácil de encontrar un caso de uso fácil. El video de la WWDC en sí es un poco avanzado y requiere más amplitud.
Desde el sitio web de Apple: "En el corazón del diseño de Swift hay dos ideas increíblemente poderosas: programación orientada a protocolos y semántica de valor de primera clase".
¿Puede alguien, por favor, elaborar qué es exactamente la programación orientada al protocolo y qué valor agregado aporta?
He leído this y he visto la Programación Orientada al Protocolo en un video Swift, pero proveniente de un fondo de Objective-C todavía no lo he entendido. Solicito una respuesta en inglés muy sencilla, junto con fragmentos de código y detalles técnicos sobre la diferencia con Objective-C.
Solo una de las confusiones que tengo es usar <tableViewDelegate, CustomDelegate>
¿No podríamos también cumplir con múltiples protocolos en Objective-C también? Así que de nuevo, ¿cómo es Swift nuevo?
Agregando a la respuesta anterior
El protocolo es una interfaz en la que se declara la firma de los métodos y las propiedades y cualquier clase / estructura / enumeración de subclasificación que debe tener la enumeración para cumplir el contrato significa que deben implementar todos los métodos y propiedades declarados en el protocolo de superclase.
Razón para usar el Protocolo
Las clases proporcionan una herencia única y la estructura no admite la herencia. Así se introdujeron los protocolos.
Extensión Los métodos que se declaran dentro del protocolo se pueden implementar dentro de la extensión para evitar la redundancia del código en caso de que el protocolo se herede en varias clases / estructuras con la misma implementación de método. Podemos llamar al método simplemente declarando el objeto de struct / enums. Incluso podemos restringir la extensión a una lista de clases, solo la clase restringida podrá usar el método implementado dentro de la extensión, mientras que el resto de las clases deben implementar el método dentro de la propia clase.
Ejemplo
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()
Cuándo usar En POO supongamos que tenemos una clase base de vehículo que es heredada por el avión, bicicleta, automóvil, etc. Aquí la ruptura, la aceleración puede ser un método común entre tres subclases pero no el método de avión que puede volar. Por lo tanto, si estamos declarando el método flyable también en OOP, la subclase de bicicleta y automóvil también tienen el método heredable flyable que no sirve para esa clase. Por lo tanto, en el POP podemos declarar dos protocolos, uno es para objetos volables y el otro es para métodos de ruptura y aceleración. Y el protocolo de vuelo puede ser restringido para ser usado solo por el avión
En Objective C, el protocolo es lo mismo que la interfaz en la mayoría de los lenguajes. Por lo tanto, en el uso del protocolo del Objetivo C se limita al principio SOLID " Depende de las abstracciones. No dependa de las concreciones " .
En Swift, los protocolos se mejoraron tan seriamente que, dado que aún podrían usarse como interfaces, de hecho están más cerca de las clases (como las clases Abstract en C ++)
En el Objetivo C, la única forma de compartir la funcionalidad entre clases es una herencia. Y podrías heredar la única clase padre. En Swift también puedes adoptar tantos protocolos como quieras . Y como los protocolos en Swift pueden tener la implementación de métodos predeterminados, nos dan una herencia múltiple completamente funcional. Más flexibilidad, mejor reutilización de código - ¡increíble!
Conclusión:
La programación orientada al protocolo es casi igual a la POO, pero presta atención adicional a la funcionalidad que se comparte no solo a través de la herencia sino también a través de la adopción del protocolo ( Composición sobre la herencia ).
Vale la pena mencionar que en C ++ las clases abstractas son muy similares a los protocolos en Swift, pero nadie dice que C ++ admita algún tipo específico de OOP. Entonces, en general, POP es una de las versiones de OOP si hablamos de paradigmas de programación. Para Swift POP es una versión mejorada de OOP.
Prefacio: POP y OOP no son mutuamente excluyentes. Son paradigmas de diseño que están muy relacionados.
El aspecto principal de POP sobre OOP es que prefiere la composición sobre la herencia . Hay varios beneficios para esto.
En las jerarquías de herencia grandes, las clases ancestrales tienden a contener la mayor parte de la funcionalidad (generalizada), y las subclases de hoja hacen solo contribuciones mínimas. El problema aquí es que las clases de antepasados terminan haciendo muchas cosas. Por ejemplo, un Car
conduce, almacena carga, sienta pasajeros, toca música, etc. Estas son muchas funcionalidades que son bastante distintas, pero todas se integran indivisiblemente en la clase Car
. Los descendientes de Car
, como Ferrari
, Toyota
, BMW
, etc., hacen modificaciones mínimas a esta clase base.
La consecuencia de esto es que se reduce la reutilización del código. Mi BoomBox
también reproduce música, pero no es un auto. Heredar la funcionalidad de reproducción de música de Car
no es posible.
Lo que Swift alienta, en cambio, es que estas grandes clases monolíticas se dividan en una composición de componentes más pequeños. Estos componentes pueden ser reutilizados más fácilmente. Tanto Car
como BoomBox
pueden usar MusicPlayer
.
Swift ofrece múltiples funciones para lograr esto, pero las más importantes son las extensiones de protocolo. Permiten que la implementación de un protocolo exista por separado de su clase de implementación, por lo que muchas clases pueden simplemente implementar este protocolo y obtener instantáneamente su funcionalidad.
Me sorprendió que ninguna de las respuestas mencionara tipo de valor en POP.
Para comprender qué es la programación orientada a protocolos, debe comprender cuáles son los inconvenientes de la programación orientada a objetos.
- Tiene una sola herencia. Si tenemos una jerarquía de herencia muy complicada, la clase inferior puede tener muchos estados innecesarios para mantener.
- Utiliza la clase que es un tipo de referencia. Tipo de referencia puede causar código inseguro. Ej. Procesando la colección de tipos de referencia mientras están siendo modificados.
Mientras que en la programación orientada a protocolo en veloz:
- Puede conformar múltiples protocolos.
- Puede ser usado no solo por clase, sino también por estructuras y enumeraciones.
- Tiene una extensión de protocolo que nos da una funcionalidad común para todos los tipos que se ajustan a un protocolo.
- Prefiere utilizar el tipo de valor en lugar del tipo de referencia. Eche un vistazo a la biblioteca estándar de swift here , puede encontrar que la mayoría de los tipos son estructuras que son tipos de valor. Pero esto no significa que no uses la clase, en alguna situación, tienes que usar la clase, por ejemplo, Singleton.
Por lo tanto, la programación orientada a protocolos no es más que un paradigma de programación que intenta resolver los inconvenientes de la programación orientada a objetos.