Stamattina ho un pò di tempo libero e mi sono messo
finalmente a leggere con molto interesse il corso MCAD del grande Igor
Damiani 
Arrivato alla lezione 8 in cui si parla di validazione ed OOP (in realtà
è la lezione 9, ma una si è persa per strada...), posto la mia
implementazione del codice che Igor ha suggerito finora, rigorosamente 2.0
(notate il partial) ma i concetti sono quelli.
Guardate i commenti nel codice...
Classe WindwsForm:
public partial class MainForm : Form
{
// Istanza di age, contiene la validazione
private Age age = null;
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Mostra il calcolo dell'età
// Non può mai essere null (?)
perchè viene costruita nell'evento validate
MessageBox.Show(age.CalculateAge().ToString());
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
// La validazione è tutta dentro Age...
try
{
age = new Age(new DateTime(Convert.ToInt32(yearTextBox.Text), 1, 1));
errorProvider.SetError(yearTextBox, String.Empty);
}
catch (Exception ex)
{
errorProvider.SetError(yearTextBox, ex.Message);
e.Cancel = true;
}
}
}
La "famosa" classe Age che separa la logica dalla vestizione...
public class Age
{
// Mi piace di + questa sintassi rispetto a _birthDate... che ne pensate?
private DateTime birthDate;
public DateTime BirthDate
{
get
{
return birthDate;
}
set
{
birthDate = value;
}
}
public Age(DateTime birthDate)
{
// Valido solo la correttezza dell'età inserita,
// "throwando" (!!!) una apposita eccezione...
// anche se validare nel costruttore non mi sembra il massimo:
// Preferirei nella property get di BirthDate, ma concettualmente
// aAge non è una classe valida se inserisco una dat anon corretta...
if (birthDate.Year < 1880 || birthDate.Year > DateTime.Now.Year)
throw new TooOldException();
// In realtà potrebbe ancora non essere nato,
// ma il concetto è quello...
this.birthDate = birthDate;
}
// getAge è la sintassi del java...
public int CalculateAge()
{
// Quelli del VB6 sono abituati a fare sempre tre righe quando se ne possono fare una:
// int age (Dim age ..)
// age = System.DateTime.Now.Year - BirthDate.Year; (Set age...)
// return age
// Oh, senza offesa eh :)))
return System.DateTime.Now.Year - BirthDate.Year;
}
}
L'eccezione:
public class TooOldException : ApplicationException
{
// Semplice eccesione senza bisogno di spiegazioni...
public TooOldException() : base("Sei un pò troppo vecchio...") { }
}
Ogni commento è gradito... basta che non mi infamate se ho scritto
castronerie 
powered by IMHO 1.2