2012-09-07 10 views
5

Abbiamo un sistema java implementato in diversi livelli. Al livello più basso, ci sono servizi che estendono una serie di componenti dell'infrastruttura come database, blob-storage, code di elaborazione, ecc. Oltre a ciò, abbiamo il livello del dominio che implementa i flussi di lavoro che usano uno o più di questi servizi (usando il comando e i modelli di comando composto). Infine c'è un layer basato su jax-rs (jersey), che fornisce un'interfaccia/protocollo REST implementato in termini di flussi di lavoro dal livello dominio.Uso di Scala per implementare un livello dominio che copre una serie di servizi basati su java

La mia esperienza con Scala è limitata, ma ho il sospetto che potrebbe essere un buon strumento per scrivere una versione più espressiva del nostro livello di dominio perché il codice Java è piuttosto prolisso e difficile da eseguire il debug a volte. In parte perché il controllo della composizione e dell'esecuzione dei comandi è gestito da classi base estese da comandi concreti. Con il senno di poi, questa potrebbe non essere stata una scelta di design ideale.

Spero che questa descrizione di altissimo livello serva per illustrare ciò che sto cercando di ottenere. Fammi sapere se ho bisogno di essere più specifico. Sono principalmente interessato a come il livello del dominio possa essere integrato con Scala mantenendo il livello di servizio basato su Java. Inoltre, i suggerimenti su come implementare il protocollo http/REST sulla parte superiore del livello del dominio in modo che possa essere distribuito in un contenitore di applicazioni web java sarebbe anche molto interessante.

+1

Per alcune idee su diverse implementazioni, suggerisco di dare un'occhiata a come alcuni dei modelli di progettazione più comuni possono essere implementati in modo diverso in Scala. Un buon punto di partenza è http://stackoverflow.com/questions/11123984/which-gof-design-patterns-has-entely-different-implementation-java-vs-scala – MilesHampson

risposta

1

Tatticamente un ovvio punto di partenza è quello di approfittare di battitura strutturale di Scala e guardare rappresentare i comandi come tratti:

trait CommandType1 { def operation() } 

È allora possibile costruire le tue composizioni comando di questi tratti:

case class CompositeCommand(commandOperand: CommandType1*) extends CommandType1 { 
    def operation() = commandOperand foreach { _.operation() } 
} 

Un altro vantaggio che Scala ha su Java per il livello del flusso di lavoro è che è possibile definire i comandi come funzioni passabili. Ciò apre la possibilità di creare comandi generali di alto livello che rappresentano operazioni astratte e quindi di creare e memorizzare funzioni parziali di questi comandi per i flussi di lavoro di uso comune/utilizzati.

Il livello del protocollo Scala frontale consente agli spettatori di occuparsi delle richieste in arrivo. Inoltre, probabilmente vale la pena guardare qualcosa come Scala's Cake Pattern per fornire a DI il controllo della logica aziendale, e in multimetodi per l'invio dinamico nel codice di front-end.

Problemi correlati