<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Design</title>
        <link>http://blogs.ugidotnet.org/angellaa/category/Design.aspx</link>
        <description>Design</description>
        <language>it-IT</language>
        <copyright>Andrea Angella</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Introduzione al Testing</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/08/10/introduzione-al-testing.aspx</link>
            <description>&lt;p&gt;Ho appena finito di ascoltare, seguire e provare gli esempi di codice della sessione &lt;strong&gt;"Introduzione al testing"&lt;/strong&gt; tenuta da &lt;a href="http://blogs.ugidotnet.org/rgm/Default.aspx" target="_blank"&gt;Gian Maria Ricci&lt;/a&gt; in occasione del &lt;a href="http://dotnetmarche.org/eventi/Default.aspx?IDevento=21" target="_blank"&gt;6° Workshop&lt;/a&gt; organizzato da &lt;a href="http://dotnetmarche.org/" target="_blank"&gt;DotNetMarche&lt;/a&gt;. Una sessione veramente completa e molto interessante. Consiglio a tutti di seguirla ma soprattutto di provare il codice allegato. Grazie mille Gian Maria. Adesso non mi resta che continuare con le successive sessioni che saranno sicuramente appetitose :-)    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Ciao a tutti e per chi deve ancora farle buone vacanze !&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/93669.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/08/10/introduzione-al-testing.aspx</guid>
            <pubDate>Sun, 10 Aug 2008 22:31:41 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/08/10/introduzione-al-testing.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/93669.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/93669.aspx</trackback:ping>
        </item>
        <item>
            <title>Design Idiomatico</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/07/30/design-idiomatico.aspx</link>
            <description>&lt;p&gt;Ho seguito il webcast "&lt;strong&gt;Disegno Architetturale: gli idiomi e le linee guida di desing per il .NET Framework&lt;/strong&gt;" di &lt;a href="http://blogs.ugidotnet.org/janky/Default.aspx" target="_blank"&gt;Giancarlo Sudano&lt;/a&gt; relativo alla prima serie del &lt;a href="http://msdn.microsoft.com/it-it/cc296071.aspx" target="_blank"&gt;percorso formativo per Aspire Architect&lt;/a&gt;. Volevo qui riassumere i concetti principali che ritengo importanti da ricordare.&lt;/p&gt;  &lt;p&gt;Per "&lt;strong&gt;Design Idiomatico&lt;/strong&gt;" si intende un tipo di progettazione che tiene conto della particolare tecnologia/piattaforma che si utilizzerà per l'implementazione della soluzione. Si deve sempre ragionare per astrazione ma senza perdere il riferimento a caratteristiche specifiche dell'ambiente di sviluppo. E' fondamentale conoscerne vantaggi e limiti in modo da fare scelte consapevoli durante il design.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Come progettare un tipo ?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Una delle prime scelte importanti è capire se utilizzare un &lt;u&gt;reference type&lt;/u&gt; (&lt;strong&gt;class&lt;/strong&gt;) o un &lt;u&gt;value type&lt;/u&gt; (&lt;strong&gt;struct&lt;/strong&gt;). Sappiamo tutti quali sono i vantaggi e gli svantaggi di utilizzare questi tipi quindi è possibile enunciare alcune linee guida.&lt;/p&gt;  &lt;p&gt;Generalmente la scelta più frequente è utilizzare class, ma conviene considerare struct solo nei casi in cui:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Il tipo occupa poco spazio in memoria e non deve essere passato frequentemente attraverso metodi e collezioni (ricordare sempre che i value types sono passati per valore e che il garbage collector ha difficoltà nel gestire oggetti di piccole dimensioni)&lt;/li&gt;    &lt;li&gt;Il tipo è &lt;strong&gt;Immutable&lt;/strong&gt; (a riguardo di ciò considerare il post di Marco De Sanctis &lt;a href="http://blogs.ugidotnet.org/Crad/archive/2006/04/01/38128.aspx" target="_blank"&gt;Regola aurea per chi usa Value Types&lt;/a&gt; )&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Un'altra importante scelta è se utilizzare &lt;strong&gt;properties&lt;/strong&gt; o &lt;strong&gt;methods&lt;/strong&gt;. L'utilizzo di metodi porta a dei vantaggi in un contesto distribuito (si riducono le operazioni di serializzazione) e in contesti multithreading (è possibile rendili atomici). L'utilizzo delle property è preferibile perchè si ottiene una usabilità migliore rispetto ai metodi, infatti il principale vantaggio delle property è che hanno la sintassi di un campo nonostante lavorano come funzioni. E' importante utilizzare valori di default per ogni property e preservare il valore di un campo se la corrispondente property setter ha scatenato una eccezione. E' consigliato l'utilizzo di un metodo per operazioni lunghe, per conversioni, per operazioni non deterministiche e se l'operazione restituisce una collezione.&lt;/p&gt;  &lt;p&gt;Per quanto riguarda il costruttore di istanza è bene non sovraccaricarlo ed evitare l'utilizzo di metodi virtuali al suo interno. E' possibile sollevare eccezioni ma prestando attenzione che l'oggetto non sarà creato e quindi potrà subito essere finalizzato dal garbage collector. Il costruttore statico (se presente) deve essere privato e non deve sollevare eccezioni al suo interno.&lt;/p&gt;  &lt;p&gt;E' importante raggruppare logicamente i tipi creati all'interno di namespace. Tuttavia è bene evitare gerarchie di namespace troppo profonde o un numero elevato di namespace. Un consiglio di &lt;a href="http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx" target="_blank"&gt;Richter&lt;/a&gt; è posizionare classi specializzate in namespace più profondi rispetto ai namespace delle classi base.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Design for Extensibility&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Le possibilità offerte dal framework .NET in merito alla possibilità di realizzare tipi estensibili sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Derivazione singola&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Classi Sealed&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Astrazione (è un "Tipo" che definisce un contratto ma non la sua implementazione)&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;Classi astratte&lt;/strong&gt; (si considera il metodo migliore per realizzare una astrazione perchè l'aggiunta di un metodo non rompe il contratto, di contro ovviamente è che se ne può avere solo una)&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Interfacce&lt;/strong&gt; (permettono di simulare l'ereditarietà multipla)&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Classe astratta + Interfaccia&lt;/strong&gt; (utilizzare entrambe per fornire due alternative di estensione)&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;Eventi&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Membri virtuali&lt;/strong&gt; (da utilizzarsi solo quando è strettamente necessario e il contesto di utilizzo è chiaro)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Exception Design&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;E' fondamentale non utilizzare le eccezioni per gestire il normale flusso applicativo perchè hanno un costo notevole sulle performance. &lt;/li&gt;    &lt;li&gt;E' bene utilizzare il blocco finally per operazioni di cleanup ma è opportuno evitare di sollevare altre eccezioni all'interno del blocco. &lt;/li&gt;    &lt;li&gt;Una regola semplice e pratica è quella che dice di sollevare una eccezione all'interno di un metodo solo se quel metodo non riesce a svolgere il compito per cui è stato creato.&lt;/li&gt;    &lt;li&gt;Cercare di utilizzare le eccezioni fornite dal framework (es. ArgumentNullException)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Design Pattern Idiomatici&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Il pattern idiomatico più conosciuto nella piattaforma .NET è il &lt;strong&gt;pattern dispose&lt;/strong&gt; di cui ho già ampiamente parlato in un mio post: &lt;a href="http://blogs.ugidotnet.org/angellaa/archive/2007/11/19/89799.aspx" target="_blank"&gt;Interfaccia IDisposable e Pattern Dispose&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Collections, Clonazione&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;E' bene esporre tramite API pubbliche delle interfacce generiche (come IEnumerable&amp;lt;T&amp;gt; o ICollection&amp;lt;T&amp;gt;) ed eventualmente fare controlli dinamici di tipo. E' consigliabile, ma dipende fortemente dal contesto, non implementare il setter per proprietà che restituiscono una collection.&lt;/p&gt;  &lt;p&gt;Inoltre conviene non utilizzare mai l'interfaccia ICloneable per motivi spiegati da &lt;a href="http://blogs.msdn.com/brada/" target="_blank"&gt;Brad Abrams&lt;/a&gt; in &lt;a href="http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx" target="_blank"&gt;Implementing ICloneable&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Conclusioni &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ovviamente è importante precisare che le linee guida non sono dogmi indiscutibili e quindi sarà sempre compito del progettista/architetto valutare le possibili alternative. Il vantaggio di avere delle linee guida è uniformare il modo di scrivere codice in modo da semplificare la manutenzione e l'evoluzione di un progetto software.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/93565.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/07/30/design-idiomatico.aspx</guid>
            <pubDate>Wed, 30 Jul 2008 00:33:27 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/07/30/design-idiomatico.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/93565.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/93565.aspx</trackback:ping>
        </item>
        <item>
            <title>UML: quanto &amp;egrave; usato in pratica ?</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/07/13/uml-quanto-egrave-usato-in-pratica.aspx</link>
            <description>&lt;p&gt;Recentemente durante la stesura della relazione di un progetto web in un esame universitario mi sono imbattuto nell'utilizzo di UML per disegnare l'interazione utente-sistema. Questa tecnica nota come &lt;strong&gt;progettazione UX&lt;/strong&gt; permette di modellare la struttura dinamica delle pagine e le mappe di navigazione. Di seguito un diagramma che mostra  l'interazione dell'utente con la pagina "risultati della ricerca":&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/UMLeilsuoutilizzopratico_14D7F/Struttura%20Pagina%20dei%20risultati%20della%20ricerca_2.jpg"&gt;&lt;img height="497" alt="Struttura Pagina dei risultati della ricerca" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/UMLeilsuoutilizzopratico_14D7F/Struttura%20Pagina%20dei%20risultati%20della%20ricerca_thumb.jpg" width="706" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Sappiamo tutti che UML è una famiglia di rappresentazioni grafiche che possono essere utilizzate per descrivere sistemi software a oggetti. UML è uno standard internazionale universalmente riconosciuto non necessariamente limitato all'ambiente della produzione del software. UML lascia libero l'utente di disegnare i diagrammi al livello di dettaglio che preferisce e sono convinto che mantenere i diagrammi semplici ed espressivi facilita la comprensione. E' indubbia la verità del detto "&lt;strong&gt;un'immagine vale più di mille parole&lt;/strong&gt;". Il problema generale della documentazione e soprattutto della realizzazione dei diagrammi è mantenere la sincronizzazione tra il codice e i diagrammi stessi durante tutta l'evoluzione del progetto e oltre. Per questo motivo ritengo estremamente utile la presenza di strumenti che possano nei limiti del caso facilitare questa operazione.&lt;/p&gt;  &lt;p&gt;L'esempio più eclatante è sicuramente il &lt;strong&gt;Class Diagram di Visual Studio&lt;/strong&gt; che permette di disegnare un modello a oggetti a diversi livelli di dettaglio e soprattutto viene garantita la sincronizzazione con il codice in entrambe le direzioni ! Possiamo a tutti gli effetti ritenere il Class Diagram il diagramma idiomatico corrispondente al "Diagramma della Classi di UML". Penso che uno sviluppatore .NET con uno strumento simile difficilmente avrà bisogno di utilizzare il diagramma delle classi UML. Vero è che UML è standard al contrario dello strumento fornito da Microsoft.&lt;/p&gt;  &lt;p&gt;Questo post vuole essere semplicemente una domanda a voi che sviluppate e progettate software concreto quotidianamente: &lt;strong&gt;quanto UML è veramente utilizzato in pratica ?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Inoltre sento sempre più spesso parlare di &lt;strong&gt;Metodologie Agili&lt;/strong&gt; e quindi sorge spontanea la domanda: &lt;strong&gt;come si colloca UML nel processo di sviluppo incrementale in un team agile ?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Attendo una risposta in base alla vostra esperienza personale....&lt;/p&gt;  &lt;p&gt;PS: segnalo anch'io come ha già fatto &lt;a href="http://blogs.ugidotnet.org/marcom/Default.aspx" target="_blank"&gt;Marco Minerva&lt;/a&gt; il programma open-source &lt;a href="http://staruml.sourceforge.net/en/" target="_blank"&gt;StarUML&lt;/a&gt; per realizzare in modo semplice e veloce un qualsiasi diagramma UML.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/93381.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/07/13/uml-quanto-egrave-usato-in-pratica.aspx</guid>
            <pubDate>Sun, 13 Jul 2008 01:57:39 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/07/13/uml-quanto-egrave-usato-in-pratica.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/93381.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/93381.aspx</trackback:ping>
        </item>
    </channel>
</rss>