PDA

View Full Version : [Java / qualsiasi object oriented] proliferazione di metodi "uguali" con composite


ndakota
06-09-2013, 17:21
Ciao a tutti. Sto lavorando ad un progetto in Java e usiamo Vaadin come framework per l'interfaccia grafica. Per chi non lo conoscesse, è una specie di Swing per il web. Abbiamo creato dei componenti(classi) in modo da riutilizzarli, fino ad arrivare ai componenti più interni che contengono le TextField, per dire. Ora, nelle view utilizziamo gli oggetti delle classi "nodo". Solo che quando c'è bisogno di effettuare un'operazione sulle TextField, si forma una catena di invocazioni per settare qualcosa a quelli oggetti. Se il livello è uno, nessun problema. Solo che visto che si arriva facilmente anche a 4 livelli non mi sembra una soluzione per nulla elegante. Qualcuno ha da suggerirmi qualcosa?

Un esempio:


class A {
TextField a1, a2, a3;
....

public void setReadOnly(boolean b) {
a1.setReadOnly(b);
a2.setReadOnly(b);
a3.setReadOnly(b);
}
}

class B {
private A a;
....

public void setReadOnly(boolean b) {
a.setReadOnly(b);
}
}

class C {
private B b;
....

public void setReadOnly(boolean b) {
b.setReadOnly(b);
}
}


Grazie :)

mone.java
06-09-2013, 21:07
Ciao, magari quello che sbagli è proprio l'approccio, ovvero come mai che per impostare una proprietà di quel textfield devi passare attraverso 4 strati di interfaccia? cioè se tu facessi un esempio un po più concreto (ovvero contestualizzando di più a domanda) forse la soluzione si troverebbe...

PS anche io sto usando Vaadin e devo dire che mi piace veramente molto.

ndakota
07-09-2013, 12:42
Bè l'esempio più o meno è completo. Nel senso che io nella mia vista(la mia parte di contenuti della pagina) inizialmente setto tutti i campi read only, poi se l'utente vuole modificarli clicca un bottone e si abilitano. Quindi dalla view chiamo questo metodo setReadOnly, però lo chiamo dagli oggetti contenitori, visto che nella view uso quelli. Altrimenti che li ho creati a fare? :stordita:
Sì insomma, lo so che sarà una cavolata ma vorrei sapere il modo migliore per risolvere queste situazioni. Credo sia una cosa piuttosto comune, deve esserci un pattern.

mone.java
07-09-2013, 12:49
Bhe secondo me puoi fare una funzione ricorsiva che parte dal componente di base e prende tutti i componenti figli e verifica se sono istanze di TextField (instanceof)... in tal caso fa il cast a TextField e imposta la porprietà desiderata... in questo momento non ho sotto Vaadin magari se ti è utile cerco di farti un esempio più concreto... comunque una tecnica del genere tempo fa la usai con SWING... non so quanto possa essere definita elegante ma sicuramente riduce di molto il codice.

ndakota
07-09-2013, 13:05
Vai tranquillo. Comunque sì, hai ragione. Oppure stavo pensando che facendo ereditare le classi da quelle più "interne" dovrei risolvere anche così. E ha anche un senso logico.