Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[70-536, #09] Una premessa prima di ICollection, IList ed altre interfacce standard

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 .

powered by IMHO 1.2

Print | posted on Monday, January 30, 2006 1:21 PM | Filed Under [ Esame 70-536 ]

Feedback

Gravatar

# re: [70-536, #09] Una premessa prima di ICollection, IList ed altre interfacce standard

Ciao Igor, leggo sempre i tuoi post e li apprezzo perché sono molto chiari ed esplicativi, complimenti!
2/1/2006 9:58 AM | Federico Zanin
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET