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