domingo, 31 de maio de 2009

Abstração e Encapsulamento

Programação Orientada a Objeto – Abstração e Encapsulamento

Introdução

A 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ÇÃO

A 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 podemos
definir:

(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 restritivo
int semProtecao;
}
public class TesteNaoEncapsulado {
public static void main(String[] args) {
NaoEncapsulado ne = new NaoEncapsulado(); //ne é uma instância de NaoEncapsulado
ne.semProtecao = 10; //acesso direto ao atributo
System.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áxima
private 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ção
e.comProtecao = 10;
//deve-se acessar o atributos de forma indireta, encapsulada
e.setComProtecao(10);
System.out.println("Valor com proteção: " + e.getComProtecao());
}
}
Referências:

Livro:
Linguagens de Programação – SEBESTA

Web:
http://www.wikipedia.org
http://www.gia.ist.utl.pt/Lisp9596/node30.html

Integrantes: Lenir Raquel e Thiago Rangel.

8 comentários:

  1. Achei essa psotagem de grande importância, pois a mesma irá auxiliar como recurso para estudo para a prova final.
    Muito clara as idéias que tiveram a intenção de demonstrar.

    ResponderExcluir
  2. Bem, hoje em dia qualquer pessoa ou empresa que vive da criação de software, sem dúvidas, não fica contente ao ver-se escrevendo códigos similares infinitamente, gastando tempo e recursos na programação de rotinas que já foram criadas anteriormente, mas que pela falta de uma metodologia apropriada, não podem ser reutilizadas. E acho que as principais vantages da Programação Orientada a Objeto são o reuso de código e a capacidade de expansão do mesmo.

    ResponderExcluir
  3. O encapsulamento é de grande utilidade pois praticamente NENHUM software que você faça para uma empresa de grande porte vai ter public para todas as classes, sempre ira precisa encapsular, para que pessoas não desejadas não tenham acesso.

    ResponderExcluir
  4. Nooo essa parada de encapsulamento é muito bacana, o código fica em segundo plano, sem ter necessidade de entrar no mesmo para movimntar a aplicação, legal....

    ResponderExcluir
  5. O encapsulamento é muito usado para banco de dados , onde se cria as classes , pode se usar qualquer tipo de banco já que so muda a sintaxe do comando , muito melhor do que ter que refazer toda uma aplicacao so para se trocar o banco de dados .Orientação a objetos é o futuro da programação .

    ResponderExcluir
  6. A postagem de vcs abordou uma parte muito interessante da O.O, a abstração de dados e encapsulamento, que facilita na hora da interpretação do algoritmo. Parabens

    ResponderExcluir
  7. Este comentário foi removido pelo autor.

    ResponderExcluir
  8. Conteúdo bacana, vai me ajudar muito a estudar pra prova final de LP!
    Parabéns!

    ResponderExcluir