Come rappresentare gli oggetti dati gradualmente aumentati in una pipeline [chiuso]

2

Sto lavorando su un programma di elaborazione dati Scala. In sostanza, iniziamo con una raccolta di molti piccoli oggetti di dati, ad esempio (eventId: String, basicInfo: Basic) e filtriamo gradualmente alcuni oggetti e aggiungiamo ulteriori informazioni unendoci alle raccolte originali con altre origini dati (in genere sul campo eventId ) o calcolando nuove campi come funzioni dei campi esistenti.

Ora, sto avendo un certo problema a progettarlo correttamente. È piuttosto ad hoc ora: l'elemento di dati originale è modellato come case class FirstStage(eventId: String, basicInfo: Basic) e le fasi successive sono modellate in modo compositivo: case class SecondStage(first: FirstStage, someOtherId: Long) e così via. Ne risultano catene di accessori piuttosto brutte (ad esempio third.second.first.basicInfo ) e rende il codice molto difficile da modificare. Ad esempio, potremmo voler cambiare qualche funzione persist:ThirdStage => per operare invece o in aggiunta su SecondStage , ma la mancanza di polimorfismo nel design lo rende piuttosto difficile.

Un'idea potrebbe essere quella di iniziare con lo stadio terminale, inizialmente impostare tutti i suoi campi su null, e gradualmente riempirli, ma sembra come se sarebbe difficile tenere traccia di ciò che accade quando. Oppure, potremmo abbandonare le classi case per avere SecondStage estendere FirstStage e così via, ma penso che sia probabile che il programma perderà la sua linearità nei prossimi mesi, il che renderà l'approccio di ereditarietà piuttosto grossolano.

    
posta alex 07.01.2016 - 20:56
fonte

1 risposta

0

Penso che sia necessario utilizzare la monade di stato da scalaz - > link

Il tipo di dati sarebbe Stato [Stage, Data] dove Stage comprende i tuoi stadi e dati il valore che accompagna lo stage corrente.

case class Stage(id: String, someStateInfo: String)
case class Data(someData: String, anotherData: String)

Crea uno stato:

State[Stage, Data] { 
   case Stage(id, someStateInfo) => 

   // some function that inspects stateInfo and generates a newData
   val newData = if (someStateInfo == ...) Data("x", "y")
                 else Data("a", "b")
   val newState = State(generateNewId(), generateNewStateInfo())

   // return new state and new data
   (newState, newData)
}

La domanda è un po 'vaga e non sono sicuro che questo sia ciò che desideri, ma spero che ti consenta di esplorare il link che ho fornito e di essere disposto a piegare la tua mente con questo modello di programmazione funzionale (Monad + State Monad ).

    
risposta data 02.02.2016 - 23:08
fonte

Leggi altre domande sui tag