Junior
¿Qué es la encapsulación en programación orientada a objetos?
sobes.tech AI
Respuesta de la IA
La encapsulación es la unión de datos (propiedades) y métodos que trabajan con estos datos en una entidad única (objeto o clase), así como la ocultación de la implementación interna del mundo exterior. Esto permite controlar el acceso a los datos y modificar la estructura interna de la clase sin afectar el resto del código.
Aspectos principales de la encapsulación:
- Ocultación de datos: El acceso directo a los datos internos del objeto está restringido. El acceso se realiza a través de métodos públicos (getters) para obtener datos y setters para modificar datos.
- Cumplimiento de invariantes: Los métodos de la clase pueden contener lógica para verificar la corrección de los datos al establecerlos, garantizando que el objeto esté en un estado válido.
Ejemplo:
<?php
class User {
private string $name; // Propiedad oculta
private int $age; // Propiedad oculta
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Getter para name
public function getName(): string {
return $this->name;
}
// Setter para name con posible validación
public function setName(string $name): void {
// Se puede agregar validación del nombre si es necesario
$this->name = $name;
}
// Getter para age
public function getAge(): int {
return $this->age;
}
// Setter para age con validación
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("La edad no puede ser menor que cero.");
}
$this->age = $age;
}
// Método que usa los datos internos
public function introduce(): string {
return "Me llamo " . $this->name . " y tengo " . $this->age . " años.";
}
}
// Uso de la clase
$user = new User("Ivan", 30);
echo $user->introduce(); // Salida: Me llamo Ivan y tengo 30 años.
// Intentar acceso directo a la propiedad privada causará error:
// $user->age = -5; // Error fatal: No se puede acceder a la propiedad privada User::$age
// Uso del setter con validación
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nError: " . $e->getMessage(); // Salida: Error: La edad no puede ser menor que cero.
}
Ventajas de la encapsulación:
- Control de acceso: Define cómo los objetos externos pueden interactuar con los datos de la clase.
- Flexibilidad: Permite cambiar la implementación interna de la clase sin necesidad de cambiar el código externo que la utiliza.
- Mejora en el mantenimiento del código: Facilita la depuración y modificación, ya que los cambios están limitados a la clase.
- Protección de datos: Previene cambios incorrectos en el estado del objeto.