GUISA http://blogs.ugidotnet.org/adrian/category/GUISA.aspx GUISA it-IT Adrian Florea Subtext Version 2.6.0.0 MVC versus Document/View in MFC http://blogs.ugidotnet.org/adrian/archive/2009/04/03/mvc-versus-documentview-in-mfc.aspx <p>Sto leggendo il bellissimo libro di <a href="http://blogs.ugidotnet.org/dinoes/">Dino</a> &amp; <a href="http://blogs.ugidotnet.org/pape/">Andrea</a>, "<a href="http://www.amazon.com/Microsoft%C2%AE-NET-Architecting-Applications-PRO-Developer/dp/073562609X/">Microsoft .NET: Architecting Applications for the Enterprise</a>" e mi ha incuriosito questa loro osservazione alla pagina 362: "[...] <em>Microsoft Foundation Classes (MFC) offered more than a decade ago an architecture with some points in common with MVC - particularly, the Document/View (DV) model. DV can be seen as a version of MVC where the view and controller are fused together. </em><strong>We really don't know whether the MFC team intentionally discarded MVC to embrace DV</strong><em>; our feeling, however, is that DV blossomed autonomously during the design by simply applying correctly and diffusely the SoC principle</em>".</p> <p><a href="http://www2.roguewave.com/support/developer/WinResources/mvc.cfm">Sembra</a> che alla PDC del 1995, un membro del team di MFC abbia raccontato proprio la storia del "<em>MVC versus DV</em>" nella scelta architetturale di MFC: "[...] <em>for the controller’s message mapping mechanism, can’t we just reuse MFC’s message map solution? Ideally, yes. But there is one big problem here... A separate controller class for message handlers may sound like a good idea, but MFC was designed in such a way that this was thought impossible. MFC allows commands such as menu picks to be rerouted to non-windows, but not windows messages such as mouse clicks. In MFC, only a CWnd can receive windows messages and only one instance of a CWnd can receive the messages for a real Windows window. Since a controller is meant to be a non-window that can handle windows messages and exist in multiple instances per window, we seem to be stuck! An interesting aside, this problem was sited by an original MFC team member as </em><strong>the main reason Microsoft emulated MVC for the CDocument and CView, but stopped short of implementing a controller</strong><em> (MFC Professional Developers Conference, 1995)</em>". Interessante...</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/95872.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2009/04/03/mvc-versus-documentview-in-mfc.aspx Fri, 03 Apr 2009 22:18:48 GMT http://blogs.ugidotnet.org/adrian/archive/2009/04/03/mvc-versus-documentview-in-mfc.aspx#feedback 271 http://blogs.ugidotnet.org/adrian/comments/commentRss/95872.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/95872.aspx 3rd Italian MDA Forum http://blogs.ugidotnet.org/adrian/archive/2008/11/21/3rd-italian-mda-forum.aspx <p>Salire sul <a href="http://mdaforum.soluta.net/agenda.aspx">palco</a> a parlare di DSL Tools subito dopo <a href="http://www.omg.org/~soley/">Richard Mark Soley</a>, <a href="http://www.stephenmellor.com/">Stephen J. Mellor</a> e <a href="http://www.cutter.com/meet-our-experts/rosenm.html">Michael Rosen</a>, giuro che non e' stato facile :) Ottima l'organizzazione dell'evento, nel cinquecentesco <a href="http://www.hotelpalazzostelline.it/">Palazzo delle Stelline</a>, tante discussioni interessantissime sull'MDA, modellizzazione e generazione di codice. Giornata davvero speciale!</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/94728.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/11/21/3rd-italian-mda-forum.aspx Fri, 21 Nov 2008 11:15:24 GMT http://blogs.ugidotnet.org/adrian/archive/2008/11/21/3rd-italian-mda-forum.aspx#feedback 411 http://blogs.ugidotnet.org/adrian/comments/commentRss/94728.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/94728.aspx Axioms for software architects by software architects http://blogs.ugidotnet.org/adrian/archive/2008/09/08/axioms-for-software-architects-by-software-architects.aspx <p>Via <a href="http://memeagora.blogspot.com/2008/08/97-things-every-software-architect.html">questo post</a> di Neal Ford sono arrivato a questo saggissimo wiki: <a href="http://97-things.near-time.net/">97 Things Every Software Architect Should Know</a>. Assolutamente da non perdere! Tre dei principi li ho gia' aggiunti alla mia <a href="http://blogs.ugidotnet.org/adrian/archive/2006/03/03/36066.aspx">collezione sulla semplicita'</a>.</p> <p>[OT]: Venerdi' organizziamo il <a href="http://ronua.ro/CS/forums/thread/206385.aspx">secondo workshop</a> dello user group locale, RONUA Galati, con due presentazioni sullo stesso difficile tema: un'introduzione a DSL Tools e un'altra a VSX. <a href="http://ronua.ro/CS/photos/23_mai_2008_--_galati_ronua_roadshow_2008/default.aspx">Guardate</a> quanta gente e' venuta al primo workshop, tenuto a maggio! Incredibile... Poi sono stato invitato a partecipare questo weekend insieme a tutti gli MVP e Microsoft Influencer rumeni alla quinta edizione di Microsoft Community Bootcamp, organizzata da Microsoft Romania in montagna, ottima opportunita' di conoscerci tutti insieme! Presto mettero' da qualche parte le slide e il codice del workshop e vi aggiornero' su come e' andata al bootcamp - scusate la parte off-topic del post...</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/93965.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/09/08/axioms-for-software-architects-by-software-architects.aspx Mon, 08 Sep 2008 05:05:17 GMT http://blogs.ugidotnet.org/adrian/archive/2008/09/08/axioms-for-software-architects-by-software-architects.aspx#feedback 27 http://blogs.ugidotnet.org/adrian/comments/commentRss/93965.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/93965.aspx I vostri migliori post, da oggi anche in rumeno http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx <p>Oggi ho aperto il mio primo blog in rumeno, a <a href="http://ronua.ro/CS/blogs/adrianf/default.aspx">questo indirizzo</a> su RONUA. Per cominciare, ho deciso di tradurre in rumeno i post piu' interessanti che trovero' nelle varie <a href="http://www.microsoft.com/italy/communities/elenco.mspx">community italiane</a>, per far conoscere ai miei connazionali il grande spirito che ho conosciuto e mi avete regalato negli anni passati con voi. Ogni post sara' fornito ovviamente dal link al post originale, spero di avere il vostro consenso per la traduzione. E chissa', magari si stringono amicizie nuove, etc. Il blog su UGI non finisce qui, salvo completa mancanza di ispirazione :-)</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/92948.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx Thu, 05 Jun 2008 23:32:14 GMT http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx#feedback 108 http://blogs.ugidotnet.org/adrian/comments/commentRss/92948.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/92948.aspx Il pattern Decorator e la decorazione con un extension method generico http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx <p>Stamattina, al corso che sto tenendo di architettura base, ho presentato ai ragazzi il classico pattern <em>Decorator</em> per servirci poi nell'implementare i vari servizi di validazione, logging, caching, etc., come decoratori di un repository, ispirato da <a href="http://www.ayende.com/Blog/archive/7598.aspx">questo post</a> di Ayende. Uno di loro mi ha chiesto se si poteva scrivere il corpo della <strong>CreateComponent</strong> in modo ancora piu' <em>usabile</em>. E mi e' venuta l'idea di utilizzare un extension method generico fluente, tanto per introdurli un po' anche nel mondo di C# 3.0</p> <p>Partiamo dall'implementazione standard del pattern:</p> <p><strong>using</strong> System;<br /> <br /> <strong>public</strong> <strong>interface</strong> IComponent {<br />     <strong>void</strong> Operation();<br /> }<br /> <br /> <strong>public</strong> <strong>class</strong> ConcreteComponent : IComponent {<br />     <strong>public</strong> <strong>void</strong> Operation() {<br />         Console.WriteLine("ConcreteComponent");<br />     }<br /> }<br /> <br /> <strong>public</strong> <strong>abstract</strong> <strong>class</strong> Decorator : IComponent {<br />     <strong>private</strong> <strong>readonly</strong> IComponent component;<br /> <br />     <strong>protected</strong> Decorator(IComponent component) {<br />         <strong>if</strong> (component == <strong>null</strong>) <strong>throw</strong> <strong>new</strong> ArgumentNullException("component");<br />         <strong>this</strong>.component = component;<br />     }<br /> <br />     <strong>public</strong> <strong>virtual</strong> <strong>void</strong> Operation() {<br />         <strong>this</strong>.component.Operation();<br />     }<br /> }<br /> <br /> <strong>public</strong> <strong>class</strong> ConcreteDecoratorA : Decorator {<br />     <strong>public</strong> ConcreteDecoratorA(IComponent component) : <strong>base</strong>(component) { }<br /> <br />     <strong>public</strong> <strong>override</strong> <strong>void</strong> Operation() {<br />         Console.WriteLine("ConcreteDecoratorA");<br />         <strong>base</strong>.Operation();<br />     }<br /> }<br /> <br /> <strong>public</strong> <strong>class</strong> ConcreteDecoratorB : Decorator {<br />     <strong>public</strong> ConcreteDecoratorB(IComponent component) : <strong>base</strong>(component) { }<br /> <br />     <strong>public</strong> <strong>override</strong> <strong>void</strong> Operation() {<br />         Console.WriteLine("ConcreteDecoratorB");<br />         <strong>base</strong>.Operation();<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>public</strong> <strong>static</strong> IComponent CreateComponent() {<br />         <font color="#ff0000"><strong>return</strong> <br />             <strong>new</strong> ConcreteDecoratorB(<br />             <strong>new</strong> ConcreteDecoratorA(<br />             <strong>new</strong> ConcreteComponent()));</font><br />     }<br /> <br />     <strong>static</strong> <strong>void</strong> Main() {<br />         IComponent component = CreateComponent();<br />         component.Operation();<br />     }<br /> }</p> <p>Questo snippet quindi stampa:</p> <p>ConcreteDecoratorB<br /> ConcreteDecoratorA<br /> ConcreteComponent</p> <p>a console. L'idea per modificare il metodo <strong>CreateComponent</strong> e' semplice: se definiamo una classe statica <strong>ComponentExtension</strong> contenente un'extension method generico come di seguito:</p> <p><strong>public</strong> <strong>static</strong> <strong>class</strong> ComponentExtension {<br />     <strong>public</strong> <strong>static</strong> Decorator DecorateWith&lt;T&gt;(<strong>this</strong> IComponent component) <strong>where</strong> T : Decorator {<br />         <strong>return</strong> (T)Activator.CreateInstance(<strong>typeof</strong>(T), component);<br />     }<br /> }</p> <p>il metodo <strong>CreateComponent</strong> diventa:</p> <p><strong>public</strong> <strong>static</strong> IComponent CreateComponent() {<br />     <font color="#ff0000"><strong>return</strong> <strong>new</strong> ConcreteComponent()<br />             .DecorateWith&lt;ConcreteDecoratorA&gt;()<br />             .DecorateWith&lt;ConcreteDecoratorB&gt;();</font><br /> }</p> <p>che, a mio parere, e' piu' espressivo. Che ne dite?</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/90017.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx Thu, 29 Nov 2007 03:47:56 GMT http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx#feedback 121 http://blogs.ugidotnet.org/adrian/comments/commentRss/90017.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/90017.aspx [GUISA] Generic Special Case? http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx <A href="http://guisa.it/forums/thread/148.aspx">Un altro thread</A> sul forum di GUISA, partendo da una <A href="http://blogs.ugidotnet.org/janky/archive/2006/10/09/50571.aspx">frase di Janky</A>. Solo un invito a trovare una soluzione insieme...<img src="http://blogs.ugidotnet.org/adrian/aggbug/53186.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx Fri, 27 Oct 2006 20:10:00 GMT http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx#feedback 29 http://blogs.ugidotnet.org/adrian/comments/commentRss/53186.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/53186.aspx [GUISA] Enumerable State Machine http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx Sul forum di <A href="http://guisa.it/">GUISA</A> ho postato <A href="http://guisa.it/forums/thread/136.aspx">qui</A> un'implementazione del pattern State sfruttando la macchina a stati generata dal compilatore C# 2.0 per un iteratore generico. L'idea mi &#232; venuta per gioco, diciamo che per adesso potrebbe essere interessante soprattutto per quelli che vogliono capire gli iteratori generici, non necessariamente come implementazione "seria" del pattern State.<img src="http://blogs.ugidotnet.org/adrian/aggbug/52943.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx Thu, 26 Oct 2006 13:56:00 GMT http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx#feedback 30 http://blogs.ugidotnet.org/adrian/comments/commentRss/52943.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/52943.aspx [GUISA] Quando non rispettare le linee guida? http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx <P>Ho appena creato un <A href="http://guisa.it/forums/thread/131.aspx">thread</A> sul forum di <A href="http://guisa.it/">GUISA</A> (Gruppo Utenti Italiani Solution Architect) in cui offro un esempio dove ha senso che il metodo <B>GetHashCode</B> ritorni sempre un valore costante e dove il metodo <B>Equals</B> &#232; molto atipico: due istanze sono uguali se sono istanze del tipo contenente questi metodi - quindi semantica statica per una classe non-statica.</P> <P>Cercher&#242; di postare l&#236; le cose che riguardano l'architettura, per seguire sia io che voi pi&#249; facilmente i feedback, mentre qui sul blog solo una piccola info.</P><img src="http://blogs.ugidotnet.org/adrian/aggbug/52540.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx Wed, 25 Oct 2006 16:29:00 GMT http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx#feedback 22 http://blogs.ugidotnet.org/adrian/comments/commentRss/52540.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/52540.aspx