Tipi primitivi e design di classi
Nella costruzione delle classi che compongono le nostre applicazioni, in maniera molto naturale e immediata utilizziamo molto spesso i tipi primitivi come interi e stringhe. La verità è che questo molto spesso è impreciso e può portare ad errori riscontrabili solo a runtime.
Vediamo un semplice esempio:
class Program { static void Main(string[] args) { var cliente = new Cliente() { Id = 1 }; var ordine = new Ordine() { Id = 2 }; //errore accidentale! var idOrdine = cliente.Id; // faccio cose importantissime con l'id del mio ordine } } public class Cliente { public int Id { get; set; } } public class Ordine { public int Id { get; set; } }
Il codice sopra mostra un esempio semplicissimo in cui modellando gli id di due classi diverse con un intero incorriamo nel rischio di utilizzarne uno per l'altro. Vediamo come migliorare le nostre classi
public class ClienteId { public int Value { get; set; } } public class OrdineId { public int Value { get; set; } } public class Cliente { public ClienteId Id { get; set; } } public class Ordine { public OrdineId Id { get; set; } }
Avendo creato una classe ad hoc, per il momento vuota e che racchiude solamente il valore del nostro id, evitiamo completamente la possibilità di scambiare un id per un altro in quanto il compilatore non ci permetterà di utilizzarlo. In aggiunta possiamo implementare delle logiche di validazione dei dati all'interno delle classi di "supporto"