Pesquisar no Programero

segunda-feira, 21 de abril de 2008

Programação Orientada a Objetos (POO)

O termo Programação Orientada a Objetos foi criado por Alan Kay, autor da linguagem de programação Smalltalk. Mas mesmo antes da criação do Smalltalk, algumas das idéias da POO já eram aplicadas, sendo que a primeira linguagem a realmente utilizar estas idéias foi a linguagem Simula 67, criada por Ole Johan Dahl e Kristen Nygaard em 1967. Note que este paradigma de programação já é bastante antigo, mas só agora vem sendo aceito realmente nas grandes empresas de desenvolvimento de Software. Alguns exemplos de linguagens modernas utilizadas por grandes empresas em todo o mundo que adotaram essas idéias: Java, C#, C++, Object Pascal (Delphi), Ruby, Python, Lisp [2].
A Programação Orientada a Objetos é um paradigma computacional que organiza o desenvolvimento de um software em coleções de objetos, incorporando comportamento e estrutura próprios. Enquanto no desenvolvimento convencional estruturado temos um fluxo linear, onde uma função ou programa principal invoca funções auxiliares para executar as tarefas necessárias, na programação POO existe um conjunto de classes (pré-definidas ou não) que possuem atributos e métodos e que são instanciadas em objetos durante a execução do programa.
Um programa desenvolvido com uma linguagem POO manipula estruturas de dados através dos objetos da mesma forma que um programa em linguagem tradicional utiliza variáveis [1].
Segue abaixo os conceitos fundamentais sobre POO, retirados da Wikipédia [3]:

Conceitos fundamentais
· Classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplo de classe: Os seres humanos.
· Objeto é uma instância de uma classe. Um objeto é capaz de armazenar estado através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria.
· Atributos são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço, telefone, CPF, ....; Carro: nome, marca, ano, cor, ...; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul.
· Métodos definem as habilidades dos objetos. Bidu é uma instância da classe Cachorro, portanto tem habilidade para latir, implementada através do método deUmLatido(). Um método em uma classe é apenas uma definição. A ação só ocorre quando o método é invocado através do objeto, no caso Bidu. Dentro do programa, a utilização de um método deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente, uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser sente(), coma() e morda().
· Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático).
· Sobrecarga é a utilização do mesmo nome para símbolos ou métodos com operações ou funcionalidades distintas. Geralmente diferenciam-se os métodos pela sua assinatura.
· Herança (ou generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (métodos) e estados possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação "é um". Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero.
· Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone.
· Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom).
· Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software.
· Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma assinatura (lista de parâmetros e retorno) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia. No caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma identificação, sendo utilizado o mecanismo de redefinição de métodos. Esse mecanismo de redefinição não deve ser confundido com o mecanismo de sobrecarga de métodos.
· Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface.
· Pacotes são referências para organização lógica de classes e interfaces.

Um pouco sobre esse abrangente assunto foi tratado aqui, para finalizar gostaria de recomendar um exemplo prático em Java, "cadastro de animais" encontrado em Terramel [4], bem simples e didático, estarei disponibilizando um arquivo "zipado" com alguns dos materiais utilizados nesse artigo.

Fonte:

[1] DCA-FEEC-UNICAMP
[2] Guia do Hardware
[3] Wikipedia
[4] Terramel

3 comentários:

  1. Cara se poderia falar sobre esse Ruby!! eu ainda num tinha ouvido falar dele!!!

    ResponderExcluir
  2. Muito bom seu artigo! Vc sabe que eu não sou um programador, mas mesmo assim tenho o conceito e achei muito interessante seu post.
    Poderia também postar algo sobre desenvolvimento pra games. Pelo que andei vendo na internet, isso está pra estourar por aqui.
    Abraço!

    ResponderExcluir
  3. Opa cara! Excelente seu post! E obrigado por ter recomendado meu artigo ;) Fico muito feliz mesmo que tenha gostado :D

    Daniel: Sobre desenvolvimento de jogos não sei quase nada, mas se quiser começar a brincar com OpenGL, tenho algumas aulinhas bem básicas no meu blog!

    Abraços galera

    OBS: Voltei a postar agora que estou de férias :D

    ResponderExcluir

Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.