Existe uma maneira geralmente aceite para adicionar informações meta para array de elementos indicando como lidar com eles?

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

  •  07-07-2019
  •  | 
  •  

Pergunta

Eu estou usando uma matriz que contém os resultados de uma base de dados de consulta, que mais tarde é formatado como html (para um webapplication) ou como CSV (para importação numa folha de cálculo). Eu quero anexar informações para a matriz elemento que tem algumas informações adicionais sobre como podem ser utilizados os dados deste elemento.

Por exemplo, matriz-Elemento de dados ...

  • ... pode ser exibida como um link: então eu quero que as informações link anexado. O código que cria html da matriz pode usá-lo para criar um link.
  • ... é uma data do 2009-09-14 forma: então eu quero de alguma forma sinalizá-la como sendo uma data. Se o uso é para um html-página, ele pode, então, ser apresentado um pouco mais bonita, por exemplo, Mo 14 de setembro ou hoje ; se o destinatário é um csv que seria melhor deixá-lo.

Existe uma maneira mais prática de resolver este problema?

Eu pensei em várias soluções possíveis, mas queria perguntar se alguém já conhece a "melhor prática". De possivelmente melhor para o pior:

  1. Guarde cada matriz-elemento como objeto criado sob medida (Data, Linkable, texto ...), em vez de ter a matriz de elementos como texto. Possivelmente fornecer um método .to_string() padrão.
  2. Faça cada matriz elemento de um hash, para que eu pudesse dizer a[5][7]['text'] ou a[5][7]['link'].
  3. Faça diferentes versões do array, por exemplo, textArray[5][7], linkArray[5][7]

Criando o html como um começo e utilizando apenas o texto-versão parece ser uma má idéia, como os difere de aparência dependendo do uso (por exemplo, 2009-09-14 vs Mo setembro 14 ).

Ou estou apenas fazendo a pergunta errada?

Foi útil?

Solução

A menos que você especificar um idioma, (1) e (2) são basicamente os mesmos. Um objeto ou um hash, que é a diferença em uma linguagem de programação dinâmica à excepção talvez de sintaxe? Em Lua tudo é um dicionário.

(1) / (2) são geralmente preferidos para (3), uma vez que eles geralmente fazer a cópia de um elemento, juntamente com os seus meta-dados muito mais fácil. Ao classificar, por exemplo.

Assim, sem ser específico para uma linguagem / ambiente, melhores práticas na ausência de quaisquer condições especiais é combinar de alguma forma o meta-dados e o elemento, e negócio no tipo de dados resultante. Você pode fazer isso através da definição de uma nova classe para conter tanto, definindo mais um mais subclasses de seu tipo de elemento original, usando um par genérico, usando um dicionário de uso geral, ou apenas armazenar os meta-dados no objeto original (que faria a ser a abordagem óbvia, digamos, Javascript).

Outras dicas

Como um conselho geral é melhor se os dados contém nenhuma informação sobre a forma de representar a si mesmo.

Ao invés, a parte da aplicação criando a representação deve ter essas configurações em uma estrutura de dados separado. Pense nisso como um arquivo XML e vários arquivos XSLT criar diferentes representações.

Mas nos casos em que tal não seja possível ou quando você tem de fundir os dois informação em uma estrutura de dados para a conversão real, eu segui esta regra:

Do not ser inteligente e fazer o que é mais natural na sua língua!

  • Em Java e Delphi eu sempre usei a variante "custom objeto", porque se obtém algumas vantagens como a verificação de tempo de compilação.
  • No PHP eu sempre hashes usado porque é o estilo mais PHP-ish.

Eu fiz "Solução 3" às vezes, mas eu sempre me arrependi. Estas estruturas tendem a tornar-se um pesadelo de manutenção e você provavelmente vai correr em isses de sincronização, de um ponto de vista de dados e também do ponto de vista de codificação.

Uma abordagem comum em frameworks web seria mapear registros em objetos: um registro do banco de dados é lido em um objeto, para que o seu resultado é uma matriz de objetos. Para tabelas diferentes que você precisa classes diferentes. Este é um dos blocos de construção para o padrão Model View Controller (MVC) usado em muitos frameworks web.

Por exemplo, no rubi sobre carris A Tabela users é tratado por um User Classe. Você criar tanto usando um andaime.

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

Data, Boolean, String, Texto, Decimal, Integer são tipos de dados distintos aqui. Infelizmente URLs não são, por isso tenho de usar cordas para o link.

Você pode ler os usuários do banco de dados como este:

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

o atributo do objeto de usuário têm os tipos corretos de trabalho com datas, números, etc:

Se 100.days.ago <@ u.joined então ....

Lógica que é inerente aos dados é implementado na classe de usuário.

A lista de usuários pode ser exibida em HTML usando uma exibição 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>

Lógica que é inerente à exibição dos dados é implementado na vista (s). O conhecimento que atributo do objeto deve ser tratado como um link ou um reside texto normal na vista, não no próprio objeto.

Exibindo / Produzir os mesmos dados como cvs é feito através da criação de um cvs-view.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top