10. Consuetudini di programmazione
10.1. Fornire laccesso a variabili istanza e di classe
Non rendere pubblica una variabile istanza o di classe senza
una buona ragione. Spesso, le variabili istanza non necessitano
di essere esplicitamente scritte o lette spesso ciò avviene
come side effect delle chiamate di metodi.
Un esempio di variabili istanza public appropriate è il caso in
cui la classe è essenzialmente una struttura dati, senza un comportamento.
In altre parole, se si volesse utilizzare una struct invece di una
classe (se Java supportasse struct), allora sarebbe appropriato
rendere public le variabili istanza della classe.
10.2. Riferire variabili e metodi di classe
Evitare di usare un oggetto per accedere a variabili o metodi
di classe (static). Usare invece un nome di classe. Ad esempio:
metodoDiClasse(); //OK
UnaClasse.metodoDiClasse(); //OK
unOggetto.metodoDiClasse(); //EVITARE!
10.3. Costanti
Le costanti numeriche (letterali) non dovrebbero essere codificate
direttamente, eccetto per -1, 0, e 1, che possono apparire in un
ciclo for come valori di contatori.
10.4. Assegnamenti di variabile
Evitare di assegnare a più variabili lo stesso valore in una
sola istruzione. E difficile da leggere. Ad esempio:
fooBar.fChar = barFoo.lchar = 'c'; // EVITARE!
Non usare loperatore di assegnamento in un punto in cui può
essere facilmente confuso con loperatore di uguaglianza. Ad
esempio:
if (c++ = d++) { // EVITARE! (Java non lo permette)
...
}
dovrebbe essere scritto come
if ((c++ = d++) != 0) {
...
}
Non usare assegnamenti innestati nel tentativo di migliorare le
prestazioni a tempo di esecuzione. Questo è compito del compilatore.
Ad esempio:
d = (a = b + c) + r; // EVITARE!
dovrebbe essere scritto come
a = b + c;
d = a + r;
10.5. Consuetudini varie
10.5.1. Parentesi
E generalmente una buona idea usare le parentesi liberamente
in espressioni che coinvolgono operatori misti per evitare problemi
di precedenza degli operatori. Anche se le precedenze sembrano chiare
a sé stessi, può non essere così per altri non si dovrebbe
assumere che altri programmatori conoscano le precedenze altrettanto
bene.
if (a == b && c == d) // EVITARE!
if ((a == b) && (c == d)) // USARE
10.5.2. Valori ritornati
Provare a rendere la struttura del programma aderente alle proprie
intenzioni. Ad esempio:
if (espressioneBooleana) {
return true;
} else {
return false;
}
dovrebbe essere invece scritta così:
return espressioneBooleana;
Similmente,
if (condizione) {
return x;
}
return y;
dovrebbe essere scritta come
return (condizione ? x :
y);
10.5.3. Espressioni prima di ? nelloperatore
condizionale
Se unespressione contenente un operatore binario compare
prima di ? nelloperatore ternario ?:, essa dovrebbe essere
racchiusa tra parentesi. Ad esempio:
(x >= 0) ? x : -x;
10.5.4. Commenti speciali
Usare XXX in un commento per segnalare qualcosa che contiene
un bug ma che funziona. Usare FIXME per segnalare qualcosa che contiene
bug e non funziona.
11. Esempi di codice
11.1. Esempio di file sorgente Java
Lesempio seguente mostra come formattare un file sorgente
Java che contiene una singola classe pubblica. Le interfacce sono
formattate in maniera simile. Per maggiori informazioni, vedere
Dichiarazioni di classe e interfaccia (sez. 6.4) e Commenti
di documentazione (sez. 5.2.)
/*
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All Rights Reserved.
*
* This software is the confidential and proprietary information
of Sun
* Microsystems, Inc. ("Confidential Information"). You
shall not
* disclose such Confidential Information and shall use it only
in
* accordance with the terms of the license agreement you entered
into
* with Sun.
*/
package
java.blah;
import java.blah.blahdy.BlahBlah;
/**
* La descrizione della classe va messa qui.
*
* @version 1.82 18 Mar 1999
* @author Nome Cognome
*/
public class Blah extends QualcheClasse {
/* Un commento di implementazione della classe può essere messo
qui. */
/** Commento di documentazione di varDiClasse1*/
public static int varDiClasse1;
/**
* Commento di documentazione di varDiClasse2 che risulta essere
* più lungo di una sola linea
*/
private static Object varDiClasse2;
/** Commento di documentazione di varIstanza1 */
public Object varIstanza1;
/** Commento di documentazione di varIstanza2 */
protected int varIstanza2;
/**
Commento di documentazione di varIstanza3 */
private Object[] varIstanza3;
/**
* ... commento di documentazione del costruttore Blah ...
*/
public Blah() {
// ...implementazione...
}
/**
* ... commento di documentazione del metodo faQualcosa ...
*/
public void faQualcosa() {
// ...implementazione...
}
/**
* ... commento di documentazione del metodo faQualcosAltro
...
* @param unParametro descrizione
*/
public void faQualcosAltro(Object unParametro) {
// ...implementazione...
}
}
Torna all'indice Generale del corso di Specifiche Sun di Software Planet