Ecco alcuni punti importanti per scrivere Clean Code in Java:
- Leggibilità: Assicurati che il tuo codice sia facile da leggere e comprendere. Utilizza nomi di variabili significativi, commenti e indentazione corretta per aiutare te stesso e gli altri a capire ciò che stai facendo.
- Mantenibilità: Scrivi codice che sia facile da modificare e mantenere in futuro. Cerca di evitare soluzioni complesse che possono diventare difficili da comprendere e gestire nel tempo.
- Documentazione: Documenta il tuo codice per aiutare te stesso e gli altri a capire cosa sta accadendo. Includi commenti che spiegano il funzionamento del codice e come viene utilizzato.
- Scelta delle strutture di controllo: Scegli le strutture di controllo appropriate per ogni situazione. Ad esempio, utilizza cicli “for” per eseguire un’azione ripetitiva un determinato numero di volte e cicli “while” per eseguire un’azione ripetitiva fino a quando una condizione è vera.
- Error handling: Gestisci gli errori e le eccezioni in modo appropriato. Assicurati di gestire eventuali errori che possono verificarsi durante l’esecuzione del codice e di fornire un messaggio di errore significativo per aiutare a risolvere il problema.
- Test: Scrivi test per il tuo codice per assicurarti che funzioni come previsto. Questo ti aiuterà a identificare eventuali problemi e a correggerli prima che il codice venga rilasciato.
- Riuso del codice: Cerca di riutilizzare il codice quando possibile, ad esempio creando funzioni o classi riutilizzabili. Questo renderà il tuo codice più efficiente e facile da mantenere.
Esempio
public class GoodCodeExample {
public static void main(String[] args) {
// Leggibilità: Utilizzo di nomi di variabili significativi
int numberOfStudents = 30;
// Mantenibilità: Codice facile da modificare e mantenere
for (int i = 0; i < numberOfStudents; i++) {
System.out.println("Student " + (i + 1));
}
// Documentazione: Commenti che spiegano il funzionamento del codice
/**
* Calcola il massimo tra due numeri
*
* @param num1 Primo numero
* @param num2 Secondo numero
*
* @return Il numero più grande tra i due
*/
// Scelta delle strutture di controllo: Uso di un'if per scegliere l'esecuzione di un codice
int maxNumber = max(5, 10);
System.out.println("Max number: " + maxNumber);
}
// Error handling: Gestione di eventuali errori durante l'esecuzione del codice
public static int divideNumbers(int num1, int num2) {
if (num2 == 0) {
throw new IllegalArgumentException("Cannot divide by zero");
}
return num1 / num2;
}
// Riuso del codice: Riutilizzo di codice attraverso la creazione di una funzione
public static int max(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}
}
In questo esempio, abbiamo implementato tutti i concetti di cui abbiamo parlato. Ad esempio, abbiamo utilizzato nomi di variabili significativi per rendere il codice più leggibile, abbiamo utilizzato una funzione per riutilizzare il codice e abbiamo gestito gli errori attraverso l’utilizzo di eccezioni.
Test con JUnit
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class GoodCodeExampleTest {
@Test
public void testMaxFunction() {
GoodCodeExample goodCodeExample = new GoodCodeExample();
int result = goodCodeExample.max(5, 10);
assertEquals(10, result);
}
@Test(expected = IllegalArgumentException.class)
public void testDivideNumbersFunction() {
GoodCodeExample goodCodeExample = new GoodCodeExample();
goodCodeExample.divideNumbers(5, 0);
}
}
In questo esempio, abbiamo scritto due test per verificare che la funzione max
e la funzione divideNumbers
funzionino correttamente. Il primo test verifica che la funzione max
restituisca il valore più grande tra i due numeri passati come argomenti. Il secondo test verifica che la funzione divideNumbers
lanci un’eccezione IllegalArgumentException
quando viene chiamata con un divisore pari a zero.
Scrivere test è un’importante parte della scrittura di un codice di qualità, poiché aiuta a garantire che il codice funzioni correttamente e che gli eventuali bug vengano individuati e risolti in modo tempestivo.