Resenha do artigo “Classification in Object-Oriented Systems”, de Peter Wegner

 

Alunos:

Disciplina: Desenvolvimento de Sistemas OO II

Professor: Antônio Augusto Fröhlich

 

 

 

O objetivo central do artigo de Peter Wegner é fundamentar os mecanismos do paradigma de Orientação a Objetos em teorias biológicas, matemáticas e filosóficas e caracterizar o próprio paradigma, demarcando uma linha entre o que é orientado a objetos e o que não é.

 

As principais discussões feitas no artigo estão na seqüência.

 

1. Por que usamos classes para programar?

 

A idéia de descrever semelhanças entre instâncias, ou seja, agrupar as “coisas” em classes, é universal em qualquer contexto. Isto é uma atividade básica de crianças, cientistas e programadores.

 

O conceito de classes surgiu na Biologia com Aristóteles e foi aperfeiçoado por Linnaeus e Darwin.

 

Aristóteles criou dois métodos de classificação. O primeiro, top-down, classifica a natureza em uma seqüência de dicotomias. Esse método consiste em divisões e subdivisões que não contêm mais de dois termos. Por exemplo, animal = vertebrado ou invertebrado.

 

O segundo, botton-up, é uma técnica empírica que examina a variabilidade de indivíduos para determinar atributos significantes que distinguem uma espécie de outra.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Modelo de classificação hipotético

 

No século XVIII, Linnaeus, desenvolveu um sistema de classificação baseado nos conceitos de classe, ordem, gênero e espécie. Esse método é próprio para identificar as diferenças entre espécies, não expressando as similaridades entre as mesmas.

 

As técnicas de Aristóteles e Linnaeus ilustram o conflito existente entre a identificação de semelhanças (botton-up) e a identificação de diferenças (top-down). A visão apropriada para identificar classes é geralmente top-down, enquanto que para identificar as relações entre elas (suas semelhanças) é botton-up.

 

A adoção dos mecanismos de classes na Computação advém, em parte, dos mecanismos biológicos de classificação. Quando estudamos um domínio de aplicação identificando classes, fazemos o mesmo que Aristóteles e Linnaeus fizeram ao classificar os seres vivos.

 

Darwin, no século XIX, baseou seu sistema de classificação na evolução de espécies provindas de ancestrais comuns, criando uma hierarquia genética resultante da evolução. Darwin introduziu o conceito de herança na Biologia.

 

A adoção da metáfora de evolução (herança entre classes) em orientação a objetos é motivada em parte pela Teoria da Evolução em parte pelo seu poder de organização.

 

O processo de desenvolvimento de software é um processo evolucionário. Partimos de uma descrição de alto-nível e a modificamos e a incrementamos com maiores detalhes, produzindo subtipos (herança) que conduzem o desenvolvimento por um caminho evolucionário.  O principal poder da herança está no fato de que ela simultaneamente administra mudanças evolucionárias e organiza semelhanças.

 

A combinação dos mecanismos de classe (Aristóteles e Linnaeus) para organizar o conhecimento, com o mecanismo de herança (Darwin) para tratar a mudança, é onde reside o grande poder da metodologia orientada a objetos.

 

A Matemática, particularmente a Teoria dos Conjuntos, acrescentou à orientação a objetos dois mecanismos complementares às classes e herança:

-         os predicados necessários para que um membro faça parte da classe (atributos e comportamentos);

-         os tipos polimórficos, ou seja, classes que classificam classes.

 

 

2. Caracterização do paradigma de OO

 

2.1 Três pontos fundamentais

 

Toda linguagem orientada a objetos deve suportar três características fundamentais:

 

1.      abstração de dados (encapsulamento);

2.      tipo abstrato de dados (dados + comportamento);

3.      herança.

 

Essas três características trazem benefícios claramente visíveis quando se trata de desenvolver sistemas muito grandes, que funcionarão por um longo período de tempo.

 

O paradigma de transição de estados é bom para pequenos programas, o paradigma de comunicação (modularização) é bom para grandes programas, enquanto o paradigma de classes é bom para sistemas realmente grandes.

 

2.2 O paradigma OO combina três paradigmas

 

A metodologia orientada a objetos adota uma combinação de três paradigmas de programação:

 

-         transição de estados, que consiste na execução de uma seqüência de comandos;

-         comunicação, que consiste na troca de mensagens entre módulos ou objetos;

-         o próprio paradigma de classes.

 

 

Em princípio, é possível escrever programas baseados em unicamente um paradigma. No entanto, tais programas seriam difíceis e ilegíveis. Dessa forma, a orientação a objetos adota a combinação deles.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


O uso dos três paradigmas em um programa OO

 

 

2.3 Tipos e Orientação a objetos

 

2.3.1 O que é tipo?

 

Essa é uma discussão complicada, pois uma resposta abrangente teria que agregar vários aspectos.

 

A dificuldade da definição do conceito de tipo é devida, em parte, ao fato de que “tipo” é um conceito primitivo não definível em termos de outros conceitos primitivos, como a noção de “mesa” de Platão.  Platão, na sua Teoria das Idéias, descarta a necessidade de definir mesa em termos de um necessário e suficiente conjunto de predicados, e prefere defini-la em termos de uma “mesa ideal” existente no mundo das idéias.

 

Filósofos chamam noções primitivas não expressáveis em termos de outras noções de “coisas naturais”. A existência de “coisas naturais” limita o poder de expressividade da orientação a objetos, uma vez que essas coisas não podem ser definidas em termos de um conjunto de atributos e operações.

 

A tentativa de definir o conceito de tipo (uma “coisa natural”) ilustra que, quando uma definição precisa e completa não é possível, uma aproximação do conceito pode ser obtida pela combinação de múltiplas visões parciais do mesmo.

 

2.3.2 Orientação a objetos estende a idéia de tipo

 

A relação semântica entre tipos de dados não é trivial em linguagens fortemente tipadas, mas pode ser muito rica em linguagens orientadas a objeto. A programação orientada a objetos estende a noção de tipo nos seguintes aspectos:

-         uma classe de coisas que pode ser tipada é estendida para abstração de dados, isto é, coleções de operadores que se relacionam uns com os outros pelo compartilhamento de uma estrutura de dados comum que persiste entre a evocação dos operadores (tipo abstrato de dados);

-         relações interessantes entre tipos, em particular a herança, podem ser expressadas na linguagem.

 

A orientação a objetos, através da herança, converte a estrutura “plana” de tipos em uma estrutura em forma de árvore hierárquica. A herança determina relações de paternidade entre tipos e subtipos, fortalecendo a semântica da relação de tipos.

 

2.4 Modularização e herança

 

A herança é um mecanismo para tratar a mudança, ou seja, a evolução no tempo. A modularização é um mecanismo próprio para administrar a complexidade no espaço. A orientação a objetos combina herança com modularização, sendo assim apta a administrar a complexidade em relação ao tempo (mudança) e ao espaço (tamanho).

 

2.5 Classes versus Comunicação (troca de mensagens) em sistemas OO

 

Sistemas orientados a objeto dão ênfase à comunicação entre os objetos tanto quanto outras abordagens sem que isso se torne sua característica principal.

Em Orientação a o a natureza do mecanismo de transmissão de mensagens é descentralizada.

Requerimentos de tipo de dados abstratos como herança são explícitos e definitivos, sugerindo que OO poderia ser caracterizado pela natureza dos tipos de mecanismos preferivelmente à natureza das comunicações.

 

3. Uma discussão filosófica...

 

A visão de classes de um sistema pode ser comparada ao conhecimento que o “criador do domínio” tem, que conhece todas as interfaces e características do sistema, de uma perspectiva global, por onisciência. Em contraste, a visão de comunicação de um sistema pode ser comparada aquela que um habitante da caverna (da Alegoria da Caverna, de Platão) tem. Ele vive somente em termos das comunicações que observa. Para o habitante da caverna, o universo (o sistema) não passa de sombras projetadas numa parede.

 

São duas perspectivas distintas: a de Deus, o criador do domínio, o “pai” do sistema, e a do habitante da caverna, o indivíduo que irá usar o sistema depois de sua criação. Deus, em determinados contextos, pode vir a ser uma habitante da caverna.

 

A necessidade de prover a uma pessoa a habilidade de circular bem pelos dois papéis, o de Deus e o do habitante da caverna, é um argumento convincente quanto à integração desses dois pontos de vista. Isso conduz à necessidade de integração entre as linguagens de projeto e de implementação (mapeamento direto). A programação orientada a objetos permite isso.

 

Ambos os pontos de vista (de Deus e do habitante da caverna) são legítimos ou apenas o ponto de vista do criador é legítimo? A resposta a esta questão implica na questão prática da separação entre as linguagens de projeto e implementação. A realidade deve estar mais próxima da visão de Deus, uma vez que Ele tem a visão global, enquanto o habitante da caverna detém apenas uma visão parcial. No entanto, o habitante da caverna tem a ilusão de que sua caverna é o universo todo, desconhecendo a realidade externa à caverna. Dessa forma, o ponto de vista do habitante da caverna também é legítimo. Cabe à metodologia de desenvolvimento de software assegurar que as visões dos habitantes da caverna e a de Deus sejam cooperativas e não antagônicas.

 

Só vemos as coisas que existem ou só existem as coisas que vemos? Essa questão implica nesta outra: os tipos existem para classificar os valores ou os valores só existem porque são de um tipo?

 

“Exploration of this relations is one of many challenging research problems” – Wegner.