Menu
Coddy logo textTech

Ocultação de Informação

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 esconder seus detalhes de implementação interna. Enquanto modificadores de acesso e getters/setters são as ferramentas, a ocultação de informações é a filosofia de design que guia como você as utiliza.

O objetivo é criar uma fronteira clara entre o que uma classe faz (sua interface pública) e como ela faz (sua implementação interna). Essa separação significa que você pode alterar o funcionamento interno sem afetar o código que utiliza 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. Você poderia alterar posteriormente o armazenamento interno para Fahrenheit ou Kelvin e, desde que os métodos públicos continuem funcionando da mesma forma, nenhum código externo será quebrado.

Ponto Chave: O ocultamento de informações protege seu código de mudanças. Esconda 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 construir um conversor de moedas que demonstra a ocultação de informações em ação. Você criará uma classe que armazena dinheiro internamente em uma moeda, mas que pode converter perfeitamente de e para várias moedas — sem que o código externo 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 número inteiro) para evitar problemas de precisão de ponto flutuante. Este detalhe de implementação deve ser completamente ocultado dos 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 em 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 os mesmos três valores novamente.

A beleza deste design é que o código externo trabalha com valores familiares de dólares e euros, completamente alheio ao fato de que tudo é armazenado como centavos internamente. Você poderia, mais tarde, 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 a funcionar corretamente, nenhum código externo precisaria ser alterado.

Formate todas as saídas de dólares e euros com exatamente 2 casas decimais. Cada valor deve ser impresso em sua própria linha, resultando em seis linhas de saída no total.

Folha de consulta

O ocultamento de informações é o princípio por trás do encapsulamento - expondo apenas o que é necessário enquanto oculta os detalhes da implementação interna. Isso cria um limite claro entre o que uma classe faz (interface pública) e como ela faz (implementação interna).

Exemplo de ocultamento de informações com uma classe Temperature:

<?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. O armazenamento interno poderia ser alterado para Fahrenheit ou Kelvin sem quebrar o código externo, desde que os métodos públicos continuem a funcionar da mesma maneira.

Principais benefícios: O ocultamento de informações protege o código de alterações. Ao ocultar detalhes de implementação e expor apenas interfaces estáveis, as classes tornam-se mais fáceis de manter e modificar ao longo do tempo.

Experimente você mesmo

<?php

require_once 'Money.php';

// Ler entradas
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));

// TODO: Criar uma instância de Money

// TODO: Definir o valor em dólares e imprimir:
// - O valor em dólares (2 casas decimais)
// - O equivalente em euros (2 casas decimais)
// - O valor interno em centavos (inteiro)

// TODO: Definir o valor em euros e imprimir:
// - 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