Programacion Orientada a Objetos (POO)
Tags: java, python, poo, beginners
Published: 2020-10-17 06:24:54

### **Requerimientos:**
* Java o Python.
* Bucles y condicionales.
* Funciones.

## ¿Qué es la POO?
La programación orientada a objetos no es mas que la capacidad de transformar objetos (como los de la vida cotidiana) a código.

## Ejemplo

Para definir una clase tenemos que tener en cuenta un par de cosas:

* Nombre
* Propiedades (Características o estados)
* Métodos (¿Qué puede hacer?)

El nombre de nuestro objeto es: Televisor.

Sus propiedades son: volumen y canal.

Sus métodos son: cambiar de canal, obtener canal actual, subir volumen, bajar volumen y obtener volumen.

Una vez definido nuestro objeto **Manos a la obra** (Trabajaremos con Java 8 y Python 3.8 por la facilidad para hacer CLIs) 🚀🚀

{% collapsible Python %}
 ```python
class Televisor:

    def __init__(self, volumen: int, canal: int):
        self.volumen = volumen
        self.canal = canal

    def subir_volumen(self):
        self.volumen += 1

    def bajar_volumen(self):
        self.volumen -= 1
    
    def obtener_volumen(self):
        return self.volumen
    
    def cambiar_canal(self, canal: int):
        self.canal = canal

    def obtener_canal(self) -> int:
        return self.canal
```
{% endcollapsible %}

{% collapsible Java %}
```java
package main;
    
public class Television {
    private int volumen;
    private int canal;
    
    public Television(int volumen, int canal){
        this.volumen = volumen;
        this.canal = canal;
    }
    
    public void subir_volumen(){
        this.volumen++;
    }
    
    public void bajar_volumen(){
        this.volumen--;
    }
    
    public int obtener_volumen(){
        return this.canal;
    }
    
    public void cambiar_canal(int canal){
        this.canal = canal;
    }
    
    public int obtener_canal(){
        return this.canal;
    }
}
```
{% endcollapsible %}

## En hora buena!
Acabamos de crear nuestro primer objeto! Podríamos ser rigurosos con validaciones o con métodos, pero esto es solo un primer vistazo. Ahora te invito a jugar con el programa de aquí abajo, cambia los valores, mejóralo tanto como quieras. Cuéntame tu experiencia o deja tus preguntas en comentarios. Suerte Devs! 👩‍💻👨‍💻

{% collapsible Python %}
```python
class Televisor:

    MAX_VOLUMEN = 30
    MAX_CANAL = 30

    def __init__(self, volumen: int, canal: int):
        self.volumen = volumen
        self.canal = canal
        self.io = False

    def IO(self):
        self.io = not self.io

    def obtener_estado(self) -> str:
        if self.io:
            return 'Encendido'
        else:
            return 'Apagado'

    def subir_volumen(self):
        if not self.io:
            print('[Televisor Apagado]')
            return
        elif self.volumen == self.MAX_VOLUMEN:
            print('[Max volumen]')
            return
        self.volumen += 1

    def bajar_volumen(self):
        if not self.io:
            print('[Televisor Apagado]')
            return
        elif self.volumen == 0:
            print('[Min volumen]')
            return

        self.volumen -= 1
    
    def obtener_volumen(self):
        if not self.io:
            print('[Televisor Apagado]')
            return
            
        return self.volumen
    
    def cambiar_canal(self, canal: int):
        if not self.io:
            print('[Televisor Apagado]')
            return
        elif canal > self.MAX_CANAL:
            print('[Max Canal]', self.MAX_CANAL)
            return
        elif canal < 1:
            print('[Min Canal]', 1)
            return
            
        self.canal = canal

    def obtener_canal(self) -> int:
        if not self.io:
            print('[Televisor Apagado]')
            return
        return self.canal


if __name__ == "__main__":
    print('5 para apagar o encender. Usa las teclas 8 y 2 para volumen. 4 y 6 para cambiar de canal. 7 ir a canal.')
    print('Salir: ctrl + c')
    televisor = Televisor(0, 1)

    while True:
        key = input()
        if key == '5':
            televisor.IO()
            print(televisor.obtener_estado())
        elif key == '7':
            try:
                canal = int(input())
                televisor.cambiar_canal(canal)
                print('Canal:', televisor.obtener_canal())
            except:
                print('Canal no valido')
        elif key == '8':
            televisor.subir_volumen()
            print('Volumen:', televisor.obtener_volumen())
        elif key == '2':
            televisor.bajar_volumen()
            print('Volumen:', televisor.obtener_volumen())
        elif key == '4':
            televisor.cambiar_canal(televisor.obtener_canal() - 1)
            print('Canal:', televisor.obtener_canal())
        elif key == '6':
            televisor.cambiar_canal(televisor.obtener_canal() + 1)
            print('Canal:', televisor.obtener_canal())
        print('------------------------------------------------------')
```
{% endcollapsible %}

{% collapsible Java %}
```java
package main;

import java.util.Scanner;

/**
 *
 * @author USHIERU
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Television televisor = new Television(0, 1);

        System.out.println("5 para apagar o encender. Usa las teclas 8 y 2 para volumen. 4 y 6 para cambiar de canal. 7 ir a canal.");

        while (true) {
            String comando = scanner.next();

            switch (comando) {
                case "5":
                    televisor.IO();
                    System.out.println(televisor.obtenerEstado());
                    break;
                case "7":
                    try {
                        int canal = scanner.nextInt();
                        televisor.cambiarCanal(canal);
                        System.out.println("Canal: " + televisor.obtenerCanal());
                    } catch (Exception e) {
                        System.out.println("Valor invalido");
                    }
                    break;
                case "8":
                    televisor.subirVolumen();
                    System.out.println("Volumen: " + televisor.obtenerVolumen());
                    break;
                case "2":
                    televisor.bajarVolumen();
                    System.out.println("Volument: " + televisor.obtenerVolumen());
                    break;
                case "4":
                    televisor.cambiarCanal(televisor.obtenerCanal() - 1);
                    System.out.println("Canal: " + televisor.obtenerCanal());
                    break;
                case "6":
                    televisor.cambiarCanal(televisor.obtenerCanal() + 1);
                    System.out.println("Canal: " + televisor.obtenerCanal());
                    break;
            }

            System.out.println("------------------------------------------------------");
        }
    }
}

class Television {

    private int volumen;
    private int canal;
    private boolean io;
    private final int MAX_VOLUMEN = 50;
    private final int MAX_CANAL = 30;

    public Television(int volumen, int canal) {
        this.volumen = volumen;
        this.canal = canal;
        this.io = false;
    }

    public void IO() {
        this.io = !this.io;
    }

    public String obtenerEstado() {
        if (this.io) {
            return "Encendido";
        } else {
            return "Apagado";
        }
    }

    public void subirVolumen() {
        if (!this.io) {
            System.out.println("[Televisor Apagado]");
            return;
        } else if (this.volumen == this.MAX_VOLUMEN) {
            System.out.println("[Max Volumen]");
            return;
        }
        this.volumen++;
    }

    public void bajarVolumen() {
        if (!this.io) {
            System.out.println("[Televisor Apagado]");
            return;
        } else if (this.volumen == 0) {
            System.out.println("[Min Volumen]");
            return;
        }
        this.volumen--;
    }

    public int obtenerVolumen() {
        if (!this.io) {
            System.out.println("[Televisor Apagado]");
            return 0;
        }
        return this.volumen;
    }

    public void cambiarCanal(int canal) {
        if (!this.io) {
            System.out.println("[Televisor Apagado]");
            return;
        } else if (canal > this.MAX_CANAL) {
            System.out.println("[Max Canal " + this.MAX_CANAL + "]");
            return;
        }
        this.canal = canal;
    }

    public int obtenerCanal() {
        if (!this.io) {
            System.out.println("[Televisor Apagado]");
            return 0;
        }
        return this.canal;
    }
}
```
{% endcollapsible %}