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?