Menu
Coddy logo textTech

Ocultação de Informação

Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 36 de 104.

Ocultação de informações vai além do simples uso de especificadores de acesso. É um princípio de design onde você oculta não apenas os dados, mas também os detalhes de implementação de como sua classe funciona internamente.

O objetivo é expor apenas o que os usuários da sua classe precisam saber, mantendo todo o resto oculto. Isso permite que você altere a implementação interna sem afetar o código que utiliza sua classe:

class Temperature {
    double kelvin;    // Representação interna - detalhe oculto
    
public:
    void setCelsius(double c) {
        kelvin = c + 273.15;    // Conversão oculta para o usuário
    }
    
    double getCelsius() const {
        return kelvin - 273.15;
    }
    
    double getFahrenheit() const {
        return (kelvin - 273.15) * 9.0/5.0 + 32;
    }
};

Os usuários desta classe não sabem (ou não precisam saber) que a temperatura é armazenada internamente em Kelvin. Se você decidir posteriormente armazená-la em Celsius, alterará apenas a implementação privada - a interface pública permanece inalterada.

Esta separação entre interface e implementação oferece diversos benefícios: ela reduz a complexidade para os usuários da sua classe, previne o uso indevido acidental de dados internos e torna seu código mais fácil de manter. Quando os detalhes internos estão ocultos, você tem a liberdade de otimizar ou refatorar sem quebrar o código existente que depende da sua classe.

challenge icon

Desafio

Fácil

Vamos construir uma classe Distance que demonstra a ocultação de informações (information hiding) ao armazenar distâncias internamente em centímetros, enquanto fornece uma interface limpa para trabalhar com diferentes unidades. Os usuários da sua classe não precisarão saber (ou se importar) como a distância é armazenada internamente — eles apenas trabalharão com a unidade que for mais conveniente para eles.

Você criará dois arquivos para organizar seu código:

  • Distance.h: Defina uma classe Distance que oculte sua representação interna enquanto expõe uma interface pública flexível. Internamente, armazene a distância em centímetros (como um double) — este é o seu detalhe de implementação oculto. Sua interface pública deve permitir que os usuários:
    • Definam a distância usando setMeters(double m), setCentimeters(double cm) ou setKilometers(double km)
    • Obtenham a distância usando getMeters(), getCentimeters() ou getKilometers() — todos devem ser métodos const
    • Somem duas distâncias com add(const Distance& other), que retorna um novo objeto Distance

    Inclua um construtor padrão que inicializa a distância como zero. A lógica de conversão deve estar oculta dentro dos seus métodos — os usuários apenas chamam setKilometers(5) e getMeters() sem se preocupar com o formato de armazenamento interno.

  • main.cpp: Demonstre que os usuários podem trabalhar com sua classe sem conhecer a representação interna. Leia dois valores de distância da entrada: o primeiro em metros, o segundo em quilômetros. Então:
    • Crie um objeto Distance e defina-o usando o valor em metros
    • Imprima "In meters: <value> m"
    • Imprima "In centimeters: <value> cm"
    • Imprima "In kilometers: <value> km"
    • Crie um segundo objeto Distance e defina-o usando o valor em quilômetros
    • Some as duas distâncias e armazene o resultado
    • Imprima "Combined in meters: <value> m"

A beleza da ocultação de informações é que você poderia, mais tarde, alterar o armazenamento interno de centímetros para milímetros (ou qualquer outra coisa) sem mudar a forma como os usuários interagem com sua classe. A interface pública permanece estável mesmo que a implementação mude.

Formate todos os valores de saída com duas casas decimais usando std::fixed e std::setprecision(2) de <iomanip>. Converta as strings de entrada para doubles usando std::stod().

Referência de conversão: 1 metro = 100 centímetros, 1 quilômetro = 1000 metros.

Experimente você mesmo

#include <iostream>
#include <string>
#include <iomanip>
#include "Distance.h"

using namespace std;

int main() {
    // Ler valores de entrada
    string metersInput, kmInput;
    cin >> metersInput;  // Primeiro valor em metros
    cin >> kmInput;      // Segundo valor em quilômetros
    
    // Converter strings para doubles usando std::stod()
    double metersValue = stod(metersInput);
    double kmValue = stod(kmInput);
    
    // Configurar a formatação da saída
    cout << fixed << setprecision(2);
    
    // TODO: Criar o primeiro objeto Distance e configurá-lo usando o valor em metros
    
    // TODO: Imprimir "In meters: <value> m"
    
    // TODO: Imprimir "In centimeters: <value> cm"
    
    // TODO: Imprimir "In kilometers: <value> km"
    
    // TODO: Criar o segundo objeto Distance e configurá-lo usando o valor em quilômetros
    
    // TODO: Somar as duas distâncias usando o método add()
    
    // TODO: Imprimir "Combined in meters: <value> m"
    
    return 0;
}
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