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.
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.
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.