11 de março de 2010

(Orientação a Objetos).crítica_sobre( )

O que chamamos de objetos não podem ser considerados objetos na concepção humana, mas apenas na concepção da própria disciplina de programação.

Aliás, lembro que tive certa dificuldade no princípio de compreender o que era a tal iluminada OO porque se nos apresentavam uma explicação segundo a qual a OO se aproximava da concepção humana a respeito de objetos -- premissa que hoje considero parcialmente falsa.

Digamos que eu tivesse ganhado um caderno, mas não soubesse o que é. Então pegaria aquele caderno, e analisando ele como objeto, diria à pessoa que me presenteou: "legal, mas o que eu faço com isso?"

Intuitivamente procuramos alguma coisa para fazer com um caderno, ou, procuramos saber para que ele serve. Todavia, assim concebendo não se pode afirmar que os números seriam objetos no sentido da OO, vez que eles não fazem nada, e sim quem o faria seria o engenheiro que usa de procedimentos matemáticos para com os números.

Note a discrepância. A classe é "Matemática", o procedimento é "soma", e os instrumentos: os números. Quando muito poderíamos asseverar que os números são o objeto da classe matemática, o que nunca implicaria entender que invocaríamos a função "soma" para um número, ao contrário, o parâmetro número é que é passado para o procedimento "soma", a lógica é inversa à da OO.

O único fato da OO que se assemelha ao pensamento humano é a existência de atributos ligados a um objeto. Nesse aspecto, um caderno pode ser verde, pequeno, etc.

Sucede que atributos não podem ser funções de um caderno, pois ninguém que toma o caderno nas mãos requer dele que proceda à sua função "escrever", senão usando o procedimento "escrever" passa-lhe um "caderno".

De modo que não é o paradigma OO que é intuitivo, mas sim o procedural, razão até pela qual um iniciante costuma ter mais facilidade em lidar com funções que com classes e métodos.

A grande idéia da OO é atar a um objeto tudo o que se pode obter dele: desde seus atributos até os procedimentos aplicáveis a ele. É como se um objeto já soubesse o que ele tem, o que ele pode fazer e quais as suas funções. Observe-se, contudo, que saber o que é, o que tem e o que pode fazer é muito mais a característica de um ente consciente que a de um objeto.

Com efeito, seria mais coerente descrever a OO como a orientação a "entes conscientes", já que estão cientes de seus atributos e de suas funções.

Não obstante, o paradigma OO representou um grande avanço na programação, porque realizou que dentro de um universo bastante limitado de possibilidades é mais fácil atrelar atributos e métodos a um ente consciente do que tentar atrelar objetos a centenas de rotinas inconscientes.

Assim, nos parece mais desejável que, p.ex., em Python a função "max( )" fosse um método, pois embora intuitivamente se use primeiro o procedimento max( ) e depois o objeto "list", seria mais simples verificar que um objeto "list" detém a função "max( )", mesmo que "max( )" fosse o mesmo nome para funções semelhantes ligadas a "str" e a "tuple".

De outra lado, não nos parece razoável exigir exclusivamente o uso do paradigma OO. Ele deve ser preponderante, no entanto haverá ocasiões em que um conjunto de funções será mais funcional (por assim dizer), daí uma ampla vantagem de Python que permite o multi-paradigma, mas isso já é outra conversa.

Um comentário:

Marcelo R. Minholi disse...

Eduardo, a OO é uma abstração e como tal tem o objetivo de simplificar o entendimento de algo abstrato. Desde que comecei a estudar POO eu sempre achei que ela guarda grandes semelhanças com a Teoria de Conjuntos, aquela que aprendemos quando ainda crianças, e tento usar essa semelhança como ferramenta para explicar vários conceitos aos iniciantes.

Se é mais adequada ou mesmo mais produtiva que outra abordagem, não sei. Mas que é útil do ponto de vista da organização e reuso, não há dúvidas. Já quanto a utilidade da abstração para fins de ensino, é espetacular.