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 possui, 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 uma ente autociente que a de um objeto.

Com efeito, seria mais coerente descrever a OO como a orientação a "entes autocientes", 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 máquina autociente do que tentar atrelar objetos a centenas de rotinas não cientes.

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.

5 de março de 2010

MongoDB é Magnífico!

Pretendia esperar esperar mais uns dias para postar com mais profundidade, mas estou tão deslumbrado com Mongo que vou postar com apenas dois dias de estudo.

Veja-se só as possibilidades, em Mongo podemos:

  • Armazenar diversos objetos/tipos nativos de Python como: int, float, datetime.datetime, list, unicode.
  • Uma vez que ele é "orientado a documentos", ficamos livres de necessariamente criar schemas, mas eles podem ser criados.
  • Pode-se armazenar documentos sem termos que definir tamanho máximo, de modo que facilmente é possível criar registros que contenham arquivos inteiros.
    • A abordagem é tão diferente que nem é necessário criar uma "tabela", basta denominar as chaves e depois determinar valores para elas.
  • Podemos acrescentar "campos" sem sofrer para definir novas regras.
  • O mais extraordinário sobre as regras de consistência / relacionamento / estruturação:
    • Como SQL, podemos criar "referências".
    • Como OO, podemos criar registros HERDADOS com simplicidade. Você pode acreditar nisso????
    • Como OO "Plus", podemos criar documentos EMBEDEDD com facilidade. Incrível!


Quando vi que era possível criar classes-documentos-filhos e também classes-documentos-embededd com consistência e naturalidade fiquei impressionado. Isso vai facilitar nossas vidas. Basta olhar aqui para ver.

Aliás, com tanto tempo no modelo SQL eu tive certa dificuldade no primeiro momento de imaginar outra modelagem de dados.

A propósito, estou usando um ORM para Mongo chamado "mongoengine" que roda em cima do pymongo.

INSTALANDO MONGOENGINE

$ sudo easy_intall mongoengine

Grato ao La Batalema sobre os posts de MongoDB.

4 de março de 2010

Como Instalar MongoDB no Ubuntu (para iniciantes)

Nem acredito que quebrei a cabeça olhando "how-to" por aí. Não é preciso, tem um pacote apt-get. É fácil.

$  sudo gedit /etc/apt/sources.list

Aberto o arquivo, acrescente a seguinte linha (para Ubuntu 10.4):

deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen

Se o seu Ubuntu é de outra versão substitua o "10.4" por "9.10" ou por "9.4"
Em seguida:

$  sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$  sudo apt-get update
$  sudo apt-get install mongodb-stable

Pronto!

INSTALANDO O PYMONGO

Primeiro, instale o setuptools caso já não tenha:

$ sudo apt-get install python-setuptools

Depois:

$  sudo easy_install pymongo

Enjoy!

--------
ATUALIZAÇÃO (17/03/10): Alterada a forma de instalar pelo "apt-get". Desde de 5 de março não é mais válido o pacote por nome "mongodb". É preciso escolher entre "mongodb-stable", "mongodb-unstable" e "mongodb-snapshot" -- respectivamente o pacote estável, não-estável e o último git efetivado ao tempo da construção do pacote.

ATUALIZAÇÃO (22/06/10): Acrescentado o gpg public key.