Specifiche Sun

Consuetudini di programmazione ed Esempi di codice

 

10. Consuetudini di programmazione

10.1. Fornire l’accesso 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 l’operatore di assegnamento in un punto in cui può essere facilmente confuso con l’operatore 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 ‘?’ nell’operatore condizionale
Se un’espressione contenente un operatore binario compare prima di ? nell’operatore 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
L’esempio 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