Ruby Beans (propriedades de um objeto Ruby)  XML
Índice dos Fóruns » Ruby
Autor Mensagem
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

Em Java temos a útil convenção de que métodos getters (getXXXX) retornam uma propriedade de um objeto.

E em Ruby?

Tenho um objeto é quero listar via reflection todas as suas propriedades. Devo assumir que todo método sem parametros e que retorna algo (e não termina com '?', '=' ou '!') é uma propriedade?

This message was edited 1 time. Last update was at 17/05/2008 13:26:38


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
tnaires
Virtual Machine Man
[Avatar]

Membro desde: 22/12/2003 08:05:58
Mensagens: 602
Localização: Natal - RN
Offline

Ter acesso direto às variáveis de instância usando instance_variables não resolveria seu problema?
Você pode obter e modificar seus valores usando instance_variable_get e instance_variable_set, respectivamente.

Tarso Nunes Aires
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

tnaires wrote:Ter acesso direto às variáveis de instância usando instance_variables não resolveria seu problema?
Você pode obter e modificar seus valores usando instance_variable_get e instance_variable_set, respectivamente.


Variável de instância é BEM diferente de propriedade. A primeira é privada e interna e a segunda pode não ter qualquer ligação com a primeira.

Ex:



Parece que falta uma convenção em Ruby para dizer quando um método é um getter de uma propriedade. Ou ela existe e eu não a conheço, por isso a pergunta.

This message was edited 1 time. Last update was at 17/05/2008 17:42:59


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
tnaires
Virtual Machine Man
[Avatar]

Membro desde: 22/12/2003 08:05:58
Mensagens: 602
Localização: Natal - RN
Offline

Não estou bem certo se entendi.
Dentro do contexto da sua explicação, para que uma variável de instância seja uma propriedade em Java, basta atribuir um getter ( read-only ) ou um getter e um setter, certo?
Então o equivalente em Ruby são as declarações attr_reader, attr_writer e attr_accessor.

Tarso Nunes Aires
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

tnaires wrote:Não estou bem certo se entendi.
Dentro do contexto da sua explicação, para que uma variável de instância seja uma propriedade em Java, basta atribuir um getter ( read-only ) ou um getter e um setter, certo?
Então o equivalente em Ruby são as declarações attr_reader, attr_writer e attr_accessor.


O que eu quiz dizer é que uma variável de instancia não é obrigatoriamente uma propriedade, seja em Ruby, em Java ou em qualquer outra linguagem OO que possua encapsulamento. O meu exemplo de código mostra isso.

Em Ruby não há a convenção de getXXXX, logo como saber quais métodos getters indicam propriedades? Em Java tudo que é getXXX sem parametros é uma propriedade, ou pelo menos é essa a convenção desde os primórdios da linguagem (JavaBeans).

This message was edited 1 time. Last update was at 17/05/2008 20:12:55


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7749
Localização: London, UK
Offline

Cospe na cara do Demeter, mesmo.

http://www.pragprog.com/articles/tell-dont-ask

Mas, ja que eu sei que vc eh cabeca dura e nao vai desistir, o melhor jeito eh criar algo do tipo:


[Email] [WWW] [Yahoo!] [MSN] [ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 3894
Localização: São Paulo
Offline

:attr_reader & cia: http://www.ruby-doc.org/docs/UsersGuide/rg/accessors.html

Se teu código precisa de muitos accessors ele tem um sério problema de design.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

cv wrote:Cospe na cara do Demeter, mesmo.

http://www.pragprog.com/articles/tell-dont-ask


Interessante. É que no meu caso tudo que eu quero é, via reflection, imprimir todas as propriedades públicas de um objeto. Nada de muito complexo ou pecaminoso.


Mas, ja que eu sei que vc eh cabeca dura e nao vai desistir, o melhor jeito eh criar algo do tipo:




Bem legal essa sua idéia, mas eu ou vc ou qualquer um pode criar seu próprio esquema de propriedades para objetos Ruby. Cheguei até a pensar que esse Properties que você incluiu era do próprio Ruby, mas procurando no RDocs não encontrei nada parecido. Me parece natural termos uma convenção onde todos usariam o mesmo esquema para indicar uma propriedade pública, assim como em Java usamos métodos getters (getXXXX) sem argumentos.

Se hoje vc me passa um objeto Cidade e eu quero imprimir e/ou ter acesso a todas suas propriedades como CEP => '22222-123', Name => 'Rio de Janeiro', Estado = 'RJ', etc. Como eu faço? Bisbilhotar variáveis de instancia que por definição são privadas não me parece sadio. Chamar todos os métodos sem parametros seria insano.

Só queria realmente saber se há alguma convenção para isso da própria linguagem ou não.

louds wrote:
Se teu código precisa de muitos accessors ele tem um sério problema de design.


Sim, assim como se vc come muitas batatas-fritas terá sérios problemas gastro-intestinais (vide o filme Super Size Me). Propriedades me parece algo tão trivial quanto batatas-fritas, já se você vai utilizar esse recurso em demazia é outra história. The ass has nothing to do with the paints, right?.

This message was edited 5 times. Last update was at 18/05/2008 02:02:52


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7749
Localização: London, UK
Offline

saoj wrote:Se hoje vc me passa um objeto Cidade e eu quero imprimir e/ou ter acesso a todas suas propriedades como CEP => '22222-123', Name => 'Rio de Janeiro', Estado = 'RJ', etc. Como eu faço? Bisbilhotar variáveis de instancia que por definição são privadas não me parece sadio. Chamar todos os métodos sem parametros seria insano.


Da pra expandir o codigo que eu te mostrei em algo do tipo city.to_pointless_bag_of_properties() #=> {:cep =>'', :name=>'' }, mas como o proprio nome do metodo diz, isso nao faz la muito sentido.
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
urubatan
Moderador
[Avatar]

Membro desde: 21/09/2002 10:31:26
Mensagens: 2400
Localização: Porto Alegre/RS
Offline

saoj, o que tu quer fazer é programar java em Ruby.

se tu vai usar outra linguagem, siga os padrões e preceitos da linguagem nova, e não tente programar da mesma forma que fazia na linguagem anterior.
da forma que tu quer fazer ( Programar Java em Ruby ) não vai ter muitas vantagens usar Ruby.

[]'s
Rodrigo Urubatan
http://www.urubatan.com.br - pt_BR
http://www.urubatan.info - en_US
Arquiteto J2EE
Minha Empresa: http://www.techoffice.com.br
[WWW]
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

urubatan wrote:saoj, o que tu quer fazer é programar java em Ruby.

se tu vai usar outra linguagem, siga os padrões e preceitos da linguagem nova, e não tente programar da mesma forma que fazia na linguagem anterior.
da forma que tu quer fazer ( Programar Java em Ruby ) não vai ter muitas vantagens usar Ruby.


Respire, conte até 10, que vc vai compreender que o que vc está falando é tendencioso ou não tem absolutamente nada haver com o tema em questão.

Recebi um objeto Cidade de um sistema desconhecido/remoto/feito pelo cliente e quero listar todas as suas propriedades via reflection. E isso não justifica essa baboseira retórica de programar em Ruby pensando em Java, Objective C, C#, Python, etc. De novo, e dessa vez em português puro, a bunda não tem nada haver com as calças.

Descaracterizar o argumentador não descaracteriza o seu argumento, apesar de prejudicialmente desviar o foco do debate, além de ser tb indelicado.

This message was edited 10 times. Last update was at 18/05/2008 20:01:23


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7749
Localização: London, UK
Offline

saoj wrote:Recebi um objeto Cidade de um sistema desconhecido/remoto/feito pelo cliente e quero listar todas as suas propriedades via reflection.


Pq nao perguntar pra tal objeto como ele quer ser representado? Use as classes abertas e o fato de Ruby ser baseado em mensagens (e nao em metodos/propriedades) pra te ajudar, ao inves de quebrar o encapsulamento desse jeito.
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 1914
Localização: RJ, BRA
Online

cv wrote:
saoj wrote:Recebi um objeto Cidade de um sistema desconhecido/remoto/feito pelo cliente e quero listar todas as suas propriedades via reflection.


Pq nao perguntar pra tal objeto como ele quer ser representado? Use as classes abertas e o fato de Ruby ser baseado em mensagens (e nao em metodos/propriedades) pra te ajudar, ao inves de quebrar o encapsulamento desse jeito.


Entendi que não precisamos de métodos/propriedades, mas mesmo para fazer essa "pergunta" via "mensagens" precisamos de um acordo entre as partes, certo?

Bom, estarei criando o seguinte requirimento para os objetos externos que querem ter suas propriedades visíveis ao meu sistema.


This message was edited 2 times. Last update was at 18/05/2008 13:12:41


- Durante séculos, a luta da moralidade foi travada entre aqueles que afirmavam que a vida pertence a Deus e aqueles que afirmavam que ela pertence ao próximo - entre aqueles que pregavam que o bem é sacrificar-se em nome de fantasmas no céu e aqueles que pregavam que o bem é sacrificar-se em nome dos ignorantes na terra. E ninguém veio para dizer-lhes que a sua vida pertence a vocês, e que o bem consiste em vivê-la. (John Galt)
[Email] [WWW]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7749
Localização: London, UK
Offline

saoj wrote:


Faz o properties() retornar um Hash com os nomes e valores, logo. Assim vc nao fica fazendo N+1 de bobeira.
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 3894
Localização: São Paulo
Offline

Em ruby é muito mais fácil ter contratos ad hoc. Se teu problema é o que estará acessível na view, assuma que tudo e pronto. Em vez de listar tudo, envie p/ o teu objeto somente as mensagens que a view solicitar. Simples assim.
Na view


Em vez de listar tudo de antemão, espere precisar e só então, quando a view solicitar, envie :foo p/ teu objeto.

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
 
Índice dos Fóruns » Ruby
Ir para:   
Powered by JForum 2.1.8 © JForum Team