2010-02-12 19 views
7

Noté que en Ruby es muy común que las API de los proveedores pasen los resultados como matrices. ¿No debería Plain Old Objects (como POJOs en Java) ser más estándar? Si escribo mi propia biblioteca ¿no debería usar POJOs POROs?¿Objetos antiguos planos en Ruby?

Respuesta

3

Son todos los objetos, todo el tiempo. La clave es si los objetos devueltos tienen un comportamiento asociado a ellos. Está bien para hacer esto:

def read_first_and_last_name(data_source) 
    [data_source.read_string, data_source.read_string] 
    end 

Pero en el momento observa que se produce un comportamiento asociado con esos elementos de datos ...

def print_name(first_name, last_name) 
    puts "#{first_name} #{last_name}" 
    end 

    def read_and_print_name 
    first_name, last_name = read_first_and_last_name(data_source) 
    print_name(first_name, last_name) 
    end 

...entonces debe ser una clase:

class FullName 

    def FullName.read(data_source) 
     FullName.new(data_source.read_string, data_source.read_strng) 
    end 

    def initialize(first_name, last_name) 
     @first_name = first_name 
     @last_name = last_name 
    end 

    def print 
     puts "#{@first_name} #{@last_name}" 
    end 

    end 

con el comportamiento de un nombre muy bien encapsulado, el uso es tan simple como:

def read_and_print_name 
    FullName.read(data_source).print 
    end 
4

Creo que array vs object es una dicotomía falsa.

Es perfectamente razonable, donde una llamada API devuelve más de una cosa, que está en la forma de una matriz (y una matriz es un objeto bastante simple, y por lo tanto podría decirse que es 'PORO', en rubí de todos modos)

Editar: en respuesta a sus comentarios:

El ejemplo que citas (http://github.com/cjheath/geoip) devuelve una matriz de elementos diferentes. Estoy de acuerdo en que este no es necesariamente el mejor formato para devolver los datos. En ese caso, hubiera pensado que un hash con claves de nombre sensato sería una mejor estructura.

Como dice John Topley, la naturaleza OO de Ruby significa que las personas no tienen que inventar terminología como 'PORO', ya que un hash es casi tan simple como se puede obtener.

+1

No, porque es necesario hacer referencia a la documentación de la API para determinar qué valor se está transmitido en qué ubicación. Si estuviera en un objeto personalizado, no tendría que volver a consultar el rdoc. – Zombies

+0

¿Se está refiriendo realmente a una matriz en la que tiene instancias de clases diferentes en puntos predefinidos de la matriz? ¿Puedes vincular a un ejemplo del tipo de cosas a las que te refieres? – DanSingerman

+0

http://github.com/cjheath/geoip .... Parece que esas funciones se beneficiarían de devolver objetos personalizados en lugar de una cantidad ** variable ** de cadenas en una matriz – Zombies

2

¿Qué contienen esas matrices de resultados? La respuesta es que en Ruby contienen objetos, porque todo en Ruby es un objeto.

POJOs en el mundo de Java fueron una reacción contra algunas de las complejidades infligidas al mundo por la empresa Java, p. Ej. EJBs. Para citar a Martin Fowler que acuñó el término:.

"Nos preguntamos por qué la gente estaba tan contra el uso de objetos regulares en sus sistemas y llegaron a la conclusión de que era porque los objetos simples carecían de un nombre de fantasía Así que les dimos uno, y es atrapado muy bien ".

Afortunadamente, en Ruby siempre ha sido natural que la gente simplemente practique la programación orientada a objetos sin la necesidad de inventar terminologías a su alrededor.

+1

Supongo que lo que realmente estoy preguntando es si hay una mejor manera de devolver atributos con nombre y por qué no se usa más, así que tal vez debería volver a hacer esta pregunta. – Zombies

+1

Una de las razones podría ser que las gemas como HTTParty hacen que sea muy fácil ajustar los servicios web en Ruby y obtener un envoltorio de objetos liviano alrededor del JSON o XML devuelto de forma gratuita. –

2

Yo personalmente uso POROs en casi todo lo que escribo que no es un guion descartable completo.

A menudo me encuentro creando un tipo de clase de titular de datos que administraría y mantendría varios objetos de mi tipo específico e incluiría algunos métodos de ayuda. Encuentro esto conveniente para cuando alguien más tiene que trabajar con mi código también.

Creo que esta pregunta es muy subjetiva en el sentido de que no hay una respuesta que siempre es correcta. A veces, solo se puede transferir una matriz y no es necesario crear una clase adicional. A veces, el nivel extra de abstracción hace que el usuario tenga una idea mucho más clara.

+0

Esto es exactamente lo que me preguntaba. Gracias por agregar tu opinión. No creo que sea subjetivo, ya que estoy tratando de ver lo que otros hacen y tomar todos estos en consideración para mi propia edificación ... – Zombies

Cuestiones relacionadas