Re: ridurre le molteplici import

26 views
Skip to first unread message
Message has been deleted

Ivano Pagano

unread,
Oct 30, 2012, 4:54:06 AM10/30/12
to sug...@googlegroups.com
In generale non c'e' niente di male nel fare tanti import, se stai usando molti componenti.
Se vuoi raggruppare tutto, allora dovresti fare un object contenitore che espone tutte le chiamate che desideri, delegandole ai singoli pezzetti.

Tipo, 

  object globalDSL {
     
    import a0Dominio._
    import a0DSL._
    import a0DSL.ComponentDSL._
    import a0DSL.AddFunction._
    import a0DSL.GroupDSL._
    import.....
    
    def myFun1 = ...delega al componente
    def myFun2 = ...delega al componente
    ...
    val myVal1 = ...delega al componente
    ...
    type MyType1 = ... una classe che vuoi rendere visibile
    ...
  }

una volta che hai fatto questo nel client ti basta fare l'import di questo oggetto per avere visibilita' su tutto quello che hai delegato all'interno, con un semplice:

import globalDSL._

Vorrei farti presente che la scelta di come organizzare il codice in package diversi, e di cosa importare, non e' un punto secondario.
La modularizzazione (ogni oggetto che ingloba funzioni, variabili, tipi e' una specie di modulo del tuo programma) e' un argomento che va gestito con attenzione e considerazione, per evitare che il tuo namespace finisca presto affogato di nomi (di metodi, classi, variabili) che vanno in conflitto e di cui non e' chiara la provenienza.
Per questo un import semplice e automatico come adesso ti tornerebbe comodo non e' previsto di default, ma e' necessario specificare ogni volta cosa deve essere visibile ad ogni parte del codice.
Anche per questo in scala e' permesso fare import in qualunque parte del codice e non solo all'inizio del file.


On Monday, October 29, 2012 6:08:25 PM UTC+1, Emanuele Losanno wrote:

Sto realizzando un DSL.
Ho un package con il dominio del mio modello, ed un altro package dove implemento il DSL.
Per ogni classe concreta del mio modello creo un file object nel package del dsl con le regole che definiscono la sintassi per la classe concreta.
Il problema è che questo object contiene più di una classe, dove ogni classe mi definisce un metodo (che in sostanza è una regola per la mia sintassi.) Non posso eliminare le classe.

Quindi quando nel main voglio usare il mio DSL devo importare i singoli object oltre al package del dominio. Per esempio:

import a0Dominio._
import a0DSL._
import a0DSL.ComponentDSL._
import a0DSL.AddFunction._
import a0DSL.GroupDSL._
import.....e molti altri

Come posso ridurre tutti questi import.
Posso dichiararli tutti in un altro object e poi importare solo quella? NO, non và.
Esiste una soluzione a questo inconveniente?




Message has been deleted
Message has been deleted

Ivano Pagano

unread,
Nov 9, 2012, 5:49:42 AM11/9/12
to sug...@googlegroups.com
Purtroppo non posso fare test ma la "delegazione" dovrebbe funzionare come segue.

package a0DSL

object A0DSL {
import ComponentDSL._
import SAInterfaceDSL._

//dominio
implicit def nameToDescriptionComponent (nm: String) = new DescriptionHelperComponent (nm)
implicit def componentToProperties(cm: Component) = new PropertiesHelperComponent (cm)
//dsl
implicit def sainterfaceToProperties(in: SAInterface) = new PropertiesHelperSAInterface(in)
def sainterface(ds: String)  = SAInterfaceDSL.sainterface(ds)
}

A questo punto puoi rimuovere le tue conversioni implicite da ComponentDSL SAInterfaceDSL ed avere tutto disponibile con un solo 

import a0DSL.A0DSL._

In questo caso con un solo import avresti reso visibili solo ed esclusivamente le operazioni di interesse per il codice client e non tutto quello che c'e' all'interno della tua libreria.

Non so se il tutto funziona, purtroppo non ho il modello completo e non ho tempo per riscrivere da zero un modello di test. Lascio a te la verifica e le eventuali correzioni.

On Sunday, November 4, 2012 5:48:17 PM UTC+1, Emanuele Losanno wrote:

Ciao Ivano, come sempre grazie mille per la risposta.

Non mi è chiaro bene il concetto della “delegazione”.

In poche parole dovrei assegnare nuovi nomi ai metodi e classi che voglio importare?


... 

val C2 = "C2" sacomponent "Questa è la descrizione di C2"

C2 with_properties List(P1, P2)

 

val I3 = "I3" sainterface "Questa è la descrizione di I3"

I3 with_properties Nil

 

Il punto ora è questo:

Nel main io devo importare:

import a0Dominio._

import a0DSL.ComponentDSL._

import a0DSL.SAInterfaceDSL._

 

Volendo ridurre le ultime due istruzioni di import in una sola. Come creo il mio object contenitore?

In sostanza a me serve rendere visibile solo i seguenti metodi:

sacomponent

saconnector

with_properties  -> di ComponentDSL

sainterface

with_properties    ->  di SAInterfaceDSL

 
Reply all
Reply to author
Forward
0 new messages