Press "Enter" to skip to content

3 – Classi di uso comune

Il terzo capitolo della serie dedicata alle classi helper che riutilizzeremo più volte nei nostri progetti futuri, in questa terza parte parleremo di interfacce, implementando due interfacce utili per la generazione di classi di tipo Entity ed EntityCollection

Se la classe può essere definita come il progetto per la costruzione di un oggetto, le interfacce sono i progetti per gli accessori e l’arredamento. Sono il mezzo utilizzato da .NET per implementare l’ereditarietà multipla. Questo articolo non è certo in grado di spiegare come funziona la programmazione ad oggetti, ma cercherò di definire il concetto di ereditarietà multipla, visto che è abbastanza strano, infatti quando mi è stato introdotto, il primo pensiero che mi è passato per la mente era che era strano ed assurdo, come dire che un gatto discende dai mammiferi e dai pesci contemporaneamente… in verità il concetto è un po’ diverso, e serve a introdurre gli elementi comuni fra i diversi tipi di classe, come ad esempio l’affermazione “E’ carnivoro” si applica sia ad un leone, sia ad un gatto, sia ad uno squalo che ad un’avvoltoio.

Informaticamente parlando, un’interfaccia serve a dotare classi derivate da rami completamente diversi dell’albero che parte dall’Object di funzionalità equivalenti.

L’esempio più semplice probabilmente è l’interfaccia IComparable che permette di comparare due oggetti stabilendo se sono uguali, fornendole di un metodo standard chiamato CompareTo. Quest’interfaccia, permette di comparare ad esempio due oggetti completamente diversi senza sollevare e gestire eccezioni. Un interfaccia inoltre serve a fare in modo che funzionalità equivalenti in oggetti diversi siano implementate in modo da fornire risultati coerenti. Tornando a IComparable, la comparazione tramite CompareTo, è implementata utilizzando parametri uguali e dando un valore di ritorno uguale, -1, 0, 1 a seconda che la comparazione tra i due oggetti A e B sia A < B, A = B oppure A > B.

Le due interfacce che implementeremo nella nostra libreria Helper, ci serviranno a definire oggetti di tipo Entity dando loro caratteristiche equivalenti e coerenti ed oggetti di tipo Entity Collection dando anche a queste ultime caratteristiche equivalenti e coerenti.

Innanzitutto cos’è un Entity? Un Entity è una classe, fin qui nulla di strano, ma è una classe che viene utilizzata come repository di dati strutturati, ovviamente questo tipo di definizione è convenzionale, ma vi sono vari progetti e varie teorie soprattutto relative alla programmazione Agile, che utilizzano questa terminologia, vi consiglio di dare un’occhiata a NHybernate se volete vedere un esempio molto ben strutturato e completo. Noi non stiamo cercando di fare cose troppo sofisticate, ne di utilizzare tecniche complesse, ma iniziare ad impostare da subito le nostre pur minuscole applicazioni in modo corretto.

L’Interfaccia IEntity

using System;
using System.ComponentModel;

namespace Dnw.Base.Entities
{
    public interface IEntity : IComparable, INotifyPropertyChanged
    {

        bool IsValid();

    }
}
Imports System 
Imports System.ComponentModel 

Namespace Dnw.Base.Entities 
    Public Interface IEntity 
        Inherits IComparable 
        Inherits INotifyPropertyChanged 

        Function IsValid() As Boolean 

    End Interface 
End Namespace

Come possiamo notare, l’interfaccia IEntity non è complessa, per quel che riguarda il codice che la compone, però stabilisce un contratto preciso per le classi che la implementeranno.

Ogni classe che implementa IEntity, deve soddisfare le seguenti funzionalità:

  • Implementare l’interfaccia IComparable, quindi implementare il metodo CompareTo che permette di comparare l’Entity con qualsiasi altro oggetto.
  • Implementare l’interfaccia INotifyPropertyChanged, quindi implementare un evento PropertyChanged e fare in modo che ognuna delle property della classe scateni questo evento quando viene modificata. Questa interfaccia, è automaticamente utilizzata dalla DatagridView e dagli altri controlli visuali per aggiornare i dati visualizzati quando viene effettuata una modifica ad un valore da codice.
  • Implementare un metodo IsValid booleano che verifica che i dati contenuti all’interno della classe siano validi secondo le regole di business decise dal programmatore.

L’interfaccia IEntityCollection

using System;
using System.ComponentModel;
namespace Dnw.Base.Collections
{
    public interface IEntitiesCollection : IComparable, INotifyPropertyChanged
    {
    }
}
Imports System 
Imports System.ComponentModel 
Namespace Collections 
    Public Interface IEntitiesCollection 
        Inherits IComparable 
        Inherits INotifyPropertyChanged 
    End Interface    
End Namespace

Anche questa interfaccia è molto semplice e serve a dare coerenza alle collezioni di Entity, facendo in modo che implementino le interfacce IComparable e INotifyPropertyChanged.

Si tratta semplicemente di due funzionalità di base, probabilmente in seguito aggiungeremo nuovi elementi alle Interfacce.

Se vi state chiedendo se aggiungere funzionalità ad una interfaccia farà in modo che il compilatore dia errore su tutte le classi che la implementano perché non hanno ancora implementato la nuova funzionalità, è proprio vero e questa semplice “cattiveria” ci permetterà di individuare con una semplice compilazione le classi che dobbiamo aggiornare e provvedere a farlo.

Conclusioni

La terza puntata dedicata agli Helper è conclusa, applicheremo molto presto queste interfacce alle nostre prime classi Entity, in una piccola applicazione che svilupperemo per esplorare alcune delle cose più interessanti offerte dalle User Interface di .NET. Se volete generare queste classi nella vostra versione del progetto DnwBaseCs o DnwBaseVb, create due cartelle all’interno del progetto e chiamatele Collections ed Entities e generate l’interfaccia nella cartella corrispondente al Namespace che gli abbiamo assegnato.

Per qualsiasi Feedback, Ulteriore domanda, Chiarimento, oppure se trovate qualche errore usate direttamente il form di contatto con un click sulla bustina in cima alla pagina.

Potete scaricare il progetto esempio dedicato alle classi di uso comune dal link qui sotto indicato.