Python OOPS: agregación y composición

En este artículo, compararemos y destacaremos las funciones de agregación y composición en Python OOPS .

 

Concepto de Herencia

La herencia es un mecanismo que nos permite tomar todas las propiedades de otra clase y aplicarlas a la nuestra. La clase padre es aquella de la que se derivan los atributos y funciones (también llamada Clase Base). Child Class se refiere a una clase que usa las propiedades de otra clase (también conocida como clase Derived). Una relación Is-A es otro nombre para la herencia.

 

Sintaxis: 

# Parent class
class Parent :        
           # Constructor
           # Variables of Parent class

           # Methods
           ...

# Child class inheriting Parent class 
class Child(Parent) :  
           # constructor of child class
           # variables of child class
           # methods of child class

           ...

Concepto de Composición

La composición es un tipo de agregación en la que dos entidades son extremadamente dependientes una de la otra.

  • Indica un componente de relación.
  • Ambas entidades dependen una de la otra en su composición.
  • El objeto compuesto no puede existir sin la otra entidad cuando hay una composición entre dos entidades.

Python3

# Code to demonstrate Composition
  
# Class Salary in which we are
# declaring a public method annual salary
class Salary:
    def __init__(self, pay, bonus):
        self.pay = pay
        self.bonus = bonus
  
    def annual_salary(self):
        return (self.pay*12)+self.bonus
  
  
# Class EmployeeOne which does not 
# inherit the class Salary yet we will
# use the method annual salary using
# Composition
class EmployeeOne:
    def __init__(self, name, age, pay, bonus):
        self.name = name
        self.age = age
  
        # Making an object in which we are
        # calling the Salary class
        # with proper arguments.
        self.obj_salary = Salary(pay, bonus)  # composition
  
    # Method which calculates the total salary
    # with the help of annual_salary() method
    # declared in the Salary class
    def total_sal(self):
        return self.obj_salary.annual_salary()
  
# Making an object of the class EmployeeOne
# and providing necessary arguments
emp = EmployeeOne('Geek', 25, 10000, 1500)
  
# calling the total_sal method using 
# the emp object
print(emp.total_sal())

Producción:

121500

Ahora, como podemos ver en el código anterior, hemos llamado con éxito al método de una clase completamente diferente dentro de otra clase que no hereda la clase usando el concepto de Composición. 

Concepto de Agregación

La agregación es un concepto en el que un objeto de una clase puede poseer o acceder a otro objeto independiente de otra clase. 

  • Representa la relación de Has-A.
  • Es una asociación unidireccional, es decir, una relación unidireccional. Por ejemplo, un departamento puede tener estudiantes, pero al revés no es posible y, por lo tanto, es de naturaleza unidireccional.
  • En Agregación, ambas entradas pueden sobrevivir individualmente , lo que significa que terminar una entidad no afectará a la otra entidad.

Python3

# Code to demonstrate Aggregation
  
# Salary class with the public method 
# annual_salary()
class Salary:
    def __init__(self, pay, bonus):
        self.pay = pay
        self.bonus = bonus
  
    def annual_salary(self):
        return (self.pay*12)+self.bonus
  
  
# EmployeeOne class with public method
# total_sal()
class EmployeeOne:
  
    # Here the salary parameter reflects
    # upon the object of Salary class we
    # will pass as parameter later
    def __init__(self, name, age, sal):
        self.name = name
        self.age = age
  
        # initializing the sal parameter
        self.agg_salary = sal   # Aggregation
  
    def total_sal(self):
        return self.agg_salary.annual_salary()
  
# Here we are creating an object 
# of the Salary class
# in which we are passing the 
# required parameters
salary = Salary(10000, 1500)
  
# Now we are passing the same 
# salary object we created
# earlier as a parameter to 
# EmployeeOne class
emp = EmployeeOne('Geek', 25, salary)
  
print(emp.total_sal())

Producción:

121500

Del código anterior, obtendremos el mismo resultado que obtuvimos antes de usar el concepto de Composición. Pero la diferencia es que aquí no estamos creando un objeto de la clase Salary dentro de la clase EmployeeOne, sino que estamos creando un objeto de la clase Salary afuera y pasándolo como un parámetro de la clase EmployeeOne que produce el mismo resultado.

Inconveniente de la composición

Como vimos en el fragmento anterior, estamos creando un objeto de la clase Salary dentro de la clase EmployeeOne que no tiene relación con ella. Entonces, desde el exterior, si eliminamos el objeto de la clase EmployeeOne, es decir , emp en este caso, entonces el objeto de la clase Salary, es decir , obj_salary , también se eliminará porque depende completamente de la clase EmployeeOne y sus objetos. Para resolver este problema de dependencia, la Agregación entró en escena. 

¿Por qué deberíamos usar Agregación sobre Composición?

Tomemos un ejemplo de Composición y Agregación para ver la diferencia entre ellos y comprender ambos con precisión.

  • En el caso de Composición, si eliminamos el objeto emp , el objeto de la clase Salario que inicializamos dentro de la clase EmpleadoUno se eliminará automáticamente porque depende completamente del objeto de la clase EmpleadoUno, por lo que podría causar algún error en el código de salida 
    Pero en el caso de la Agregación, podemos ver que hemos creado dos objetos completamente diferentes, emp y salario, y pasamos el objeto salario como parámetro a la clase EmployeeOne, por lo que incluso si eliminamos el objeto emp, el objeto de la clase Salary seguirá siendo el mismo y también podemos usarlo en otros lugares.
  • En el caso de Composición, los objetos eran interdependientes entre sí, pero en Agregación, son Unidireccionales, lo que significa que, como el salario es un objeto completamente independiente, solo podemos pasar el salario al emp, no al revés .
  • La composición se define por la relación PARTE DE, lo que significa que un objeto ES PARTE DE OTRO OBJETO, pero la Agregación se define por la relación TIENE-A, lo que significa que un objeto TIENE UNA RELACIÓN con otro objeto.

Publicación traducida automáticamente

Artículo escrito por dwaipayan_bandyopadhyay y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *