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