Sobes.tech
Junior

O que é encapsulação na programação orientada a objetos?

sobes.tech IA

Resposta da IA

A encapsulação é a união de dados (propriedades) e métodos que trabalham com esses dados em uma entidade única (objeto ou classe), bem como a ocultação da implementação interna do mundo externo. Isso permite controlar o acesso aos dados e modificar a estrutura interna da classe sem afetar o restante do código.

Aspectos principais da encapsulação:

  1. Ocultação de dados: O acesso direto aos dados internos do objeto é restrito. O acesso é feito através de métodos públicos (getters) para obter dados e setters para modificar dados.
  2. Cumprimento de invariantes: Os métodos da classe podem conter lógica para verificar a correção dos dados ao defini-los, garantindo que o objeto esteja em um estado válido.

Exemplo:

<?php
class User {
    private string $name; // Propriedade oculta
    private int $age;    // Propriedade oculta

    public function __construct(string $name, int $age) {
        $this->setName($name);
        $this->setAge($age);
    }

    // Getter para name
    public function getName(): string {
        return $this->name;
    }

    // Setter para name com validação
    public function setName(string $name): void {
        // Pode adicionar validação do nome se necessário
        $this->name = $name;
    }

    // Getter para age
    public function getAge(): int {
        return $this->age;
    }

    // Setter para age com validação
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("A idade não pode ser menor que zero.");
        }
        $this->age = $age;
    }

    // Método que usa os dados internos
    public function introduce(): string {
        return "Meu nome é " . $this->name . " e tenho " . $this->age . " anos.";
    }
}

// Uso da classe
$user = new User("Ivan", 30);
echo $user->introduce(); // Saída: Meu nome é Ivan e tenho 30 anos.

// Tentativa de acesso direto à propriedade privada causará erro:
// $user->age = -5; // Erro fatal: Cannot access private property User::$age

// Uso do setter com validação
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nErro: " . $e->getMessage(); // Saída: Erro: A idade não pode ser menor que zero.
}

Vantagens da encapsulação:

  • Controle de acesso: Define como objetos externos podem interagir com os dados da classe.
  • Flexibilidade: Permite alterar a implementação interna da classe sem necessidade de alterar o código externo que a utiliza.
  • Melhoria na manutenção do código: Facilita a depuração e modificação, pois as mudanças estão limitadas à classe.
  • Proteção de dados: Previna alterações incorretas no estado do objeto.