Estructuras vs Clases en Programación Orientada a Objetos

Clase 2 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

¿Qué son las estructuras y clases en programación orientada a objetos?

La programación orientada a objetos (POO) es un pilar esencial en el mundo de la programación moderna. Este enfoque organiza el software en unidades llamadas "objetos", los cuales permiten almacenar datos y comportamientos concretos. En este contexto, es fundamental entender las diferencias y similitudes entre dos conceptos: estructuras y clases. Estos se utilizan para definir y organizar datos y funcionalidades en la programación, pero presentan características particulares que debes dominar.

¿Cuáles son las similitudes entre estructuras y clases?

Tanto las estructuras como las clases comparten varios puntos comunes que se deben tener en cuenta:

  • Almacenamiento de propiedades: Ambas permiten definir propiedades que pueden ser constantes o variables dentro de su cuerpo.
  • Definición de métodos: Los métodos son funciones asociadas a la estructura o clase y sirven para manipular los datos que estas contienen.
  • Inicializadores (Constructores): Se utilizan para crear instancias de estructuras o clases, definiendo su estado inicial.
  • Extensión de funcionalidades: Puedes extender estructuras y clases con nuevas funcionalidades, permitiendo así su adaptación a futuras necesidades.
  • Conformidad con protocolos: Ambos pueden adherirse a protocolos, lo que permite implementar funcionalidades que no se encuentran en la estructura o clase original.

¿En qué se diferencian las estructuras de las clases?

Aunque comparten muchas similitudes, las estructuras y las clases también presentan diferencias críticas:

  • Herencia: Solo las clases pueden heredar de otras clases, ofreciendo la posibilidad de extender o especializar su funcionalidad.
  • Casting: Las clases permiten reinterpretar valores de un tipo a otro, lo cual es clave para la flexibilidad en la programación.
  • Dealizadores (Deinitializers): En las clases, estas funciones son útiles para liberar memoria al dejar de utilizar una instancia, a diferencia de las estructuras que no cuentan con esta característica.
  • Reference Counting: Es un mecanismo implementado en las clases para rastrear cuántas referencias existen a un objeto en tiempo de ejecución, crucial para el manejo de memoria.

¿Cómo se crean y utilizan las estructuras y clases en Swift?

La sintaxis para definir una estructura o una clase es bastante similar en Swift. A continuación se presenta cómo se hace:

Definición de una estructura

struct Resolucion {
    var ancho: Int = 0
    var altura: Int = 0
}

Definición de una clase

class ModoVideo {
    var resolucion = Resolucion()
    var interlaced = false
    var frameRate = 0.0
    var nombre: String? = nil
}

La sintaxis es clara y define estructuras como 'struct' y clases como 'class'. La elección entre usar una estructura o una clase dependerá de las necesidades específicas de tu proyecto.

Ejemplo práctico: manipulando estructuras y clases

Supongamos que creamos instancias de estas definiciones. Cuando trabajamos con una estructura, esta se comporta como un tipo de valor:

let resolucionSon = Resolucion()

Modificar sus propiedades no es posible si lo instanciamos con let, ya que lo convierte en una constante inmutable. Esto es así para garantizar que la estructura conserve sus valores una vez asignados.

En cambio, al usar una clase, aunque se declare con let, sus propiedades internas pueden modificar su valor:

let modoVideoSon = ModoVideo()
modoVideoSon.frameRate = 30.0 // Modifiable

En este escenario, modoVideoSon puede cambiar su frameRate porque una clase es un tipo de referencia. Esto significa que trabaja sobre un espacio fijo en la memoria que permite actualizar el estado de la instancia.

Comprender estas diferencias y similitudes ofrece una ventaja significativa al diseñar sistemas más eficientes y organizados. Te animamos a seguir explorando y practicando para dominar el fascinante mundo de la programación orientada a objetos.