8 de setembro de 2015

Qual estilo de programação mais adotado no Web2py?

Pergunta feita em 13/03/2014 na lista web2py-users-brazil:
No web2py qual o estilo de programação mais comumente adotado: orientado a objetos ou estruturado?
Eu diria que o mais comumente usado é um estilo misto. Vou explicar.

Ao contrário de outros frameworks (ex.: Django), o Web2py não obriga você a criar classes para cada tabela do seu model. Entretanto, cada db.define_table() que você usa, retorna uma instância (objeto) da classe Table. Cada uma dessas tabelas (instâncias de Table) tem seus campos, que são instâncias de Field. Também, todo form criado é uma instância da classe base Form, mas você não declara explicitamente uma classe que herda de Form (ou de SQLForm). Cada helper que você usa (TD, INPUT, etc.) são instâncias de classes. Cada string traduzida (usando o helper T) é uma chamada à instância da classe de tradução.

Entretanto, cada vez que você faz um select no banco, usa um validador ou acessa um campo de uma tabela, está usando objetos (instâncias de classes) criados pelo Web2py.

O Web2py usa o mesmo paradigma do Python: tudo é um objeto, mesmo que você não declare explicitamente.

Por exemplo, quando você usa um "abc".upper(), está usando um método (upper) de uma instância de string. Quando você usa db.define_table(), está usando um método (define_table) de uma instância da classe de banco de dados.

A título de curiosidade, existem 2 exemplos interessantes disso tudo que eu falei.

Usando tabelas como objetos


Você pode fazer um define_table() pegando o retorno dele, assim:

>>> Pessoa = db.define_table('pessoa', Field('nome', 'string'), Field('nascimento', 'date'))

Nesse caso, você pode acessar a tabela pessoa de 2 modos:
  1. db(db.pessoa.id>0).select()
  2. db(Pessoa.id>0).select()
Observação: na verdade, existem outros modos de acessar uma tabela. Citei apenas esses 2 para fins didáticos.

Ou seja, aonde você usaria db.pessoa, você agora pode usar Pessoa.

Objeto request


Em aplicações Web2py é comum usarmos request.vars, não é? Na verdade, request.vars é uma instância de Storage que, por sua vez, herda de dict (veja aqui: https://github.com/web2py/web2py/blob/master/gluon/storage.py), implementando uma forma de acessarmos chaves do dicionário com a notação ponto, além da tradicional notação indexada dos dicionários. O truque está nas linhas antes da definição do método getlist().

É por isso que podemos usar request.vars.my_var ou request.vars["my_var"]. O mesmo truque funciona quando usamos um campo de uma tabela, ou uma tabela do bd. Podemos fazer menção a eles (campos e tabelas) com a notação ponto ou indexada. Tudo isso são instâncias de Storage.

Ou seja, a orientação a objetos está presente o tempo todo. Nós a usamos sem perceber e sem sermos obrigados a declarar nossas classes explicitamente. O Web2py nos permite, mas não nos obriga.

Espero ter esclarecido sua dúvida.

Fonte: https://groups.google.com/forum/#!searchin/web2py-users-brazil/POO$20ou$20Estruturado/web2py-users-brazil/J2mJp914sm0/VbNqT5tQBNUJ

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

Nenhum comentário:

Postar um comentário

Marcadores