Introduzione
In questo post vedremo
volutamente codice che considero sporco , ovvero che sconsiglierei
di usare in un'applicazione reale. Non che non funzioni, ma non
rappresenta sicuramente lo stato dell'arte e, come vedremo nel prossimo post, può essere
sicuramente migliorato sotto molti aspetti. Lo scopo di questo post, riprendendo
un po' il discorso cominciato l'altra volta, è quello innanzitutto di vedere un po' di
codice C# che implementa la classe Shelf (scaffale,
mensola) che utilizzeremo d'ora in poi in congiunzione con altre classi per
approfondire tutte le tematiche dell'esame 70-536.
Senza perdere altro tempo,
vediamo un po' di cosa si tratta!
La classe Shelf
Questa classe rappresenta banalmente un
oggetto che ci permette di conservare un elenco di Book (libri). Niente
di più, niente di meno. Un oggetto della classe Shelf
ha una sola proprietà (definita con get/set) Name di
tipo string che ci permette di identificare lo scaffale/mensola. Un field
privato _Contens è accessibile attraverso un set di metodi implementati
appositamente per poter aggiungere o prelevare un Book, per
ottenere un duplicato dello Shelf, più altre proprietà che ci permettono di
ottenere quanti Book ci sono nello Shelf. Ripeto: i nomi di proprietà e metodi
sono volutamente inventati di sana pianta per poter poi toccare con mano i
benefici nell'usare le interfacce standard di .NET.
class Shelf
{
private Book[] _Contents;
private string _Name;
// Proprietà
public string Name
{
get { return _Name; }
set { _Name = value; }
}
// Costruttori
public Shelf()
{
_Contents = new Book[0];
}
public Shelf(string Name, int HowManyElements)
{
_Name = Name;
_Contents = new Book[HowManyElements];
}
public Shelf(string Name, Book[] BooksList)
{
_Name = Name;
_Contents = BooksList;
}
}
La classe Shelf dispone di 3 costruttori, che ci
permettono di istanziare un'istanza così:
// Costruttore "vuoto"
public Shelf();
// Costruttore con Name e numero di Book
public Shelf(string Name, int HowManyElements);
// Costruttore con Name ed array di Book
public Shelf(string Name, Book[] BooksList);
Fin qua, nulla di particolare. A questo
punto la classe prevede i seguenti metodi:
public void Reset();
public void ResetContenuto();
public bool Put(int Position, Book WhichBook);
public bool Put(Book WhichBook);
public Book Get(int Position);
public Shelf Duplica();
public ArrayList GetContenuto();
public int QuantiBook;
Al di là dell'implementazione, che in questa fase
possiamo trascurare, quello che voglio far notare è che la classe è
assolutamente insensata. Se il codice è corretto, ovvio che funziona, però i
nomi dei metodi e delle proprietà sono fuori
standard, non implementa alcuna
interfaccia e perciò perde di leggibilità, oltre che avere poche capacità di
riutilizzo quando cercheremo, magari, di utilizzarla sfruttando le classi
standard di .NET. Inoltre, provate a capire il significato di ciascun metodo,
senza aver scritto alcun commento: il fatto di usare una nomenclatura fuori
standard rende anche più ostico il suo utilizzo da parte di sviluppatori di
terze parti che vogliono/devono utilizzare la vostra classe.
Ma non solo: la pecca più grande a mio avviso è che così facendo perdiamo la
possibilità di usare la classe Shelf come parametro nella chiamata di metodi a
classi .NET. Supponiamo ad esempio di voler ordinare i Book su un certo
Shelf. Potremmo farlo in due modi: o scrivendo noi un metodo
Sort, oppure sfruttando i meccanismo di sorting già offerti dal
FX (che da oggi in poi userò come abbreviazione di .NET Framework). Il secondo
metodo è sicuramente più efficace: per farlo dobbiamo fare in modo che in un
modo o nell'altro la nostra classe supporti le interfacce IComparable e IComparer. Ed ancora: invece di usare un metodi inventato di sana
pianta chiamata QuantiBook, implementiamo l'interfaccia ICollection e di conseguenza saremo costretti ad usare la ben nota
proprietà Count. Gli vantaggi sono davvero moltissimi, in
termini di pulizia di codice, performance, aderenza agli standard, riutilizzo
del codice, etc. etc. Nel prossimo post vedremo qualche esempio pratico sulla
classe Shelf
.