Una característica muy importante de la programación orientada a objetos es la capacidad que los objetos tienen para interactuar con otros. En programación estructurada nuestro código se lee de arriba hacia abajo y escribimos procedimientos de hasta cientos de líneas. En OOP dividimos las responsabilidades de un procedimiento en pequeñas clases y métodos y logramos que un método interactue con otros. De esta manera aunque ya no será posible leer nuestro código en línea recta, podremos hacer cambios más fácilmente en el sistema, escribir pruebas, reusar código, etc.

Ahora bien aunque hayas aprendido a declarar clases y métodos, es muy posible que sigas teniendo el paradigma de la programación estructurada por mucho tiempo y que cometas ciertos errores que afecten la calidad de tu proyecto y no te permitan aprovechar los beneficios de la OOP, es por ello que en esta clase te enseñaré cómo puedes diseñar tus métodos para lograr una interacción correcta entre objetos, siguiendo el principio «tell, don’t ask». Además aprenderemos sobre la declaración de tipos en PHP y veremos un repaso de herencia, getters y setters.

Esta lección incluye un video premium

Regístrate para ver este video y cientos de lecciones exclusivas.

Repositorio

Ver el código de esta lección en GitHub

Notas

Por Clemir Rondón.

Al declarar los argumentos de un método de una clase podemos declarar el tipo de argumento que acepta. De esta manera facilita el momento de depuración saber si no se están enviando al método los argumentos correctos. Como por ejemplo, declaramos que el método attack solo puede recibir como argumento un objeto tipo Unit, es decir, un Soldier o Archer solo puede atacar a oponentes que sean unidades.

public function attack(Unit $opponent){

}

En la lección Encapsulamiento, getters y setters en PHP vimos cómo crear getters y setters para una propiedad de una clase.  Para esta lección encapsulamos la cantidad de punto de vida (hp) de una unidad y solo podremos acceder a ella por los métodos getHp y setHp.

Principio Tell don’t ask

Este principio nos dice que en vez de pedirle a un objeto información sobre sus datos y luego con ellos tomar decisiones que alteren el mismo objeto como por ejemplo:

<?php
class Board
{
    public function closeTask($task)
    {
        if ($task->isDone()) {
            $task->setStatus('ready');
        }
    }
}

Lo mejor es decirle al objeto lo que quieres que haga, y dejar que sea responsabilidad del propio objeto cambiar su estado. Por ejemplo, podemos reescribir el método de esta forma:

<?php
class Board
{
    public function closeTask(Task $task)
    {
        $task->close();
    }
}

class Task
{
    public function close()
    {
        if ($this->isDone()) {
            $this->setStatus('ready');
        }
    }

    public function isDone()
    {
        //...
    }

    protected function setStatus($status)
    {
        //...
    }
}

Con ello desde Board se está solicitando cerrar una tarea en vez de preguntar si la tarea está hecha para luego cambiar su estado.

En la lección Herencia y abstracción con PHP vimos que una subclase puede modificar el comportamiento de un método de la clase padre pero también podemos usar la palabra clave de PHP parent y el operador de resolución de ámbito :: para llamar el método de la clase padre dentro de la subclase:

class Person
{    
    public function wearing($color)
    {
        echo "{$this->name} is wearing a t-shirt $color";
    }
}

class Student extends Person
{    
    public function wearing($color)
    {
        parent::wearing($color);
        echo " and blue pants.";
    }
}

Ejercicio

Implementa el código para que un Soldier que tienen una mejor armadura solo reciba una tercera o cuarta parte del daño.

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Herencia y abstracción con PHP Lección siguiente Interfaces y Polimorfismo