anncode

[Android Native, Kotlin, Geek & Teacher]

Constructor Primario y Secundario en Kotlin 0 (0)

¡Bienvenidos a una nueva clase sobre Kotlin! En esta oportunidad, continuaremos nuestro viaje en la programación orientada a objetos con un enfoque en constructores.

En clases anteriores, hemos cubierto los conceptos básicos de clases y constructores primarios. Ahora, es hora de llevar nuestro conocimiento al siguiente nivel.

Constructor: La Base de la Inicialización

Un constructor es una función especial dentro de una clase que se utiliza para inicializar sus objetos. Es el punto de partida para configurar los atributos y preparar la instancia para su uso.

Hasta ahora, hemos trabajado con constructores primarios, pero hay más en este asunto.

Constructor Primario

Como recordarás, el constructor primario se declara directamente en la declaración de la clase. Puede incluir parámetros que definen los atributos necesarios para inicializar un objeto. Aquí un ejemplo simple:

class Persona(val nombre: String, val edad: Int)

Constructor Secundario: Más Flexibilidad

Un constructor secundario es una función dentro de la clase que te permite crear objetos con diferentes conjuntos de atributos. Estos constructores son ideales cuando necesitas diferentes formas de inicializar tus objetos según situaciones específicas.

Para crear un constructor secundario, primero debemos asegurarnos de tener un constructor primario presente. Luego, podemos agregar más atributos que queramos inicializar opcionalmente.

class Cancion(val titulo: String, val artista: String) {
    constructor(titulo: String, artista: String, duracion: Int) : this(titulo, artista) {
        // Lógica adicional para manejar la duración
    }
}

Puedes ver cómo se invoca al constructor primario cuando ponemos this(titulo, artista).

Múltiples Constructores Secundarios: La Versatilidad de Opciones

La magia radica en que puedes tener varios constructores secundarios, cada uno con su propio conjunto de parámetros. Esto te brinda la flexibilidad de inicializar objetos de diferentes maneras, según las necesidades.

class Cancion(val titulo: String, val artista: String) {
    constructor(titulo: String, artista: String, duracion: Int) : this(titulo, artista) {
        // Lógica adicional para manejar la duración
    }

    constructor(titulo: String, artista: String, duracion: Int, fecha: LocalDate) : this(titulo, artista) {
        // Lógica adicional para manejar la duración
    }
}

El Criterio de Elegir Constructores Secundarios

La pregunta clave es cuándo y cómo usar los constructores secundarios. Aquí entra en juego el criterio basado en las historias de usuario.

Si tu entidad puede ser creada con múltiples combinaciones de atributos, los constructores secundarios son la elección correcta.

Cada constructor secundario puede contener lógica adicional o atributos adicionales, lo que agrega flexibilidad y adaptabilidad.

Ejemplo Práctico

Imagina que estamos creando un blog en Kotlin.

Tenemos dos formas de crear un post: una forma rápida y una forma detallada.

En la forma rápida, solo necesitamos name, author y date. En la forma detallada, añadimos content y category.

Utilizaremos los constructores secundarios para lograr esto de manera efectiva.

class Post( // <-- constructor primario
    val name: String,
    val author: String,
    val date: LocalDateTime
) {

    var body: String = ""
    var category: String = ""

    constructor( // <-- constructor secundario
        name: String,
        author: String,
        date: LocalDateTime,
        content: String,
        category: String
    ) : this(name, author, date) {
        body = content
        this.category = category
    }

    fun publish(): String {
        return """
           Post Name: $name
           Author: $author
           Date: $date 
           ${getCategorySection()}
           ${getContent()}
        """.trimIndent()
    }

    private fun getContent(): String {
        return if (body.isNotBlank() && body.isNotEmpty()) {
            """Content: $body
            """.trimIndent()
        } else ""
    }

    private fun getCategorySection(): String {
        return if (category.isNotBlank() && category.isNotEmpty()) {
            """Category: $category
            """.trimIndent()
        } else ""
    }

}

fun main() {
    val quickPost = Post("Tutorial de Kotlin", "Anahí Salgado", LocalDateTime.now())
    println(quickPost.publish())

    val detailedPost = Post("Clases de Kotlin", "Anahí Salgado", LocalDateTime.now(), "Aprende las bases de Kotlin", "Programación")
    println(detailedPost.publish())
}

En este ejemplo, hemos implementado constructores secundarios que permiten diferentes niveles de inicialización.

Tiene atributos como el name, author, date, content y category.

El constructor primario inicializa name, author, date, mientras que un constructor secundario permite establecer content y category adicionalmente.

El método publish() formatea y devuelve los detalles de la publicación, incluyendo nombre, autor, fecha, contenido y categoría.

En main(), se crean dos instancias de Post, una básica y otra detallada, cuyos detalles se imprimen usando publish().

Conclusión

Los constructores en Kotlin son un pilar fundamental para crear objetos inicializados y flexibles.

Desde los constructores primarios que definen los atributos esenciales hasta los constructores secundarios que ofrecen múltiples formas de inicialización, dominar esta herramienta te dará un mayor control sobre tus objetos.

¡Con esta comprensión más profunda de los constructores en Kotlin, estás preparado para crear objetos más versátiles y adaptados a diferentes situaciones!

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

😊 Gracias por comparitr haces un excelente trabajo divulgando conocimiento.

Múltiples Bloques init en Kotlin 0 (0)

Vamos a explorar a fondo un componente esencial en la inicialización de clases: el bloque init.

El bloque init es una característica poderosa en Kotlin que nos permite ejecutar código dentro de la clase al momento de crear un objeto. A diferencia del constructor primario, el bloque init ofrece una manera estructurada de ejecutar tareas adicionales en la inicialización.

Ejemplo de Implementación del Bloque init

Siguiendo el ejemplo de la clase «Song,» observaremos cómo podemos utilizar este bloque para imprimir detalles sobre la canción y modificar los datos ingresados.

class Song(val title: String, artist: String) {
    init {
        println("La canción $title fue creada.")
    }

    // Resto de la implementación de la clase
}

fun main() {
    val song1 = Song("Solo", "Jenny")
    val song2 = Song("No Roots", "Alice Merton")
    // ...
}

Múltiples bloques init

Si bien no es recomendable tener demasiados bloques init en una clase, es útil conocer que puedes usar más de uno.

Si tienes múltiples bloques init, se ejecutarán en el orden en que se declaran.

Orden de Ejecución en la Clase

Por ejemplo, Vamos a agregar otro bloque init para imprimir el nombre del artista en mayúsculas. Esto nos permitirá observar cómo se ejecutan los bloques init en relación con las propiedades de la clase.

class Song(val title: String, artist: String) {
    init {
        println("La canción \"$title\" fue creada.")
    }

    private val artist: String = artist.toUpperCase()

    init {
        println("Artista es: $artist")
    }

    // Resto de la implementación de la clase
}

La canción "Solo" fue creada.
Artista: JENNY
La canción "No Roots" fue creada.
Artista: ALICE MERTON

Mediante el uso de múltiples bloques init, puedes personalizar completamente el proceso de inicialización de tu clase. Esto es especialmente útil cuando necesitas realizar acciones específicas antes de que el objeto esté completamente creado.

Conclusiones

Con el bloque init, hemos explorado cómo personalizar y controlar la creación de objetos en Kotlin de manera profunda y flexible.

Este mecanismo nos brinda la capacidad de ejecutar código en momentos cruciales durante la creación de un objeto, lo que nos permite adaptar las propiedades y comportamientos según nuestras necesidades.

¡Sigue explorando y experimentando con Kotlin para aprovechar al máximo su potencial!

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

😊 Gracias por comparitr haces un excelente trabajo divulgando conocimiento.

Explorando en Profundidad: Las Clases en Kotlin 0 (0)

En esta lección, vamos a sumergirnos en un tema clave en el mundo de la programación orientada a objetos: las clases en Kotlin.

Profundicemos en cómo funcionan y cómo pueden transformar la forma en que construimos y organizamos nuestro código.

La Base de los Objetos

Las clases son el corazón de la programación orientada a objetos.

Si aún no estás seguro de qué son o cómo se aplican, ¡no te preocupes! Iremos paso a paso, desglosando cada aspecto para que puedas comprender cómo estas piezas clave se unen para formar una base sólida en la construcción de programas.

¿Recuerdas los objetos que exploramos previamente aquí?, ahora es momento de entender cómo se forman.

Las clases actúan como los planos para crear estos objetos, como moldes que determinan cómo se verán y se comportarán.

Es como tener una serie de recetas para hacer diferentes tipos de pasteles.

Construyendo Abstracciones

Piensa en las clases como un medio para abstraer conceptos y datos comunes.

Las abstracciones nos permiten analizar objetos, entender qué datos y funcionalidades tienen en común para entonces definir un tipo de dato General que los defina.

Boom! abstraemos el objeto en una clase.

La palabra reservada para crear una clase en Kotlin es class seguido del nombre de la abstracción:

class Transport

Abriendo la Puerta a los Objetos

Una vez que tengamos nuestras clases definidas, veremos cómo instanciar objetos basados en ellas.

Piensa en esto como si estuvieras utilizando un molde para crear una figura de arcilla. Cada objeto creado a partir de una clase es como una versión única y utilizable de esa figura.

Imagina que has diseñado el molde perfecto para un coche de carreras. Instanciar un objeto es como tomar ese molde y crear un coche de carreras único y funcional.

Explorando Métodos y Funcionalidades

Una de las mejores partes de las clases son los métodos y funcionalidades que pueden contener. Estos son como habilidades especiales que los objetos pueden llevar a cabo.

Las clases, son templates o estructuras que se crean a partir del análisis de un objeto, estas se componen de atributos y funcionalidades y nos permiten crear nuestros propios tipos de datos.

Del Molde al Objeto

Una vez que hayamos explorado la creación de clases, descubriremos cómo instanciar objetos basados en estas clases.

Imagina que has diseñado el molde perfecto para un coche de carreras. Instanciar un objeto es como tomar ese molde y crear un coche de carreras único y funcional.

// Definición de la clase "Carro"
class Carro(val marca: String, val modelo: String, val año: Int) {
    fun acelerar() {
        println("$marca $modelo está acelerando.")
    }

    fun frenar() {
        println("$marca $modelo está frenando.")
    }
}

fun main() {
    // Instanciación de objetos basados en la clase "Carro"
    val carro1 = Carro("Ferrari", "488 GTB", 2023)
    val carro2 = Carro("Tesla", "Model S", 2023)

    // Llamando a métodos de los objetos
    carro1.acelerar()
    carro2.frenar()
}

¡Otro Ejercicio!

Bien, ahora veamos cómo crear una clase a partir de ciertos requerimientos.

Imaginemos que estamos creando una pequeña aplicación para gestionar canciones y sus reproducciones.

En el siguiente ejercicio, nos enfrentamos al desafío de mostrar y detener canciones según los requerimientos específicos.

Requerimientos

  1. Mostrar la Segunda Canción: Mostrar el título y el artista de la segunda canción en pantalla.
  2. Detener y Mostrar el Título: Detener la segunda canción y mostrar su título.
  3. Reproducir la Tercera Canción: Reproducir la tercera canción y mostrar su título y artista.

La Solución

Para resolver estos requerimientos, vamos a crear una clase llamada Song que encapsulará la información de cada canción. A continuación, definiremos métodos en esta clase para manejar las reproducciones y la información mostrada.

class Song(private val title: String, private val artist: String) {
    fun play() {
        println("Reproduciendo: $title - $artist")
    }

    fun stop() {
        println("Canción detenida: $title")
    }
}

fun main() {
    val song1 = Song("Solo", "Jennie")
    val song2 = Song("Whistle", "BlackPink")
    val song3 = Song("New Roots", "Alice Merton")

    song2.play()
    song2.stop()
    song3.play()
}

En este código, hemos definido la clase Song con atributos title y artist, y hemos creado métodos play() y stop() para mostrar las acciones de reproducción y detención de la canción.

Hacia Nuevos Horizontes

A medida que avanzamos en esta serie, también abordaremos conceptos más avanzados, como la relación entre clases y los modificadores de acceso.

No te preocupes si esto suena un poco abrumador en este momento; te llevaré de la mano a través de cada detalle para que puedas aprovechar al máximo las clases en Kotlin.

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

😊 Gracias por comparitr haces un excelente trabajo divulgando conocimiento.

Aprendiendo a analizar un problema Orientado a Objetos 0 (0)

Una de las habilidades más importantes que debes desarrollar en la Programación Orientada a Objetos es que aprendas a pensar en Objetos.

Los objetos pueden ser físicos o conceptuales

Los objetos físicos son todas las cosas que sí podemos ver y hasta tocar. Por ejemplo:

  • user
  • product
  • payment

Los conceptuales no existen fisicamente, existen imaginariamente o conceptualmente. Por ejemplo:

  • account
  • bag
  • session

He diseñado un Curso de Diseño Orientado a Objetos y Principios SOLID dónde te enseño a detectar Objetos de problemas reales, echale un ojo a este Cupón de Descuento.

Los objetos son sustantivos y no verbos

Esta es una de las principales claves para saber que el elemento en el que estoy pensando es un objeto. Los objetos nunca deben ser acciones o verbos, en su lugar son sustantivos.

Un sustantivo según este sitio es: «la palabra que designa personas, animales, plantas…»

Los objetos tienen características y funcionalidades

Los objetos deben tener características y/o funcionalidades.

Por ejemplo:

El objeto Mochila tiene como características: tamaño, color, tipo.

Al tratar de definir las características de un objeto se suele cometer el error de decir la respuesta a ella por ejemplo decir que una característica de Mochila es Verde. Debes ir a un nivel más arriba de abstracción y pensar lo que define a Verde como característica, esto sería el color.

Los objetos los detectaremos en Historias de Usuario

Al estár trabajando activamente en un proyecto real el primer concepto que conocerás son: Las Historias de Usuario (User Stories)

Estás provienen de las metodologías Agile y básicamente narran una sitiuación en el software con sus involucrados.

De aquí es de dónde partiremos para detectar nuestros objetos

Una Historia de Usuario se ve así:

  • Título: Registrarse
  • Cómo: Lector del Blog
  • Quiero: Suscribirme al Blog
  • Para: Poder realizar los comentarios a las entradas de mi interés

Detectemos los objetos:

  • User
  • Blog
  • Comment
  • Post

Sí, parece una locura que con tan poca información detectemos todo eso, pero por eso es tan importante aprender a analizar y sobre todo pensar en objetos.

Ahora te muestro cómo lo hicimos:

ObjetoExplicación
UserLo obtuvimos de Cómo: Lector del Blog nos indica que un Lector del blog puede ser un usuario
BlogLo obtuvimos de Quiero: Suscribirme al Blog
CommentLo obtuvimos de la sección Para: Poder … los comentarios pueden tener: título y descripción que son atributos
PostLo obtuvimos de Para: Poder … los comentarios estarán visualizandose en la entidad Post

Ahora ya sabes que usamos las historias de usuario para identificar objetos, estos pueden ser físicos o conceptuales, sus nombres siempre son adjetivos y tienen carácterísiticas y funcionalidades.

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

😊 Gracias por comparitr haces un excelente trabajo divulgando conocimiento.

Principios SOLID 0 (0)

Los principios SOLID son un acrónimo recopilado por Robert C. Martín en su libro Clean Architecture.

Nacen de la Programación Orientada a Objetos y sirven para Diseñar Programas.

  • Tolerantes al cambio
  • Fácil de entender
  • Reutilizables

Para mí son recomendaciones y guías nos muestran cómo crear, Clases, Métodos, Interfaces, etc. correctamente y conforme a la POO.

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

Objetivo de los Principios SOLID

Su principal Objetivo basado en la POO es:

Crear software de la forma más modular posible.

Al tener software y sus componentes con esta calidad nos permitirá ensamblarlo e intercambiarlo como si fueran Bloques de Lego.

Principios SOLID uno a uno de manera general

(S) Single Responsibility Principle

Significa: Responsabilidad Única pero, se entenderá mucho más si lo definimos como: «Que un elemento de un programa tenga solo una sola razón para cambiar»

Cada componente debe ser sumamente independiente pero al mismo tiempo tener las capacidades de conectarse con otros para trabajar y resolver tareas más complejas.

(O) Open / Closed Principle

«Abierto por extensión pero cerrado para modificación»

Aquí nos enfocamos en pensar cómo hacer crecer el software o en otras palabras, hacerlo Escalable.

El software debería poder crecer sin dolor, si añadir algo nuevo provoca una multitud de cambios puede ser que tengamos que abrir un montón de clases y modificarlas.

Precisamente para evitar este dolor el principio dice que los elementos deben ser Cerrados para Modificación.

Pero entonces, ¿cómo añado algo nuevo?

Si añadirlo significa ensamblarlo o conectarlo como un bloque de Lego, ¡Bingo! tu diseño es escalable.

(L) Liskov Sustitution Principle

Barbara Lizkov fue la creadora de este principio.

La definición compleja dice:

Por cada objeto O1 del tipo S existe un objeto O2 del tipo T, cuando O1 es sustituído por O2 entonces S es un subtipo de T.

Pero en otras palabras podemos decir que:

En una jerarquía de clases padre e hijos. Los hijos deben cumplir por completo con la naturaleza de su padre sin hacerse pasar por otras clases

(I) Interface Segregation Principle

Significa: Segregación de Interfaces.

Segregar Interfaces viene de la acción de dividir, y para dividir correctamente una Interfaz hay que seguir pensando en las responsabilidades que debe tener.

Cuando implementas una interfaz en una clase, esta debe estar diseñada para que a todos sus métodos les escribas un comportamiento.

Si por alguna razón al implementar una interfaz estás dejando métodos vacíos esta es una señal de que tal vez tiene muchas responsabilidades, por lo que necesitarás segregarla o dividirla.

(D) Dependency Inversion Principle

El principio dice:

Los módulos de alto nivel no deberían depender de los de bajo nivel.
Ambos deberían depender de abstracciones

Lo primero que hay que diferenciar es que la Inversión de Dependencias es diferente a la Inyección de Dependencias.

El Objetivo de la Inyección de Dependencias es suministrar objetos a un elemento en lugar de ser él mismo quien los cree.

Por otro lado el diferenciador del Principio de Inversión de Dependencias es su última parte: Ambos deberían depender de abstracciones.

A cualquier nivel que lleves este principio, desde un método, una clase, un módulo etc. La Inversión de dependencias se verá al depender de Abstracciones en lugar de cosas concretas.

Los elementos más abstractos que tenemos en Kotlin son: Clases Abstractas y las Interfaces.

apple fruit with plastic syringes

El objetivo de este Post es darte un panorama general sobre los Principios SOLID, visita todos y cada uno por separado en nuestro sitio web para que tengas más comprensión con ejemplos de código.

En mi Curso de Diseño Orientado a Objetos y Principios SOLID te enseño todo desde cero y paso a paso con ejemplos reales, te dejé un regalo en este link para que lo adquieras a un precio especial.

😊 Gracias por comparitr haces un excelente trabajo divulgando conocimiento.