Menu
Coddy logo textTech

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 = 77F

A 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.

challenge icon

Desafio

Fácil

Vamos 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 classe Money que 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 centavos
    • getDollars(): 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 USD
    • getEuros(): 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 de Money. 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)

?>
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de PHP online