Newsgroup: it.comp.java
Titolo: [forse un po' OT] Una questione di "stile"

Ieri stavo discutendo di "stili di programmazione" e mi e' venuto
un dubbio, supponiamo di avere:
for(;;) {
	...
	...
	if(somevar)
		break;
}
e
while(true) {
	...
	...
	if(somevar)
		break;
}
Entrambi i cicli sono cicli infiniti, quale dei due e'
"migliore", sia come stile che come "performance"
(occupazione di memoria)? 
Davide

 (occupazione di memoria)?
Per entrambe le domande, senza dubbio il secondo.
Ciao.
Ale

 (occupazione di memoria)?
public class Test1 {
  public static void main(String args[]) {
    for (;;) {
      if("tizio".equalsIgnoreCase("caio"))
        break;
    }
  }
}
public class Test2 {
  public static void main(String args[]) {
    while (true) {
      if("tizio".equalsIgnoreCase("caio"))
        break;
    }
  }
}
C:\TEMP>Java -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-C)
Java HotSpot(TM) Client VM (build 1.3.0-C, mixed mode)
javac *.java
javap -c Test1
Compiled from Test1.java
public class Test1 extends java.lang.Object {
    public Test1();
    public static void main(java.lang.String[]);
}
Method Test1()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return
Method void main(java.lang.String[])
   0 goto 3
   3 ldc #2 <String "tizio">
   5 ldc #3 <String "caio">
   7 invokevirtual #4 <Method boolean
equalsIgnoreCase(java.lang.String)>
  10 ifeq 3
  13 goto 16
  16 return
javap -c Test2 >Test2.javap
Compiled from Test2.java
public class Test2 extends java.lang.Object {
    public Test2();
    public static void main(java.lang.String[]);
}
Method Test2()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return
Method void main(java.lang.String[])
   0 goto 3
   3 ldc #2 <String "tizio">
   5 ldc #3 <String "caio">
   7 invokevirtual #4 <Method boolean
equalsIgnoreCase(java.lang.String)>
  10 ifeq 3
  13 goto 16
  16 return
Sono la stessa identica cosa.
Ciao,
	Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 Sono la stessa identica cosa.
Si', che il compilatore li ottimizzasse ne ero (quasi)
sicuro, ma tu quale preferisci come costrutto?
Davide

 tu quale preferisci come costrutto?
while(true) è probabilmente più leggibile di for(;;).
Personalmente uso while(true)


Se parliamo di stile entrambe sono degli aborti mostruosi.
Ciascun blocco deve essere single entry-single exit. E
le condizioni di uscita devono essere specificate al loro
posto non in mezzo al blocco.
Questo secondo la programmazione strutturata.
Quello che hai scritto e' l'equivalente di un goto.
cioe':
loop {
   ...
  if (codizione) goto fine;
   ...
}
fine:
....
Non parliamo proprio di stile per piacere

 writes:
Dijkstra Zealot> Se parliamo di stile entrambe sono degli aborti mostruosi.
Dijkstra Zealot> Ciascun blocco deve essere single entry-single exit. E
Dijkstra Zealot> le condizioni di uscita devono essere specificate al loro
Dijkstra Zealot> posto non in mezzo al blocco.
Quanti programmi della vita reale hai visto ?
Ci sono  situazioni nella vita  reale dove quella struttura  ha senso,
principalmente quando  ci si trova di  fronte ad un  loop infinito dal
quale si deve uscire solo in situazioni critiche.
Dijkstra Zealot> Questo secondo la programmazione strutturata.
Hai  mai  sentito  parlare  di  "Mondo  della  lavagna  ?".   Bon,  la
programmazione strutturata  appartiene a quel mondo  della lavagna. La
si  segue  fintanto   che  essa  stessa  non  rende   il  codice  poco
maneggevole, nella  vita reale  si ha a  che fare con  gli "accidenti"
della realtà.
Dijkstra Zealot> Quello che hai scritto e' l'equivalente di un goto.
Tutte le diramazioni si traducono in un jump condizionato o no.
O tu ti rifiuti di usare lo switch() del C e di Java perché in pratica
è un goto tabellare se non calcolato ?
Dijkstra Zealot> Non parliamo proprio di stile per piacere
Infatti, si parla di risparmiare cicli macchina. Ci sei mai riuscito ?
Gian Uberto Lauri		"Bloody instructions which, being taught, 
sa...@eng.it
			 return to plague their inventor" 
C.so Stati Uniti 23		 ("Macbeth", Atto 1, Scena 7; Hacker Jargon
Tel: 
+39 049 828 3556
		  File 4.0.0, voce: Programming, 1)

Il loop infinito e` qualcosa di per se` che e` considerato molto
rischioso, di solito e` meglio impostare la condizione di "break"
dentro ad un while loop. Comunque credo che stilisticamente sia
migliore la soluzione 2.
Paola


>>>>> "PC" == Paola Cerioli <pcer...@NOSPAMusa.net> writes:
PC> Il loop infinito e` qualcosa di per se` che e` considerato molto
PC> rischioso,
Beh, tutti i servizi di rete sono curati da un programma che è in
un loop infinito...
PC> di solito e` meglio impostare la condizione di "break"
PC> dentro ad un while loop. Comunque credo che stilisticamente sia
PC> migliore la soluzione 2.
Oramai le  macchine sono  molto potenti e  gli ottimizzatori  sono dei
dannati diavoli,  ma c'è una bella  differenza tra test e  jump e jump
semplice,  usualmente  devi  forzare  un  bit del  registro  di  stato
testarlo  e saltare.   Ecco perché  quando i  compilatori  non avevano
ottimizzatori si utilizzava la for(;;), perché il compilatore inseriva
un  jump puro  e  semplice. javac  non  fa alcuna  differenza, è  solo
questione di gusti.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )