Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-03-2009, 11:45   #1
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
[JAVA]pochi if-else,velocità, e leggibilità...e anche patterns

Apro questo thread con l'intentzione di racchiudere un pò di "trucchetti" per migliorare la qualità del nostro codice.

Per iniziare, un problema che mi si presenta spesso è quello di dover eseguire un metodo a seconda del valore che assume una determinata variabile.
Ad esempio:
Codice:
public void execute(int type){
	switch(type){
		case A: actionA();return;
		case B: actionB();return;
		...
	}
}
Il problema è che uso una bella catena di case, e in questo modo valuto la catena ogni volta che mi serve utilizzare il metodo,penso sia lento.

Di solito risolvo creando una classe per ogni azione che devo compiere:
Codice:
class A extends C{
	
	...

	public void execute(){
		System.out.println("action A");
	}
}

class B extends C{
	
	...

	public void execute(){
		System.out.println("action B");
	}
}

abstract class C{
	
	...

	public void execute();
}

class Executor{

	private C c;

	public Executor(int type){
		c=valute(type);
	}

	private C valute(int type){
		switch(type){
			case A: return new A();
			case B return new B();
		}
	}

	public void execute(){
		c.execute();
	}

}


...
...
Executor e=new Executor(A);
e.execute();
...
...
In questo modo ho rimosso il controllo durante l'esecuzione spostandolo a "monte" e secondo me è anche più leggibile, però la catena di case rimane, e ho dovuto creare tante classi quante sono le azioni strade che posso intraprendere.
C'è modo per eliminare anche lo switch?
Secondo voi è una buona soluzione?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 12:30   #2
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Spostare "new A()", "new B()" alla chiamata del costruttore di Executor?

Executor e = new Executor(new A());
e.execute();
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 12:54   #3
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
io farei cosi'....
Codice:
class A implements C {
	
	...

	public void execute() {
		System.out.println("action A");
	}
}

class B implements C {
	
	...

	public void execute() {
		System.out.println("action B");
	}
}

public interface C {
	public void execute();
}

class Executor{

	private C myAction;

	public Executor(C myAction){
		this.myAction = myAction;
	}

	public void execute(){
		myAction.execute();
	}

}


...
...
A a = new A();
Executor executor = new Executor(a);
executor.execute();
anche se l'executor potrebbe pure non essere necessario....
__________________

Ultima modifica di ^TiGeRShArK^ : 04-03-2009 alle 13:17.
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 13:14   #4
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
io farei cosi'....
Codice:
class A implements C {
	
	...

	public void execute() {
		System.out.println("action A");
	}
}

class B implements C {
	
	...

	public void execute() {
		System.out.println("action B");
	}
}

public interface C {
	public void execute();
}

class Executor{

	private C myAction;

	public Executor(C myAction){
		this.myAction = myAction;
	}

	public void execute(){
		myAction.execute();
	}

}


...
...
A a = new A();
Executor executor = new Executor(a);
e.execute();
anche se l'executor potrebbe pure non essere necessario....
Non dovrebbe essere executor.execute()?
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 13:17   #5
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Non dovrebbe essere executor.execute()?
yes..
m'ero perso un pezzo...
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 13:21   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
mmmm...
rileggendo forse ho capito cosa intendeva fare...
se ho capito bene basterebbe aggiungere al mio codice un array di action (o una mappa a seconda dei valori che deve assumere la variabile) e richiamare semplicemente map[variable].execute();
ho capito bene stavolta o ancora mi sfugge qualcosa?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 13:25   #7
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
tradotto in codice:
Codice:
class A implements Action {
	
	...

	public void execute() {
		System.out.println("action A");
	}
}

class B implements Action {
	
	...

	public void execute() {
		System.out.println("action B");
	}
}

public interface Action {
	public void execute();
}

class Executor{

	private Action[] myActions;

	public Executor(Action[] myActions){
		this.myActions = myActions;
	}

	public void execute(int val){
		myActions[val].execute();
	}

}

int val = ???;
...
...
Action[] myActions = new Actions[2];
myActions[0] = new A();
myActions[1] = new B();
Executor executor = new Executor(myActions);
executor.execute(val);
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 17:09   #8
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
tradotto in codice:
Codice:
class A implements Action {
	
	...

	public void execute() {
		System.out.println("action A");
	}
}

class B implements Action {
	
	...

	public void execute() {
		System.out.println("action B");
	}
}

public interface Action {
	public void execute();
}

class Executor{

	private Action[] myActions;

	public Executor(Action[] myActions){
		this.myActions = myActions;
	}

	public void execute(int val){
		myActions[val].execute();
	}

}

int val = ???;
...
...
Action[] myActions = new Actions[2];
myActions[0] = new A();
myActions[1] = new B();
Executor executor = new Executor(myActions);
executor.execute(val);
Esatto questo è quello che volevo vedere.
La domanda sorge spontanea ora, è meglio il "mio" metodo che fa usa di switch(o if) o quello proposta da te che istanzia oggetti senza avere la sicurezza che poi vengano effettivamente usati?
Ho paura che a parte il fatto che non vengano usati if-else non porti altri vantaggi, perchè sicuramente non è più veloce visto che deve istanziare tanti oggetti quante sono le varie azioni che devo fare, ne di spazio per lo stesso motivo.
Sono ovviamente mie supposizioni campate in aria, cosa ne pensi?

Ultima modifica di MEMon : 04-03-2009 alle 17:37.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 17:36   #9
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Se banalmente devo eseguire del codice solo se vera una determinata condizione, esempio:
Codice:
...
if(cond){
	esegui();
}
...
E' possibile anche in questo caso eliminare il controllo condizionale?


Inoltre sempre nel medisimo caso, è meglio come scritto sopra, o così:
Codice:
...
if(!cond) return;
esegui();
...
Ci sono differenza a livello prestazionale? Il compilatore interpreta allo stesso modo?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 19:20   #10
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Esatto questo è quello che volevo vedere.
La domanda sorge spontanea ora, è meglio il "mio" metodo che fa usa di switch(o if) o quello proposta da te che istanzia oggetti senza avere la sicurezza che poi vengano effettivamente usati?
Ho paura che a parte il fatto che non vengano usati if-else non porti altri vantaggi, perchè sicuramente non è più veloce visto che deve istanziare tanti oggetti quante sono le varie azioni che devo fare, ne di spazio per lo stesso motivo.
Sono ovviamente mie supposizioni campate in aria, cosa ne pensi?
a livello di velocità di esecuzione pura dovrebbe essere + veloce il metodo con l'array di action dato che non viene creato nessun branch, a livello di spreco di memoria credo che siamo lì con la catena di if se abbiamo una media di esecuzione piuttosto simile per le varie action, dato che resteranno comunque nel garbage collector.
Inoltre con l'array crei solo un'istanza di ogni action, invece con l'if crei una nuova istanza della action corrente per ogni esecuzione e questo peggiora sia la velocità di esecuzione che l'occupazione di memoria prima del passaggio del GC.
comunque tutto questo in teoria...
per vedere l'effettiva differenza prestazionale l'unica cosa è provare con un profiler il codice in modo da vedere velocità di esecuzione e occupazione di memoria.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 19:28   #11
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Se banalmente devo eseguire del codice solo se vera una determinata condizione, esempio:
Codice:
...
if(cond){
	esegui();
}
...
E' possibile anche in questo caso eliminare il controllo condizionale?


Inoltre sempre nel medisimo caso, è meglio come scritto sopra, o così:
Codice:
...
if(!cond) return;
esegui();
...
Ci sono differenza a livello prestazionale? Il compilatore interpreta allo stesso modo?
si può usare la stessa tecnica se la condizione è un'intero o un qualsiasi oggetto.
Nel caso di un oggetto qualsiasi si ha qualcosa del genere:
Codice:
String cond = ???;

....

Map<String, Action> map = new HashMap<String, Action>();
map.add("pippo", new Pippo());
map.add("pluto", new Pluto());
map.add("topolino", new Topolino());
map.get(cond).execute();
invece per quanto riguarda scrivere:
Codice:
if (!cond)
    return;
execute();

if(cond)
    execute();
dovrebbe essere uguale *in teoria*
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:35   #12
dupa
Senior Member
 
L'Avatar di dupa
 
Iscritto dal: Jan 2002
Città: Napoli
Messaggi: 1727
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Apro questo thread con l'intentzione di racchiudere un pò di "trucchetti" per migliorare la qualità del nostro codice.

Per iniziare, un problema che mi si presenta spesso è quello di dover eseguire un metodo a seconda del valore che assume una determinata variabile.

CUT

In questo modo ho rimosso il controllo durante l'esecuzione spostandolo a "monte" e secondo me è anche più leggibile, però la catena di case rimane, e ho dovuto creare tante classi quante sono le azioni strade che posso intraprendere.
C'è modo per eliminare anche lo switch?
Secondo voi è una buona soluzione?
sinceramente mi sembra una soluzione da "ufficio complicazione affari semplici".

comunque partendo dal problema di partenza:

Codice:
public void execute(int type){
Io non ho mai avuto in vita mia una funzione alla quale passo un type per farle eseguire cose diverse....

non vedo perchè il codice che chiama execute, non dovrebbe chiamare direttamente il metodo che vuole eseguire, piuttosto che passare da questo "wrapper".
__________________
Se buttassimo in un cestino tutto ciò che in Italia non funziona cosa rimarrebbe? Il cestino.
dupa è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:41   #13
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Quote:
Originariamente inviato da dupa Guarda i messaggi
sinceramente mi sembra una soluzione da "ufficio complicazione affari semplici".

comunque partendo dal problema di partenza:

Codice:
public void execute(int type){
Io non ho mai avuto in vita mia una funzione alla quale passo un type per farle eseguire cose diverse....

non vedo perchè il codice che chiama execute, non dovrebbe chiamare direttamente il metodo che vuole eseguire, piuttosto che passare da questo "wrapper".
Bhe probabilmente perche te hai sempre fatto così:
Codice:
...
A a=new A();
B b=new B();
if(type==INT_A){
	a.eseguie();
}
else if(type==INT_B){
	b.esegui();
}
...
Che ha tutti i problemi, poca leggibilità, decisione a runtime ecc ecc.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:42   #14
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
si può usare la stessa tecnica se la condizione è un'intero o un qualsiasi oggetto.
Nel caso di un oggetto qualsiasi si ha qualcosa del genere:
Codice:
String cond = ???;

....

Map<String, Action> map = new HashMap<String, Action>();
map.add("pippo", new Pippo());
map.add("pluto", new Pluto());
map.add("topolino", new Topolino());
map.get(cond).execute();
invece per quanto riguarda scrivere:
Codice:
if (!cond)
    return;
execute();

if(cond)
    execute();
dovrebbe essere uguale *in teoria*
Però, mica male così, ma viene usato davvero per eliminare gli if?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:45   #15
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Però, mica male così, ma viene usato davvero per eliminare gli if?
si, array e mappe sono usati comunemente, insieme al polimorfismo e a qualche altro strumento, per eliminare gli if.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:46   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da dupa Guarda i messaggi
sinceramente mi sembra una soluzione da "ufficio complicazione affari semplici".

comunque partendo dal problema di partenza:

Codice:
public void execute(int type){
Io non ho mai avuto in vita mia una funzione alla quale passo un type per farle eseguire cose diverse....

non vedo perchè il codice che chiama execute, non dovrebbe chiamare direttamente il metodo che vuole eseguire, piuttosto che passare da questo "wrapper".
infatti nel mio primo post ho specificato che l'executor generalmente non è necessario, ma non so nel suo caso se ha qualche motivo particolare per esistere...
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:49   #17
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ma nel tuo prima post non avevi capito quello che chiedevo, è ovvio che se so a priori di usare un metodo di A allora non serve l'esecutore, ma la situazione non è quella

La situazione è che in base a una condizione o al valore di una variabile devo fare cose diverse.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:49   #18
dupa
Senior Member
 
L'Avatar di dupa
 
Iscritto dal: Jan 2002
Città: Napoli
Messaggi: 1727
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Bhe probabilmente perche te hai sempre fatto così:
Codice:
...
A a=new A();
B b=new B();
if(type==INT_A){
	a.eseguie();
}
else if(type==INT_B){
	b.esegui();
}
...
Che ha tutti i problemi, poca leggibilità, decisione a runtime ecc ecc.
per sta cosa che hai scritto al max si usa il polimorfismo.
ma cmq anche il polimorfismo deve una logica di base.....

se hai super-classe Shape, estesa da Square, Circle

chiamerai

Codice:
square.computeArea()
circle.computeArea()
ecc.
__________________
Se buttassimo in un cestino tutto ciò che in Italia non funziona cosa rimarrebbe? Il cestino.
dupa è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:50   #19
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Quote:
Originariamente inviato da dupa Guarda i messaggi
per sta cosa che hai scritto al max si usa il polimorfismo.
E fammi vedere come lo usi il polimorfismo per sta cosa che ho scritto.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 04-03-2009, 20:51   #20
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da MEMon Guarda i messaggi
Ma nel tuo prima post non avevi capito quello che chiedevo, è ovvio che se so a priori di usare un metodo di A allora non serve l'esecutore, ma la situazione non è quella

La situazione è che in base a una condizione o al valore di una variabile devo fare cose diverse.
ma in concreto perchè ha un valore diverso questa variabile?
da cosa dipende?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
TP-Link protagonista a IFA 2025 con tant...
TK02 S è la nuova e-enduro di THOK con m...
Fallout 76: Rinnovamento C.A.M.P., pi&ug...
Toyota produrrà auto elettriche in Europ...
HONOR Magic V5 parte bene: lancio da rec...
Dyson svela 11 nuovi prodotti all'IFA: d...
Zurigo si scalda con i rifiuti: le pompe...
Noctua pubblica la nuova roadmap: primo ...
Palo Alto Networks presenta novità...
Surya, il modello di IA di IBM e NASA ch...
I browser Arc e Dia diventano parte dell...
Duster e Bigster, tutto quello che manca...
Superman: Man of Tomorrow, confermato da...
SK Hynix, accordo storico: 10% degli uti...
Arriva Veeam Software Appliance: protezi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v