alessandro melchiori
() => melkio.OnStage();

Alessandro Melchiori

C#, valori di default e la leggibilità

05 Oct 2011

La possibilità di definire i valori di default dei parametri di un metodo con C#, non è cosa recente, ma giusto ieri mi sono trovato ad utilizzare questa “feature” del linguaggio e a trarne alcune considerazioni.

Scenario: descrivere uno snapshot della produttività di una macchina di un’automazione industriale dettagliandone, oltre al giorno a cui si riferisce lo snapshot stesso, tutti i relativi parametri:

  • macchina accesa

  • macchina pronta

  • macchina in lavorazione automatica

  • macchina in lavorazione manuale

  • macchina in allarme

  • macchina in assistenza

A fronte dei valori specificati da tali parametri viene di conseguenza calcolata l’efficienza “teorica” ed effettiva della macchina (logiche che non ci interessano per ora).

Utilizzare l’object initializer era fuori discussione: lo snapshot è un value-object del mio dominio e pertanto deve essere immutable. Non ho trovato altra strada che utilizzare il costruttore ed esporre i valori precedenti con delle properties in read-only. L’implementazione “tradizionale” (pre default-parameter, per intenderci) non mi piaceva per nulla.

public class Snapshot
{ 
    public Snapshot(DateTime day, Int32 on, Int32 ready, Int32 working, 
                                  Int32 manual, Int32 alarm, Int32 service) 
    { 
        ... 
    } 
}

Dover specificare tutti i parametri, anche quelli con il valore 0, è molto prolisso, poco leggibile e, alla lunga, anche poco usabile: ogni volta mi devo ricordare (è vero ci sono l’intellisense e resharper che mi danno una mano) l’ordine con cui inserire i parametri.

In questo contesto l’utilizzo dei valori di default è stato illuminante:

public class Snapshot
{
    public Snapshot(DateTime day, 
                    Int32 on=0, Int32 ready=0, Int32 working=0, 
                    Int32 manual=0, Int32 alarm=0, Int32 service=0)
    {
        ...
    }
}

in modo da poter scrivere:

Snapshot snapshot = new Snapshot(DateTime.Today, working: 4800, manual: 2400);

Questa sintassi è sicuramente più concisa e molto, ma molto più leggibile (ovviamente IMHO)

Comments