Ocultação de Informações
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 41 de 91.
Ocultação de informações é o princípio por trás do encapsulamento — a ideia de que uma classe deve expor apenas o que é necessário e ocultar seus detalhes internos de implementação. Embora os modificadores de acesso e os getters/setters sejam as ferramentas, a ocultação de informações é a filosofia de design que orienta como você os utiliza.
O objetivo é criar uma separação clara entre o que uma classe faz (sua interface pública) e como ela faz isso (sua implementação interna). Essa separação significa que você pode alterar o funcionamento interno sem afetar o código que usa a classe:
<?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";
Saída:
25C = 77FA classe armazena a temperatura internamente em Celsius, mas os usuários não precisam saber disso. Mais tarde, você poderia alterar o armazenamento interno para Fahrenheit ou Kelvin e, desde que os métodos públicos continuem funcionando da mesma maneira, nenhum código externo será interrompido.
Ponto principal: O ocultamento de informações protege seu código contra mudanças. Oculte os detalhes de implementação, exponha apenas interfaces estáveis, e suas classes se tornarão mais fáceis de manter e modificar ao longo do tempo.
Desafio
FácilVamos criar um conversor de moedas que demonstra o encapsulamento de informações na prática. Você criará uma classe que armazena o dinheiro internamente em uma moeda, mas pode convertê-lo facilmente de e para várias moedas, sem que o código externo jamais saiba como os dados são realmente armazenados.
Você organizará seu código em dois arquivos:
Money.php: crie uma classeMoneyque armazena internamente todos os valores em centavos (como um inteiro) para evitar problemas de precisão de ponto flutuante. Esse detalhe de implementação deve ficar completamente oculto para os usuários da classe. A classe deve fornecer:- Uma propriedade privada para armazenar o valor em centavos
setDollars(float $amount): aceita um valor em dólares e o armazena internamente como centavosgetDollars(): retorna o valor em dólares (float, 2 casas decimais)setEuros(float $amount): aceita euros e os converte para centavos usando a taxa: 1 EUR = 1.10 USDgetEuros(): retorna o valor convertido para euros (float, 2 casas decimais)getInternalValue(): retorna o valor bruto em centavos (inteiro) para fins de depuração
main.php: inclua o arquivo Money. Você receberá duas entradas: um valor em dólares e um valor em euros. Crie uma instância deMoney. Primeiro, defina o valor em dólares (convertido para float) e imprima três linhas: o valor em dólares, o equivalente em euros e o valor interno em centavos. Em seguida, defina o valor em euros (convertido para float) e imprima novamente os mesmos três valores.
A beleza desse design é que o código externo trabalha com valores familiares em dólares e euros, sem saber que tudo é armazenado internamente como centavos. Posteriormente, você poderia alterar o armazenamento interno para usar uma moeda-base diferente ou uma estratégia de precisão diferente e, desde que os métodos públicos continuem funcionando corretamente, nenhum código externo precisaria ser alterado.
Formate todas as saídas em dólares e euros com exatamente 2 casas decimais. Cada valor deve ser impresso em sua própria linha, resultando em um total de seis linhas de saída.
Experimente você mesmo
<?php
require_once 'Money.php';
// Ler entradas
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Crie uma instância de Money
// TODO: Defina o valor em dólares e imprima:
// - O valor em dólares (2 casas decimais)
// - O equivalente em euros (2 casas decimais)
// - O valor interno em centavos (inteiro)
// TODO: Defina o valor em euros e imprima:
// - O valor em dólares (2 casas decimais)
// - O equivalente em euros (2 casas decimais)
// - O valor interno em centavos (inteiro)
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online