Esiste un modo generalmente accettato per aggiungere meta informazioni agli elementi dell'array che indicano come gestirli?

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

  •  07-07-2019
  •  | 
  •  

Domanda

Sto usando un array che contiene i risultati di una query di database, che viene successivamente formattata come html (per un'applicazione web) o come CSV (per l'importazione in un foglio di calcolo). Voglio allegare informazioni all'elemento array che contiene alcune informazioni aggiuntive su come utilizzare i dati di questo elemento.

Ad esempio, array-element-data ...

  • ... può essere visualizzato come un collegamento: quindi voglio le informazioni sul collegamento allegate. Il codice che crea html dall'array può usarlo per creare un collegamento.
  • ... è una data del modulo 2009-09-14: quindi voglio in qualche modo contrassegnarlo come una data. Se l'uso è per una pagina html, può quindi essere visualizzato in qualche modo più bello, ad es. Lu 14 set o Oggi ; se il destinatario è un CSV, sarebbe meglio lasciarlo.

Esiste un modo ottimale per risolvere questo problema?

Ho pensato a diverse possibili soluzioni, ma volevo chiedere se qualcuno conosce già un " best practice " ;. Da forse il migliore al peggio:

  1. Archivia ogni elemento dell'array come oggetto creato su misura (Data, Collegabile, Testo ...), invece di avere l'elemento dell'array come testo. Forse fornire un metodo .to_string() predefinito.
  2. Rendi ogni elemento della matrice un hash, in modo da poter dire a[5][7]['text'] o a[5][7]['link'].
  3. Crea versioni diverse dell'array, ad es. textArray[5][7], linkArray[5][7]

Creare l'html come inizio e usare semplicemente la versione testuale sembra una cattiva idea, poiché l'aspetto differisce a seconda dell'uso (es. 2009-09-14 vs Mo Sep 14 ).

O sto solo facendo la domanda sbagliata?

È stato utile?

Soluzione

A meno che non specifichi una lingua, (1) e (2) sono sostanzialmente uguali. Un oggetto o un hash, qual è la differenza in un linguaggio di programmazione dinamico diverso dalla sintassi forse? In Lua tutto è un dizionario.

Di solito si preferisce

(1) / (2) a (3), poiché generalmente rendono molto più semplice la copia di un elemento insieme ai suoi metadati. Durante l'ordinamento, ad esempio.

Quindi, senza essere specifici di un linguaggio / ambiente, la migliore pratica in assenza di condizioni speciali consiste nel combinare in qualche modo i metadati e l'elemento e trattare il tipo di dati risultante. Puoi farlo definendo una nuova classe per contenere entrambi, definendo altre sottoclassi del tuo tipo di elemento originale, usando una coppia generica, usando un dizionario generico o semplicemente archiviando i metadati nell'oggetto originale (che l'approccio essere ovvio in, diciamo, Javascript).

Altri suggerimenti

Come consiglio generale è meglio se i dati non contengono alcuna informazione su come rappresentarsi.

Invece la parte dell'applicazione che crea la rappresentazione dovrebbe avere queste impostazioni in una struttura di dati separata. Pensalo come un file XML e vari file XSLT che creano diverse rappresentazioni.

Ma nei casi in cui ciò non è possibile o quando devi unire le due informazioni in una struttura di dati per la conversione effettiva, ho seguito questa regola empirica:

Non essere intelligente e fai ciò che è più naturale nella tua lingua!

  • In Java e Delphi ho sempre usato " oggetto personalizzato " variante, perché si ottengono alcuni vantaggi come il controllo del tempo di compilazione.
  • In PHP ho sempre usato gli hash perché è lo stile più PHP-ish.

Ho fatto " Soluzione 3 " a volte, ma me ne sono sempre pentito. Queste strutture tendono a diventare un incubo per la manutenzione e molto probabilmente ti imbatterai in problemi di sincronizzazione, dal punto di vista dei dati e anche dal punto di vista della codifica.

Un approccio comune nei framework Web sarebbe quello di mappare i record sugli oggetti: un record del database viene letto in un oggetto, quindi il risultato è una matrice di oggetti. Per tabelle diverse sono necessarie classi diverse. Questo è uno dei blocchi costitutivi del modello Model View Controller (MVC) utilizzato in molti framework Web.

Ad esempio in Ruby on Rails la tabella users è gestita da una classe User. Puoi creare entrambi usando uno scaffold.

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

Data, valore booleano, stringa, testo, decimale, numero intero sono tipi di dati distinti qui. Sfortunatamente gli URL non lo sono, quindi devo usare String per il collegamento.

Puoi leggere gli utenti dal database in questo modo:

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

l'attributo dell'oggetto utente ha i tipi corretti per lavorare con date, numeri, ecc:

se 100.days.ago < @ u.joined then ....

La logica inerente ai dati è implementata nella classe User.

L'elenco degli utenti può essere visualizzato in HTML usando una vista come questa:

  <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 logica inerente alla visualizzazione dei dati è implementata nelle viste. La conoscenza quale attributo dell'oggetto deve essere trattato come un collegamento o un testo normale risiede nella vista, non nell'oggetto stesso.

La visualizzazione / emissione degli stessi dati di cvs viene effettuata creando una vista cvs.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top