Sta usando questa complessa pratica di dati complessi?

7

Proprio ora nella mia attuale azienda devo "analizzare" un csv ed estrarre alcuni dati da esso (nel senso del data mining).

Mi sono sorpreso definendo la seguente struttura dati (Java 8):

static List<Map<String, Map<String, LocalDate[]>>> intervalStructure

Questa è considerata una cattiva pratica? Dovrei usare una classe auto-definita invece di memorizzare alcuni dati?

    
posta lJoSeTe4ever 27.01.2016 - 17:26
fonte

2 risposte

13

Questa è una struttura di dati stupida e tipizzata con caratteri stringati. È un:

  • Lista
    • di Maps
      • digitato da Stringa
      • di Maps
        • digitato da Stringa
        • di Array data locale

Questo rende difficile creare, attraversare e molto bene farti entrare in codice che assomiglia a:

foo.get(1).get("bar").get("qux")[42]

E indovina un po '... hai un'eccezione del puntatore nullo che è stata lanciata su quella linea.

Anche impostare la struttura non è molto divertente. Che si tratti di una struttura dati grezza significa che devi eseguire tutte le aggiunte e le eliminazioni manualmente lavorando sulle interfacce (che possono essere piuttosto profonde) piuttosto che lavorare con un Costruttore o un Builder.

Hai collegato la rappresentazione passata nel tuo codice alla rappresentazione del file. Quando uno ha bisogno di cambiare, l'altro ha bisogno di cambiare - e possibilmente in più posizioni. Pensa alle gioie che avrai quando avrai un file di dati xml o json o yaml dietro di esso e dovrai passare e modificare le cose.

Tutto sommato è una cattiva idea.

Un'idea migliore sarebbe quella di avere una o più classi che espongono la logica del recupero dei dati. Hai un Structure . Espone un get(String bar, String qux) e restituisce un List . Ciò consente di isolare l'attraversamento della struttura (se è così) nei campi privati in modo che possa essere modificato in base alle esigenze. Espone anche un add(String bar, String qux, LocalDate date) che ti consente di isolare chiaramente la logica per costruirla in modo testabile.

Potresti scoprire che vuoi altre domande su quei dati a cui vuoi rispondere. Forse vuoi un isInRange(...) o contains(...) o qualcos'altro che chiedi. Non riuscendo ad avere questa bella classe con i metodi corrispondenti per rispondere a queste domande, scoprirai che hai un metodo statico in una classe helper (che sta iniziando a sentire) che agisce su quei dati.

public static boolean contains(List<Map<String, Map<String, LocalDate[]>>> arg, LocalDate value)

Sembra brutto com'è. Non farlo.

Se non lo fai questo, avrai una copia di quella logica ogni volta che la usi, che non è affatto SECCO.

In ogni caso, lavorare su strutture di dati grezzi come questo non è auspicabile.

    
risposta data 27.01.2016 - 17:38
fonte
4

Devo essere rispettosamente in disaccordo con Michael qui, e alcuni programmatori piuttosto intelligenti, come Rich Hickey , tendono a pensare secondo le mie stesse linee. La chiave qui è che fai attenzione a non oltrepassare questa struttura dati ovunque, ma la usi come base da cui costruisci il tipo di astrazione di cui Michael parla nella sua risposta.

Questo tipo di strutture dati subisce un brutto colpo. Sono estremamente facili da manipolare, con strumenti altamente riutilizzabili. Senza sapere nulla della tua applicazione diversa da quella riga di codice che definisce una struttura dati, potrei scrivere un'interfaccia per convertirla in JSON, HOCON o XML. Potrei memorizzarlo in un database. Non devo scrivere alcun codice di serializzazione / deserializzazione personalizzato, che mi consente di riutilizzare le librerie generiche. Posso facilmente scrivere query e filtri per darmi dei bei livelli basati sulla classe strongmente tipizzati sopra questo. Quando il mio formato di file CSV cambia, ho questo strato di isolamento molto più flessibile e dinamico tra esso e le mie classi più rigide e statiche sopra di esso.

In sintesi, non rendi la tua struttura dati sole , ma usarla come una struttura dati intermedia può risolvere molti problemi di manutenibilità.

    
risposta data 28.01.2016 - 00:44
fonte

Leggi altre domande sui tag