L'Ortogonalità è un concetto critico se si vogliono produrre sistemi software che siano semplici da progettare, sviluppare, testare ed estendere.
In geometria due rette sono ortogonali se la loro intersezione forma un angolo di 90° gradi, in termini vettoriali si dice che sono indipendenti.
Nel campo informatico l'ortogonalità indica disaccoppiamento. In un software ben progettato il codice che accede al database è ortogonale alla user interface, cioè possono modificare la user interface senza dover toccare il database e viceversa. Maggiori dettagli li potete trovare nel libro The Pragmatic Programmer nel capitolo Orthogonality.
Questo concetto si può applicare a diversi livelli, tra assembly, namespace, classi, metodi, ecc.
Per tenere sotto controllo le dipendenze tra assembly utilizzo il tool NDepend il quale crea un grafico che le visualizza e fornisce alcune metriche che aiutano ad individuare le parti del nostro sistema più accoppiate. A questo link un esempio del report sul .NET framework 2.0.
A questo punto rilassatevi fate un respiro profondo e svuotate la vostra mente, sto per parlare di Java, attenzione ai cardiopatici è sconsigliato continuare la lettura della parte seguente.
In Java la direttiva import ha una funzione simile alla using del C#, ma a differenza di quest'ultima permette di specificare anche una singola classe.
Vediamo un esempio pratico:
import java.io.FileWriter;
java.io è il namespace, a differenza di .NET la coding convention suggerisce di scriverli camel case per distinguerli dal nome della classe (lo so che non vi piace, ma ve l'ho detto di non leggere), mentre FileWriter è il nome della classe che può essere utilizzata dal codice, quindi se io provassi ad usare la classe BufferedWriter del namespace java.io otterrei un errore in fase di compilazione.
Se non voglio indicare il nome la classe posso scrivere:
import java.io.*;
Se come convenzione si utilizzasse sempre il primo metodo, ecco che ho un controllo molto efficace delle dipendenze, leggendo solo la parte iniziale del file sorgente senza dover guardare i dettagli interni della classe.
Mi piacerebbe che nella prossima versione del C# venisse aggiunta la possibilità di poter scrivere qualcosa del tipo:
using System.Collections.ArrayList;
Per poter specificare al compilatore che del namespace System.Collections utilizzerò solo la classe ArrayList.
Secondo me aiuterebbe a prestare più attenzione alle dipendenze soprattutto quelle non strettamente necessarie, charamente è un'operazione piuttosto noiosa da fare manualmente, ma con tool come Resharper sarebbe molto meno oneroso.