Os três pilares da programação orientada a objetos
Para edificar seu entendimento e domínio de OO, você deve primeiro ter uma base sólida a partir da qual possa expandir sua compreensão. Primeiro, você precisará identificar, definir e explorar os conceitos básicos da OO. Somente quando você tiver uma boa base das teorias básicas de OO é que poderá aplicá-la corretamente no software que escrever. Tal discussão o leva naturalmente aos três conceitos que devem estar presentes para que uma linguagem seja considerada realmente orientada a objetos. Esses três conceitos são frequentemente referidos como os três pilares da programação orientada a objetos.
Novo Termo Os três pilares da programação orientada a objetos são: encapsulamento, herança e polimorfismo.
Como a POO é baseada neles, os três pilares são semelhantes a uma torre de blocos: remova o bloco inferior e tudo mais virá abaixo. O encapsulamento, que você abordará hoje, é uma peça extremamente importante do quebra-cabeça, pois ele forma a base da herança e do polimorfismo.
Encapsulamento: o primeiro pilar
Em vez de ver um programa como uma única entidade grande e monolítica, o encapsulamento permite que você o divida em várias partes menores e independentes. Cada parte possui implementação e realiza seu trabalho independentemente das outras partes. O encapsulamento mantém essa independência, ocultando os detalhes internos ou seja, a implementação de cada parte, através de uma interface externa.
Novo Termo Encapsulamento é a característica da OO de ocultar partes independentes da implementação. O encapsulamento permite que você construa partes ocultas da implementação do software, que atinjam uma funcionalidade e ocultam os detalhes de implementação do mundo exterior.
Se você não estiver familiarizado com o termo encapsulamento, talves reconheça os termos módulo, componente e bean. Você pode usar esses termos em vez de 'software wncapsulado'.
Uma vez encapsulado, você pode ver uma entidade de software como uma caixa preta. Você sabe o que a caixa preta faz, pois conhece sua interface externa. Conforme a Figura 2.1 ilustra, você simplesmente envia mensagens para a caixa preta. Você não se preocupa com o que acontece dentro da caixa; você só se preocupa com o fato de que isso aconteça.
Novo Termo Uma interface lista os serviços fornecidos por um coponente. Ainterface é um contrato com um mundo exterior, que define exatamente o que uma entidade externa pode fazer com o objeto. Uma interface é o painel de controle do objeto.
Uma interface é importante, pois ela diz o que você pode fazer com o componente. O mais interesse é o que uma interface não informa: como o componente fará seu trabalho. Em vez disso, a interface oculta a implementação do mundo exterior. Isso libera o componente para alterações na sua implementação a qualquer momento. As mudanças na implementação não mudam o código que usa a classe, desde que a interface permaneça inalterada. As alterações na interface necessitarão de mudanças no código que exerce essa interface.
Talvez você esteja familiarizado com o termo de programação API (Interface de Programa Aplicativo). Uma interface é semelhante a API para um objeto. A interface lista todos os métodos e argumentos que o objeto entende.
Novo Termo A implementação define como um componente realmente fornece um serviço. A implementação define os detalhes internos do componente.
Um exemplo de interface e implementação
Considere a classe Log a seguir:
sTudo mais na definição da classe, além dessas cinco declarações de método, é implementação. Lembre-se de que a implementação define como algo é feito. Aqui, o ‘como’ é o fato de que Log imprime na tela. Entretanto, a interface oculta completamente o ‘como’. Em vez disso, a interface define um contrato com o mundo exterior. Por exemplo, public void debug( String message ) é uma maneira de dizer ao mundo exterior que, se você passar uma String, ela reportará uma mensagem de depuração.
O que é importante notar é o que a interface não diz. debug () não diz que imprimirá na tela. Em vez disso, o que é feito com a mensagem é deixado para a implementação. A implementação podería escrever na tela, descarregar em um arquivo, gravar em um banco de dados ou enviar uma mensagem para um cliente monitorado pela rede.
Público, privado e protegido
Você pode ter notado que a interface pública não inclui
Em vez disso, a classe Log restringe o acesso a print() .
O que aparece e o que não aparece na interface pública é governado por diversas palavras-chave. Cada linguagem OO define seu próprio conjunto de palavras-chave, mas fundamentalmente essas palavras-chave acabam tendo efeitos semelhantes.
A maioria das linguagens OO suporta três níveis de acesso:
• Público — Garante o acesso a todos os objetos.
• Protegido — Garante o acesso à instância, ou seja, para aquele objeto, e para todas as subclasses (mais informações sobre subclasses no Dia 4, “Herança: obtendo algo para nada”)
• Privado — Garante o acesso apenas para a instância, ou seja, para aquele objeto.
O nível de acesso que você escolhe é muito importante para seu projeto. Todo comportamento que você queira tornar visível para o mundo, precisa ter acesso público. Tudo que você quiser ocultar do mundo exterior precisa ter acesso protegido ou privado.
Por que você deve encapsular?
Quando usado cuidadosamente, o encapsulamento transforma seus objetos em componentes plugáveis. Para que outro objeto use seu componente, ele só precisa saber como usar a interface pública do componente. Tal independência tem três vantagens importantes:
• Independência significa que você pode reutilizar o objeto em qualquer parte. Quando você encapsular corretamente seus objetos, eles não estarão vinculados a nenhum programa em particular. Em vez disso, você pode usá-los sempre que seu uso fizer sentido. Para usar o objeto em qualquer lugar, você simplesmente exerce sua interface.
• O encapsulamento permite que você torne transparentes as alterações em seu objeto. Desde que você não altere sua interface, todas as alterações permanecerão transparentes para aqueles que estiverem usando o objeto. O encapsulamento permite que você atualize seu componente, forneça uma implementação mais eficiente ou corrija erros — tudo isso sem ter de tocar nos outros objetos de seu programa. Os usuários de seu objeto se beneficiarão automaticamente de todas as alterações que você fizer.
• Usar um objeto encapsulado não causará efeitos colaterais inesperados entre o objeto e o restante do programa. Como o objeto tem implementação independente, ele não terá nenhuma outra interação com o restante do programa, além de sua interface.
Agora, você está em um ponto onde podemos falar sobre algumas generalidades a respeito do encapsulamento. Você viu que o encapsulamento permite escrever componentes de software com implementações independentes. As três características do encapsulamento eficaz são:
• Abstração
• Ocultação da implementação
• Divisão de responsabilidade
Vamos ver mais profundamente cada característica, para aprender a melhor maneira de obter o encapsulamento.



Comentários
Postar um comentário