¿Existe una forma generalmente aceptada de agregar metainformación a elementos de matriz que indiquen cómo manejarlos?

StackOverflow https://stackoverflow.com/questions/1421226

  •  07-07-2019
  •  | 
  •  

Pregunta

Estoy usando una matriz que contiene los resultados de una consulta de base de datos, que luego se formatea como html (para una aplicación web) o como csv (para importar en una hoja de cálculo). Quiero adjuntar información al elemento de matriz que tiene información adicional sobre cómo se pueden usar los datos de este elemento.

Por ejemplo, array-element-data ...

  • ... se puede mostrar como un enlace: luego quiero que se adjunte la información del enlace. El código que crea html a partir de la matriz puede usarlo para crear un enlace.
  • ... es una fecha de la forma 2009-09-14: luego quiero marcarla de alguna manera como una fecha. Si el uso es para una página html, entonces se puede mostrar algo más hermoso, p. Mo 14 de septiembre o Hoy ; si el destinatario es un csv, sería mejor dejarlo.

¿Existe una forma de mejores prácticas para resolver este problema?

Pensé en varias soluciones posibles, pero quería preguntar si alguien ya conoce un " mejor práctica " ;. Posiblemente de mejor a peor:

  1. Almacene cada elemento de la matriz como un objeto creado a medida (Fecha, Enlace, Texto ...), en lugar de tener el elemento de la matriz como texto. Posiblemente proporcione un método .to_string() predeterminado.
  2. Convierta cada elemento de matriz en un hash, de modo que pueda decir a[5][7]['text'] o a[5][7]['link'].
  3. Cree diferentes versiones de la matriz, p. textArray[5][7], linkArray[5][7]

Crear el html como inicio y simplemente usar la versión de texto parece una mala idea, ya que la apariencia difiere según el uso (p. ej. 2009-09-14 vs Mo Sep 14 ).

¿O solo estoy haciendo la pregunta incorrecta?

¿Fue útil?

Solución

A menos que especifique un idioma, (1) y (2) son básicamente lo mismo. Un objeto o un hash, ¿cuál es la diferencia en un lenguaje de programación dinámico que no sea quizás la sintaxis? En Lua todo es un diccionario.

(1) / (2) generalmente se prefieren a (3), ya que generalmente hacen que copiar un elemento junto con sus metadatos sea mucho más fácil. Al ordenar, por ejemplo.

Entonces, sin ser específico de un lenguaje / entorno, la mejor práctica en ausencia de condiciones especiales es combinar de alguna manera los metadatos y el elemento, y tratar el tipo de datos resultante. Puede hacer esto definiendo una nueva clase que contenga ambos, definiendo una subclase más de su tipo de elemento original, usando un par genérico, usando un diccionario de propósito general, o simplemente almacenando los metadatos en el objeto original (que el enfoque sea obvio en, digamos, Javascript).

Otros consejos

Como consejo general, es mejor si los datos no contienen información sobre cómo representarse a sí mismos.

En cambio, la parte de la aplicación que crea la representación debe tener esta configuración en una estructura de datos separada. Piense en ello como un archivo XML y varios archivos XSLT que crean diferentes representaciones.

Pero en los casos en que esto no es posible o cuando tiene que fusionar las dos informaciones en una estructura de datos para la conversión real, seguí esta regla general:

¡No seas inteligente y haz lo más natural en tu idioma!

  • En Java y Delphi siempre usé el " objeto personalizado " variante, porque se obtienen ciertas ventajas, como la comprobación del tiempo de compilación.
  • En PHP siempre usé hashes porque es el estilo más PHP-ish.

He hecho " Solución 3 " a veces, pero siempre me arrepiento. Estas estructuras tienden a convertirse en una pesadilla de mantenimiento y lo más probable es que se encuentre con problemas de sincronización, desde el punto de vista de los datos y también desde el punto de vista de la codificación.

Un enfoque común en los marcos web sería mapear registros en objetos: un registro de la base de datos se lee en un objeto, por lo que su resultado es una matriz de objetos. Para diferentes tablas necesitas diferentes clases. Este es uno de los componentes básicos para el patrón del Controlador de vista de modelo (MVC) utilizado en muchos marcos web.

Por ejemplo, en Ruby on Rails, la Tabla users es manejada por una Clase User. Puede crear ambos utilizando un andamio.

ruby script\generate scaffold user lastname:string link:string joined:date

Fecha, Boolean, String, Text, Decimal, Integer son tipos de datos distintos aquí. Lamentablemente, las URL no lo son, así que tengo que usar String para el enlace.

Puede leer usuarios de la base de datos de esta manera:

@u = User.find(77)       # gives you one object
@list = User.find(:all)  # gives you an array of User-objects

el atributo del objeto de usuario tiene los tipos correctos para trabajar con fechas, números, etc.:

if 100.days.ago < @ u.se unió entonces ...

La lógica inherente a los datos se implementa en la clase Usuario.

La lista de usuarios puede mostrarse en HTML usando una vista como esta:

  <h1>Listing Users</h1>
  <table>
    <tr>
      <th>Lastname</th>
      <th>Link</th>
      <th>Joined on</th>
    </tr>
  <% @list.each do |user| %>
    <tr>
      <td><%=h user.lastname %></td>
      <td><%= link_to "Homepage", user.link %></td>
      <td><%=h user.joined %></td>
    </tr>
  <% end %>
  </table>

La lógica que es inherente a la visualización de los datos se implementa en las vistas. El conocimiento de qué atributo del objeto debe tratarse como un enlace o un texto normal reside en la vista, no en el objeto mismo.

La visualización / salida de los mismos datos que cvs se realiza creando una vista cvs.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top