Entendiendo los principios de la Programación orientada a objetos

programacion orientada a objetos

La programación orientada a objetos (POO) es un una forma de programación que se centra en el uso de objetos y las acciones entre ellos para diseñar y desarrollar un software. Los objetos son entidades que tienen propiedades o atributos y comportamientos o métodos, y se utilizan para representar conceptos del mundo real en el código.

¿ Como pensamos en objetos ?

Debemos enfocarnos en algo de la realidad. Tenemos que detallar los atributos, y tambien sus comportamientos.

Por ejemplo, tenemos un portatil.

Atributos de portatil, pueden ser color, peso, marca,…

Y sus comportamientos o que podemos hacer, puede ser navegar, enviar correo.

La programación orientada a objetos, se basa en clases y objetos.

Una clase es una plantilla de objeto

Un objeto es una instancia concreta de una clase.

¿ Cuales son los principios de la programación orientada a objetos ?

Los principios básicos de la Programación orientada a objetos son : abstracción, encapsulamiento, herencia y polimorfismo.

Abstracción

Consiste en plasmar algo hacia el código, para enfocarnos en su uso

Por ejemplo, tenemos un portatil, definiremos sus atributos y su comportamiento.

class Laptop
{
     color: string;
     brand: string;
     
     constructor(color:string, brand: string)
     {
          this.color = color;
          this.brand = brand;
     }

     openWebBrowser(url: string)
     {
         ...
     }
}
let objLaptop = new Laptop('Black', 'Asus');

Encapsulamiento

Los atributos de los objetos, contienen las caracteristicas de nuestro objeto, pero no toda la información de nuestro objeto es relevante para el usuario, ni tampoco toda la información es accesible.

Para el ejemplo de la clase Laptop, color y brand son accesible desde fuera, pero esto incumple este principio de encapsulamiento.

class Smartphone
{
     private color: string;
     private brand: string;
     private _battery:  number;

     constructor( color: string, brand: string)
     {
          this.color = color;
          this.brand = brand
          this._battery = 100;
     }
     openWebBrowser(url: string)
     {
          if (this._battery) == 0 {
               throw "El portatil se quedó sin bateria";
          }
          this._battery -=10;
     }
     get battery() : number 
     {
          return this._battery;
     }
     recharge()
     {
          this._battery = 100;
     }
} 

Como podemos ver, ahora los atributos están encapsulados, es decir, no se pueden acceder desde fuera de la clase.

Herencia

Es la cualidad de obtener las caracteristicas de otra clase. En vez de repetir el código en una clase, de otra ya hecha, se le dice mediante código, que use todo de una clase superior.

Veamos un ejemplo

class Laptop {
     get battery(): number {
          return this._battery;
     }
}

class Asus extends Laptop {
}

class MacBook extends Laptop{
}

...
obj = new MacBook('White');
obj.battery();

Polimorfismo

Consiste en las múltiples formas que puede obtener un objeto, si comparte la misma clase o interfaz

El polimorfismo se puede hacer mediante interfaces o mediante clase abstractas.

Las interfaces son un contrato que obliga a una clase a implementar las propiedades y métodos definidos en ella. No tienen límite de implementación. Puede exponer métodos abstractos.

Las clases abstractas son clases que no se pueden instanciar, solo pueden ser implementadas con la herencia. Estan limitadas a una sola implementación. Con ella podemos definir un comportamiento por defecto.

¿Cuales son las ventajas de la programación orientada a objetos?

Reutilización del código.

Cuando las clases están bien diseñadas, se pueden reutilizar en varias partes del programa. Tambien, al hacer uso de la herencia, se puede definir una clase genérica, y hacer clases que hereden de esta, sin repetir su código común. Contamos con la ventaja que tiene hacer un cambio en la clase heredada, y que todas sus subclases ya lo tengan disponible.

Código más facilmente modificable

Permite modificar, agregar o eliminar nuevos objetos o funciones bastante fácil, lo que hace que las modificaciones de un programa sean más fáciles y que impliquen un menor tiempo y esfuerzo realizarlas.

Facilidad para detectar errores en el código

Dada la estructura propia de las clases, es más fácil detectar donde se está produciendo un error, y también es más fácil poder aplicar técnicas de test unitarios a una clase, para asegurarnos que está funcionando correctamente.

Modularidad

Esta característica permite a un equipo trabajar en varios objetos a la vez, sin el riesgo de duplicar el código. También se tiene la ventaja de poder dividir el problema en pequeñas partes que se pueden probar de forma independiente.

Flexibilidad

¿Cuales son los principales lenguajes de programación orientados a objetos ?

  • Smalltalk
  • Simula
  • Perl
  • C
  • C++
  • C#
  • Objetive C
  • Java
  • Ruby
  • Visual Basic
  • TypeScript
  • PHP
  • Python

Programación Orientada a objetos en Python

Para ilustrar un poco como se llevaría a cabo implementar la POO en este lenguaje tan popular, vamos a realizarlo con un sencillo ejemplo.

class MyClass:
    """A simple class"""
    i = 1234
    def f(self):
        return "Hello World"

Para crear una instancia de la clase hariamos :

obj = MyClass()

También podemos acceder a sus métodos de clase y propiedades de clase asi :

obj.__doc__
obj.f
obj.i

Cuando una clase necesita inicializar datos, hay un método especial llamado __init__ , que se llama cuando se crea un objeto. Podriamos usarlo asi :

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart

En este caso, los atributos r e i son variables de instancia, que pertenecen a cada instancia que se cree.

Conclusion

Utilizando la característica del polimorfismo, podemos conseguir que una misma clase, funcione de una forma diferente, según en que clase esté contenida.

Usar programación orientada a objetos, nos va a permitir separar el código en entidades, dividir las responsabilidades, conseguir un código más claro, sencillo y más fácil de mantener. Este paradigma de programación nos ayuda tambien a tener el código más organizado. Los cambios se harán de una manera más atómica y detallada. Tambien favorece el uso de pruebas de software o tests, pudiendo implementar TDD.

Si quieres profundizar más en el tema, puedes visitar la wikipedia

Video de EdTeam sobre Programación orientada a objetos

Consentimiento de Cookies de acuerdo al RGPD con Real Cookie Banner