Cursos / Eletrônica / Programação Orientada a Objetos / Aula

arrow_back Aula 14 - Juntando as Peças

Encapsulamento e Composição

Vimos durante nossa viagem pelo mundo OO que objetos podem ser compostos por outros e mantêm as referências de tais objetos como seus atributos. Pois bem, esses atributos que representam referências para outros objetos estão sujeitos às mesmas regras de encapsulamento dos demais atributos de tipos primitivos de dados que cada classe mantém.

É interessante nos indagarmos em que situações queremos que a composição de um objeto tenha seu acesso preservado pelas demais instâncias, ou, até mesmo de classes filhas. Os exemplos vistos até então foram bastante simples e usados apenas para observar como funciona o compartilhamento de atributos entre os métodos. Porém, em sistemas complexos, é comum termos que tomar decisões como essa, pois desenvolver sistemas também pressupõe gerenciar complexidade.

Vejamos um exemplo de um sistema que gerencia a rotina diária de operações de uma oficina mecânica. Geralmente, um sistema é pensado, projetado e implementado, segundo competências bem específicas. Isso significa que a oficina possui diferentes setores para atendimento ao cliente, manutenção, estoque de peças, almoxarifado de ferramentas e equipamentos. Cada setor lida com uma competência específica do sistema. Logo, internamente, o sistema precisa encapsular informações que não interessam a determinadas competências.

Vamos isolar uma pequena situação e localizar no código como a composição e o encapsulamento resolvem nosso problema. Vejamos a Listagem 3 a seguir.

Listagem 3 - Classe Peça

A classe Peça representa um elemento atômico de todos os veículos. Ela é usada para representar diferentes peças mecânicas, tais como: parafuso, porcas, rolamentos, presilhas, correias etc.

Essa classe define todos os seus atributos como private, porém, sendo ela uma classe que servirá apenas como repositório desses dados, alguns projetistas iriam preferir defini-los como public, o que a tornaria equivalente a uma estrutura struct existente nas linguagens procedurais. Embora, por boa prática de POO, seja comum sempre manter todos os atributos privados ou protected, que é o princípio do encapsulamento.

Já a classe Componente, apresentada na Listagem 4, representa um elemento de mais alto nível no conjunto de elementos mecânicos de um carro, ou seja, um componente é um conjunto de peças organizadas de forma lógica e com uma determinada função no veículo. Por exemplo, roda é um conjunto de rolamento, aro, parafusos com função bem definida; já a direção do carro é composta da barra e rolamento; e assim por diante.

Finalmente, o motor de um veículo é tão complexo em relação a outros componentes que só ele poderia ser uma categoria específica, sendo definido como uma classe que herda da classe Componente, composto por um conjunto de outros componentes.

A Listagem 5 ilustra uma estratégia de implementação da classe Motor. Observe que ela é definida como sendo composta de um Array de objeto da classe Componente, mas por ser também um Componente, ela herda de tal classe.

Por fim, toda a estrutura mecânica do veículo irá fazer parte de um conjunto separado dos acessórios e demais componentes do acabamento do veículo, como estofamento, pintura etc

Listagem 4 - Classe Componente
Listagem 5 - Classe Motor

Versão 5.3 - Todos os Direitos reservados