Ocultación de la información
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 41 de 91.
Ocultación de información es el principio que sustenta la encapsulación: la idea de que una clase debe exponer solo lo necesario y ocultar sus detalles de implementación internal. Aunque los modificadores de acceso y los getters/setters son las herramientas, la ocultación de información es la filosofía de diseño que guía cómo las usas.
El objetivo es crear un límite claro entre lo que hace una clase (su interfaz pública) y cómo lo hace (su implementación interna). Esta separación significa que puedes cambiar el funcionamiento interno sin afectar al código que utiliza la clase:
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Salida:
25C = 77FLa clase almacena internamente la temperatura en Celsius, pero los usuarios no necesitan saberlo. Más adelante podrías cambiar el almacenamiento interno a Fahrenheit o Kelvin y, siempre que los métodos públicos sigan funcionando de la misma manera, ningún código externo se romperá.
Punto clave: El ocultamiento de información protege tu código frente a los cambios. Oculta los detalles de implementación, expón solo interfaces estables y tus clases serán más fáciles de mantener y modificar con el tiempo.
Desafío
FácilConstruyamos un conversor de divisas que demuestre el ocultamiento de información en acción. Crearás una clase que almacena internamente el dinero en una divisa, pero puede convertir sin problemas entre varias divisas, sin que el código externo llegue a saber cómo se almacenan realmente los datos.
Organizarás tu código en dos archivos:
Money.php: Crea una claseMoneyque almacene internamente todos los importes en centavos (como un entero) para evitar problemas de precisión de punto flotante. Este detalle de implementación debe estar completamente oculto para los usuarios de la clase. La clase debe proporcionar:- Una propiedad privada para almacenar el importe en centavos
setDollars(float $amount): acepta un importe en dólares y lo almacena internamente como centavosgetDollars(): devuelve el importe en dólares (flotante, con 2 decimales)setEuros(float $amount): acepta euros y los convierte a centavos usando el tipo de cambio: 1 EUR = 1.10 USDgetEuros(): devuelve el importe convertido a euros (flotante, con 2 decimales)getInternalValue(): devuelve el valor bruto en centavos (entero) con fines de depuración
main.php: Incluye el archivo Money. Recibirás dos entradas: un importe en dólares y un importe en euros. Crea una instancia deMoney. Primero, establece el importe en dólares (convertido a flotante) e imprime tres líneas: el valor en dólares, el equivalente en euros y el valor interno en centavos. Después, establece el importe en euros (convertido a flotante) e imprime los mismos tres valores nuevamente.
La ventaja de este diseño es que el código externo trabaja con valores familiares en dólares y euros, sin saber que todo se almacena internamente como centavos. Más adelante podrías cambiar el almacenamiento interno para usar una divisa base diferente o una estrategia de precisión distinta y, siempre que los métodos públicos sigan funcionando correctamente, no sería necesario cambiar ningún código externo.
Formatea todos los resultados en dólares y euros con exactamente 2 decimales. Cada valor debe imprimirse en su propia línea, lo que da como resultado un total de seis líneas de salida.
Pruébalo tú mismo
<?php
require_once 'Money.php';
// Leer entradas
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Crear una instancia de Money
// TODO: Establecer la cantidad en dólares e imprimir:
// - El valor en dólares (2 decimales)
// - El equivalente en euros (2 decimales)
// - El valor interno en centavos (entero)
// TODO: Establecer la cantidad en euros e imprimir:
// - El valor en dólares (2 decimales)
// - El equivalente en euros (2 decimales)
// - El valor interno en centavos (entero)
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online