Vediamo di mettere in codice anche questo evento della vita quotidiana che mi è capitato proprio oggi.
Come prima idea mi verrebbe da scrivere una classe Patente non statica, istanziarla:
Patente myPatente = new Patente();
poi per il rinnovo:
myPatente.Rinnova();
dove il metodo non fa altro che aggiornare una proprietà pubblica Anni o privata _anni:
public void Rinnova()
{
_anni += 10;
}
Questo è sbagliato per vari motivi:
1. La proprietà privata ha un nome troppo generico (cosa indicano questi anni?);
2. La nomenclatura più appropriata sarebbe Durata e non Anni;
3. Bisognerebbe aggiornarla ogni anno e per il momento non ci interessa. Ci interessa conoscere la validità non per quanti anni è ancora valida.
Già da queste riflessioni si capisce che dovremo agire su delle date. Salto quindi il passaggio di aggiornare una proprietà chiamata Durata. Cambio il codice:
public void Rinnova()
{
_dataDiScadenza.AddYears(10);
}
Questo codice va già meglio. Leggendo però il funzionamento di rinnovo di una patente, c'è un altro errore. Cambio il codice:
public void Rinnova(DateTime dataRinnovo)
{
_dataUltimoRinnovo = dataRinnovo;
}
E si nota subita che non occorre un metodo ma basta utilizzare il set della proprietà. Quindi semplicemente nel codice (non nella classe):
myPatente.DataUltimoRinnovo = Convert.ToDateTime(txtDataRinnovo.Text);
Soprassediamo sul Convert e sui controlli da effettuare dato che non è l'intento di questo post.
Nella classe Patente avremo invece la proprietà
public DateTime DataScadenza
{
get {return _dataUltimoRinnovo.AddYears(10);}
}
Anche qui non mi soffermo sul giorno effettivo di scadenza. In questo caso è importante aggiungere (correggetelo con il commento appropriato con tre ///):
// Indica la data di scadenza della patente calcolata come data del rinnovo incrementata di 10 anni.
public DateTime DataScadenza
{
get {return _dataUltimoRinnovo.AddYears(10);}
}
Ovviamente quel 10 non va bene cablato nel codice. E' risaputo inoltre che la durata dipende dall'età della persona; d'altro canto una patente esiste se collegata a una persona. Il rapporto è 1 a 1 (spero). Su un ipotetico database sarebbe (imho) mettere la fk sulla tabella Patenti (quindi un IDPersona). Analogamente dovrebbe accadere nella classe. Qui si può discutere se collegare solo la data di nascita della persona o l'intera Persona. Nel primo caso, probabilmente, ci occorrerebbe anche l'IDPersona, quindi opterei per il secondo caso se non è particolarmente oneroso. Da valutare se stiamo costruendo una classe per un'applicazione specifica o una classe in stile "utility".
[continua]
Tutto il codice di questo articolo è scritto di getto; mi scuso per eventuali errori.
Technorati tags:
Csharp