Abstração e Encapsulamento
Autor: Lenir Raquel | Publicado: 2009-05-31T05:55:00-07:00

Programação Orientada a Objeto – Abstração e EncapsulamentoIntroduçãoA Orientação a objetos é basicamente a análise, projeto e programação de sistemas de software fundamentado na composição e interação entre diversas unidades de softwares chamadas de objetos.O termo Programação Orientada a Objetos foi criado por Alan Kay, autor da linguagem de programação Smalltalk. O conceito de programação orientada a objeto já existe desde a década de 60. A primeira linguagem a usar a programação orientada a objeto foi a linguagem Simula 67 criada por Ole Johan Dahl e Kristen Nygaard em 1967. Hoje em dia várias outras linguagens já incorporam esses conceitos, como: Java, Pascal, C#, C++, além de sistemas operacionais como Windows e em banco de dados como Oracle 8.À medida que sistemas crescem e a complexidade aumento torna – se mais difícil atender a todos os sistemas, a programação orientação a objeto veio para resolver esses problemas mais rapidamente e com mais segurança. A POO veio para ser implantada no desenvolvimento de sistemas de software complexos e de grande porte, tem um papel fundamental. A principal vantagem é a criação de bibliotecas que tornam efetivos o compartilhamento e a reutilização do código, trazendo uma redução no tempo que uma solução pode ser gerada.Conceitos essenciais:Classe representa um conjunto de objetos com características semelhantes e define o comportamento dos objetos, através de métodos.Objeto é uma instância de uma classe. Armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos.Modularidade é o termo para o projeto de um sistema que é composto de várias partes que podem ser trocadas. Desta forma o sistema pode ser dividido em vários subsistemas. Os sistemas podem ser processos ou produtos. Módulo, é cada parte que pode ser trocada.Atributos são características de um objeto. Basicamente a estrutura de dados que vai representar a classe, os atributos possuem valores e o conjunto de valores dos atributos de um determinado objeto é chamado de estado.Métodos definem as habilidades dos objetos, a utilização de um método deve afetar apenas um objeto em particular. Uma classe pode possui diversos métodos.Mensagem é uma chamada a um objeto para chamar um de seus métodos, ativando um comportamento descrito por sua classe.Herança é o mecanismo pelo qual uma sub-classe pode estender a super-classe, aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos).Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro.Encapsulamento consiste na separação de aspectos internos e externos de um objeto. É utilizado para impedir o acesso direto ao estado de um objeto (seus atributos).Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais.Polimorfismo é a capacidade de um método poder ser implementado de diferentes formas, ou mesmo de realizar coisas diferentes. A decisão sobre qual o método deve ser selecionado é tomada em tempo de execução. Existem dois tipos de polimorfismo a Sobrescrita e sobrecarga.Vamos tratar com um pouco mais de atenção, os elementos “ABSTRAÇÃO” e  "ENCAPSULAMENTO”.ABSTRAÇÃOA abstração, como foi dito, é uma espécie de técnica que é capaz de aumentar a modularidade de determinado sistema ou programa. Um exemplo prático de abstração que podemos citar são os números racionais. Analisando, podemos notar que os números racionais gerariam à primeira vista uma pequena complicação na hora de implementá-los. Quando isso ocorre, facilita muito encontramos uma forma de considerar um arranjo de números e caracteres como uma abstração (o número racional). Seriam necessárias funções para realizar as operações entre eles, concatenações e etc. e a abstração facilita isso. Pontos flutuantes são exemplos de abstrações de dados.Para todos se lembrarem do que vimos na aula (Schema e etc.), encontramos uma implementação da abstração de números racionais que segue:Função que constrói um número racional a partir do numerador e do denominador.(defun racional (numerador denominador)(cons numerador denominador))Para sabermos qual é o numerador ou o denominador de um dado número racional podemosdefinir:(defun numerador (racional)(car racional))(defun denominador (racional)(cdr racional))Assim, já podemos escrever a função que calcula a soma de dois racionais, usando a fórmula.“n1/d1 + n2/d2 = (n1*d2 + n2*d1) /d1*d2”(defun +racional (r1 r2)(racional (+ (* (numerador r1) (denominador r2))(* (numerador r2) (denominador r1)))(* (denominador r1) (denominador r2))))Para simplificar a escrita de racionais, podemos definir uma função que escreve um racional de acordo com uma convenção qualquer.(defun escreve-racional (racional)(format t " a/ a" (numerador racional)(denominador racional)))Agora, já podemos calcular a seguinte expressão:> (escreve-racional (+racional (racional 1 2)(racional 1 3)))RESULTADO = 5/6,,ENCAPSULAMENTO   O encapsulamento, falando um pouco mais, é a técnica ou método de manter dentro de cada módulo do sistema (ver modularidade em definições), os detalhes que só dizem respeito ao próprio.   Cada módulo ou classe, só 'exporta' as definições necessárias à utilização dos serviços que se relacionam com o próprio. E como isso é feito? Segue para exemplificar, um script que encontramos em Java. O encapsulamento, pode ser usado em qualquer linguagem orientada a objetos. Alguns dos comandos usados são muito comentados. Por exemplo “public”, “private”, “protect”, mas dependem da linguagem escolhida é claro. Para quem tem conhecimento da linguagem Java fica fácil de entender. Quem não possui, fica uma oportunidade de aprender um pouco mais:Sem o uso de encapsulamento:class NaoEncapsulado {//implicitamentamente há modificador, mas não é o mais restritivoint semProtecao;}public class TesteNaoEncapsulado {public static void main(String[] args) {NaoEncapsulado ne = new NaoEncapsulado(); //ne é uma instância de NaoEncapsuladone.semProtecao = 10; //acesso direto ao atributoSystem.out.println("Valor sem proteção: " + ne.semProtecao); //acesso direto aos atributos ou nao estupor}}Com o uso de encapsulamento:class Encapsulado {//private é um modificador de acesso de restrição máximaprivate int comProtecao;public void setComProtecao(int comProtecao) {this.comProtecao = comProtecao;}public int getComProtecao() {return this.comProtecao;}}public class TesteEncapsulado {public static void main(String[] args) {Encapsulado e = new Encapsulado(); //"e" é uma instância de Encapsulado//acesso direto a um atributo protegido implicará em erro de compilaçãoe.comProtecao = 10;//deve-se acessar o atributos de forma indireta, encapsuladae.setComProtecao(10);System.out.println("Valor com proteção: " + e.getComProtecao());}}Referências:Livro:Linguagens de Programação – SEBESTAWeb:http://www.wikipedia.orghttp://www.gia.ist.utl.pt/Lisp9596/node30.htmlIntegrantes:  Lenir Raquel e Thiago Rangel.