Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
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: 12103
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: 12103
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: 12103
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: 12103
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: 12103
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: 12103
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: 1726
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: 12103
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: 12103
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: 1726
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: 12103
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


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Il rover NASA Perseverance ha ''raccolto...
NASA e ISRO hanno lanciato il satellite ...
Switch 2 ha venduto 5,82 milioni di cons...
Assassin's Creed Black Flag Remake: le m...
Cosa ci fa una Xiaomi SU7 Ultra alle por...
Promo AliExpress Choice Day: prezzi stra...
Nostalgico, ma moderno: il nuovo THEC64 ...
AVM avvia la distribuzione di FRITZ! OS ...
Super offerte Bose: le QuietComfort a me...
Epic vince (ancora) contro Google: Andro...
Sconti nuovi di zecca su Amazon: 27 arti...
Un'esplorazione del 'lato oscuro' di Fac...
Apple ha venduto 3 miliardi di iPhone da...
Grandi sconti oggi sugli spazzolini elet...
Reddit sfida Google: vuole diventare il ...
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: 21:32.


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