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
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
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.
¿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.
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
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. –
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.
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
- 1. DataSnap "Objetos antiguos de Delphi" y objetos anidados
- 2. Cómo anotar entre planos o entre planos en paneles de múltiples planos en R
- 3. comparar objetos en Ruby
- 4. ¿Puede crear automáticamente un gráfico de objetos a partir de objetos planos?
- 5. ¿Quitar objetos idénticos en Ruby?
- 6. matraz: error_handler para planos
- 7. Eliminar registros antiguos en mongodb
- 8. Fooling Ruby, ===, con objetos proxy
- 9. Métodos en Ruby: ¿objetos o no?
- 10. Notificación de destrucción de objetos en Ruby
- 11. Encontrar ciclos hamiltonianos en gráficos planos cúbicos
- 12. Python - eliminar archivos antiguos
- 13. Three.js/WebGL: planos transparentes que ocultan otros planos detrás de ellos
- 14. localStorage.getItem devuelve datos antiguos en IE 9
- 15. ¿Realloc sobrescribe los contenidos antiguos?
- 16. Materiales instructivos antiguos de Delphi
- 17. Problemas antiguos de "Informe C++"?
- 18. ¿PDFBox admite colores planos y separaciones?
- 19. ¿Puedo usar las funciones de eventos de jQuery con objetos antiguos simples?
- 20. ¿Cómo reconoce Google StreetView los planos 3D?
- 21. Android RadioGroup/RadioButtons dinámicos como botones planos
- 22. ¿Cómo está Ruby completamente orientado a objetos?
- 23. Diseño orientado a objetos con Ruby
- 24. Elementos planos de QTreeView: no anidados
- 25. base de datos vs. archivos planos
- 26. Creación de objetos en tiempo de ejecución en Ruby
- 27. Uso en el mundo real de objetos vinculantes en ruby
- 28. Ruby to_json en objetos incluidos en el presupuesto
- 29. ¿Cómo se manejan navegadores muy antiguos en su sitio?
- 30. Forma garantizada de comparar objetos por identidad en Ruby
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
¿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
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