WASP.NET http://blogs.ugidotnet.org/WASP.NET/Default.aspx Il blog di Roberto Vespa it-IT Roberto Vespa Subtext Version 2.6.0.0 WASP.NET http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/WASP.NET/Default.aspx 77 60 Extending the world http://blogs.ugidotnet.org/WASP.NET/archive/2012/01/14/extending-the-world.aspx Sul mio in inglese ho iniziato a scrivere una serie sull'utilizzo di Linq dal punto di vista dell'approccio funzionale, ovvero per esprimere computazioni, espandendo il concetto di Linq come "mondo" da estendere attraverso le nostre implementazioni. Sono aspetti per me piuttosto nuovi ma interessanti, e anche per capirli meglio ho deciso di scrivere una mini serie. Se l'argomento vi interessa, vi aspetto <a href="http://www.robychechi.it/roby/tech-blog/extending-the-world">qui</a> :)<img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/100701.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2012/01/14/extending-the-world.aspx Sat, 14 Jan 2012 01:29:39 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2012/01/14/extending-the-world.aspx#feedback 7 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/100701.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/100701.aspx Parrots su CodeProject http://blogs.ugidotnet.org/WASP.NET/archive/2011/09/03/parrots-su-codeproject.aspx Qualche giorno fa ho pubblicato su <a href="http://www.codeproject.com">CodeProject</a> un articolo sulla <a href="https://bitbucket.org/wasp/parrots/wiki/Home">libreria</a> di "record and replay" stub objects che sto scrivendo. L'articolo cerca di essere piuttosto esaustivo sulle idee che stanno alla base della libreria, quindi può essere interessante per chi fosse curioso sull'argomento. Può essere trovato <a href="http://www.codeproject.com/KB/testing/Parrots.aspx">qui</a>.<img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/100321.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2011/09/03/parrots-su-codeproject.aspx Sat, 03 Sep 2011 23:21:41 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2011/09/03/parrots-su-codeproject.aspx#feedback 9 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/100321.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/100321.aspx Parrots, background http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/14/parrots-background.aspx Ho notato dalle statistiche sugli accessi un interesse non trascurabile per il lavoro che sto facendo con <a href="http://www.robychechi.it/roby/parrots">Parrots</a>. Per chi volesse maggiori dettagli su quali sono i concetti di fondo su cui il lavoro si basa, ho scritto 2 righe <a href="http://www.robychechi.it/roby/parrots/background-and-concepts">qui</a>. Grazie.<img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/100269.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/14/parrots-background.aspx Sun, 14 Aug 2011 20:05:20 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/14/parrots-background.aspx#feedback 7 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/100269.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/100269.aspx Parrots http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/10/parrots.aspx Per chi fosse interessato, sto lavorando a una libreria open-source in C# che si basa su un'idea che chiamo di "record and replay mocking". Maggiori dettagli <a href="http://www.robychechi.it/roby/parrots/first-release">qui</a>.<img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/100264.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/10/parrots.aspx Wed, 10 Aug 2011 22:56:31 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2011/08/10/parrots.aspx#feedback 6 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/100264.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/100264.aspx Code Metrics [1] http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/19/67671.aspx <FONT face=Verdana size=2> <P>Come annunciato qualche giorno fa,&nbsp;ho iniziato la scrittura di una libreria estendibile per calcolare "code metrics". Se qualcuno fosse interessato alle motivazioni le trova <A title=qui href="http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/08/65576.aspx" target="" name="">qui</A>. Sono arrivato al punto in cui il motore comincia a produrre qualche numero <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0></P> <DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">Analyzer&nbsp;az&nbsp;=&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">new&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">Analyzer();<BR>az.AddAssemblyFile(root&nbsp;+&nbsp;@"A\bin\Debug\A.dll");<BR>az.AddAssemblyFile(root&nbsp;+&nbsp;@"B\bin\Debug\B.dll");<BR><BR>Analysis&nbsp;a&nbsp;=&nbsp;az.Generate(</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">new&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">InstabilityAssemblyDependenciesWalker());<BR><BR>AssemblyDescriptor&nbsp;ad&nbsp;=&nbsp;a.Scan.FindAssemblyDescriptor("[A]");<BR>Assert.IsNotNull(ad);<BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">double&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">i&nbsp;=&nbsp;ad.DescriptorCounters["Instability"];<BR>Assert.AreEqual(0.75,&nbsp;i);<BR><BR>ad&nbsp;=&nbsp;a.Scan.FindAssemblyDescriptor("[B]");<BR>Assert.IsNotNull(ad);<BR>i&nbsp;=&nbsp;ad.DescriptorCounters["Instability"];<BR>Assert.AreEqual(1,&nbsp;i);<BR></DIV></SPAN> <P>E' possibile scrivere dei "visitor" esterni che navigano i grafi generati dall'analisi ed effettuano i loro calcoli. Nell'esempietto il "walker"&nbsp;<SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">InstabilityAssemblyDependenciesWalker</SPAN> utilizza un paio di visitor per il calcolo della metrica&nbsp;<EM>afferent coupling</EM>&nbsp;(<STRONG>Ca</STRONG>) e di quella <EM>efferent coupling </EM>(<STRONG>Ce</STRONG>), da cui poi ricava la metrica <EM>instability</EM>. Le definizioni delle suddette metriche si possono trovare per esempio&nbsp;<A title=qui href="http://en.wikipedia.org/wiki/Software_package_metrics" target="" name="">qui</A>.</P> <P>Quando avrò un paio di metriche sensate cercherò di scrivere un modulo consumatore in grado di generare reportistica xml, e poi metterò il tutto su Codeplex. Il nome non l'ho ancora deciso, ho qualche idea ma non sono ancora convinto <IMG height=19 src="http://www.imhoproject.org/files/complice.gif" width=19 align=absMiddle border=0></P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/67671.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/19/67671.aspx Fri, 19 Jan 2007 00:12:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/19/67671.aspx#feedback 4 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/67671.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/67671.aspx Analisi delle dipendenze e dintorni http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/08/65576.aspx <FONT face=Verdana size=2> <P>Da 2-3 mesi ho un'idea che mi frulla per la testa relativamente all'analisi delle dipendenze tra assembly e tra tipi. In giro non c'è molto che faccia questo tipo di lavoro, fatta eccezione per <A title=NDepend href="http://www.ndepend.com/" target="" name="">NDepend</A>&nbsp;che, quando pronto (ora è RC1), sarà un gran tool ma sarà anche a pagamento, costerà intorno ai 300$ a licenza. Sarebbero soldi assolutamente ben spesi, ma potrebbero esistere scenari dove un "motore" di analisi delle dipendenze e più in generale del codice IL potrebbe essere interessante anche per scopi non direttamente correlati alle metriche e al controllo della qualità del codice. Penso per esempio ad un "auto-wiki", un aggeggio in grado di analizzare un set di assembly e che possa da essi generare un wiki per documentare o monitorare iterazioni a partire da un grafo di navigazione "preconfezionato". In generale l'idea è che questo motore possa essere usato con facilità in ambienti dove si fa uso di continuous integration e non si ha un gran budget a disposizione...&nbsp; come il mio&nbsp;<IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0></P> <P>Nelle ultime settimane ho iniziato a scrivere questo "motorino", con l'idea di avere un'architettura pluggabile a cui aggiungere moduli di analisi in modo semplice. Ad oggi la parte di analisi dell'IL si basa su un set di sorgenti C# che ho trovato <A title=qui href="http://plas.fit.qut.edu.au/perwapi/" target="" name="">qui</A>, ma&nbsp;sto valutando di passare a&nbsp;<A title=Cecil href="http://www.mono-project.com/Cecil" target="" name="">Cecil</A>.&nbsp;La parte di analisi e di costruzione dei "grafi" delle dipendenze è a buon punto, ora vorrei scrivere qualche plugin di analisi interessante, per esempio per calcolare metriche sulle dipendenze afferenti/efferenti, generare il grafico <A title=stability/abstractness href="http://staff.cs.utu.fi/kurssit/Programming-III/PackageDesing.pdf" target="" name="">stability/abstractness</A>, generare l'auto-wiki descritto sopra. Spero di arrivare presto (3-4 settimane)&nbsp;ad una versione considerabile "beta" e metterlo da qualche parte tipo <A title=CodePlex href="http://www.codeplex.com/" target="" name="">CodePlex</A>. Se qualcuno di voi volesse darmi una mano (ammesso che io riesca a scrivere qualcosa di decente <IMG height=19 src="http://www.imhoproject.org/files/complice.gif" width=19 align=absMiddle border=0>) o avesse delle idee faccia un fischio, ok?</P> <P>Bon, ormai l'ho detto, adesso mi tocca anche farlo...&nbsp; in realtà ho scritto questo post quasi per non avere più scuse, e per obbligarmi a trovare il tempo per andare avanti con...&nbsp; con...&nbsp; come lo chiamo??? <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0></P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/65576.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/08/65576.aspx Mon, 08 Jan 2007 23:24:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/08/65576.aspx#feedback 6 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/65576.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/65576.aspx [OT] Taggato... http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/05/65143.aspx <FONT face=Verdana size=2> <P>Essendo stato multi-taggato da <A title=Roberto href="http://blogs.ugidotnet.org/marcellino/archive/2007/01/05/65127.aspx" target="" name="">Roberto</A> e <A title=Simone href="http://blogs.ugidotnet.org/sgreci/archive/2007/01/05/64980.aspx" target="" name="">Simone</A>, mi tocca... :) </P> <P> 1) Ho iniziato a programmare su un C64 nell'84, in BASIC, ma era più che altro uno scherzo, facevo strani esperimenti che non portavano a niente, e che nemmeno io capivo completamente... comprai anche un manuale sull'assembler del 6502 e provai a leggerlo, non capivo un tubo ma mi affascinava da morire :) Il vero inizio si può dire che sia stato 3 anni più tardi, al Poli, Pascal su PC, poi in C, e poi il resto... </P> <P> 2) Sono nato e vissuto in un paesino, per cui pur piacendomi molti sport alla fine ne ho praticato uno solo, l'unico per cui ci fosse una seppur minimale struttura, il calcio. Ho giocato regolarmente per una quindicina d'anni, penso di essere uno dei più piccoli portieri (167cm) ad aver mai giocato in seconda categoria :) La rottura di un legamento crociato ha posto fine ad una brillante carriera... </P> <P> 3) Tifosissimo Granata e anni fa frequentatore assiduo della curva Maratona, ora soffro a distanza :) </P> <P> 4) Sono felicemente sposato dal 2000, e il nostro è forse uno dei primi matrimoni "figli di Internet": mia moglie è paraguayana e l'ho conosciuta nel 97 su ICQ, nel 99 ho fatto il mio primo viaggio in Paraguay e nel 2000 l'ho portata qui :) </P> <P> 5) Il mio "nick" Wasp me lo affibbiò il mio prof d'inglese nell'82, e da allora mi è rimasto addosso, sono sicuro di avere più amici che mi chiamano così di quanti non ne abbia che mi chiamano col mio nome di battesimo, sarà divertente (toccando ferro) sentirsi chiamare così a 70 anni :) </P> <P>&nbsp;</P> <P>&nbsp;</P> <P> ...e adesso?? mmmm... <A title=Felice href="http://www.felicepollano.com" target="" name="">Felice</A>, <A title=Mitch href="http://blogs.ugidotnet.org/mitch" target="" name="">Mitch</A>, <A title=Alessio href="http://creativejuice.wordpress.com/" target="" name="">Alessio</A>, <A title=Daniele href="http://www.lodevalm.net" target="" name="">Daniele</A>... <A title=Beppe href="http://www.beppegrillo.it/" target="" name="">Beppe</A>... :) </P> </FONT><img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/65143.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/05/65143.aspx Fri, 05 Jan 2007 16:55:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2007/01/05/65143.aspx#feedback 2 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/65143.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/65143.aspx Chat sui Design Patterns http://blogs.ugidotnet.org/WASP.NET/archive/2006/11/28/57645.aspx <FONT face=Verdana size=2> <P>Questa sera ho partecipato alla chat sui Design Patterns organizzata da <A title=Emanuele href="http://blogs.ugidotnet.org/BlogEma/" target="" name="">Emanuele</A>. E' stata molto interessante, un esperimento da ripetere, la discussione era piuttosto fluida e le opinioni dei partecipanti molto interessanti.</P> <P>Ne approfitto per rettificare una mia affermazione su Vlissides e il pattern&nbsp;Singleton: non era lui a proporne la rimozione dal liblro della GoF, o quantomeno non ho più trovato sue affermazioni in merito nonostante ci siano suoi scritti critici in merito, la mia convinzione veniva da un'errata associazione di idee con un vecchio post di Fowler sul suo blog (commento all'OOPSLA2004, <A href="http://www.martinfowler.com/bliki/OOPSLA2004.html">http://www.martinfowler.com/bliki/OOPSLA2004.html</A>), che riporto, dal quale si evince che Singleton è in generale considerato da molti come un pattern da rimuovere tra la lista di quelli "buoni":</P> <P>&nbsp;</P> <P><EM>Before the beginning of the conference proper I attended a workshop on reappraising the GoF </EM><EM>book, ten years after it came out. ...</EM></P> <P><EM>We did a number of discussions around the what next theme, perhaps the most interesting one to report was an exercise in considering some to 'vote off the island'. People voted on the patterns to indicate which ones they felt needed deletion in the current form.</EM></P> <P><EM>Four patterns were voted off. Factory Method (due to the confusion over what it means - the pattern is different to the more common usage of the term), Bridge, Flyweight, and Interpreter. Two patterns, Singleton and Chain of Responsibility, were split decisions.</EM></P> <P><EM>I found the votes and discussions interesting. Of course it's hard to really consider this without looking at alternatives. <U>I was surprised that Singleton got away with a split decision, considering how unpopular it's become amongst my friends</U>. Most of the others were voted off because people felt they were sufficiently uncommon and that other patterns would probably take their place, sadly we didn't have time to consider new members.</EM></P> <P>&nbsp;</P> <P>&nbsp;</P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/57645.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2006/11/28/57645.aspx Tue, 28 Nov 2006 00:51:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2006/11/28/57645.aspx#feedback 2 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/57645.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/57645.aspx La specie &quot;programmatore&quot; e la selezione naturale, meccanismi di autodifesa http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/12/51464.aspx <FONT face=Verdana > <P><FONT size=2>Riflessioni:</FONT></P> <P><FONT size=2>Più un programmatore è&nbsp;anche un bravo OO designer, più è un valore aggiunto per l'azienda in cui lavora... e più&nbsp;è sostituibile! Essì, perchè avrà fatto un buon lavoro, scrivendo codice pulito, manutenibile, estendibile, riusabile, che sarà facile far passare di mano. Per cui se lo si vuol cacciare lo si caccia, no? <IMG height=19 src="http://www.imhoproject.org/files/complice.gif" width=19 align=absMiddle border=0></FONT></P> <P><FONT size=2>Quando un programmatore lavora da solo su una&nbsp;cosa di importanza vitale, e magari ci lavora da solo, e dal punto di vista dell'OOD fa un lavoro da cani, se se ne va è una perdita enorme per l'azianda nonostante abbia lavorato male! Perchè il suo lavoro risulterà incomprensibile ed ingestibile per chi lo erediterà...&nbsp; Quindi, futuro assicurato!</FONT></P> <P><FONT size=2>Paradossale...&nbsp; se lavoro bene mi possono mandare via, se lavoro male no... <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0>&nbsp; </FONT></P> <P><FONT face=Arial><FONT size=2><FONT face=Verdana>Ovviamente non è così (forse..), ma il paradosso è interessante... Mi sembra di essere tornato ai tempi dei sofisti greci... <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0></FONT></FONT></FONT></P> <P><FONT size=2></FONT>&nbsp;</P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/51464.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/12/51464.aspx Thu, 12 Oct 2006 22:36:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/12/51464.aspx#feedback 7 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/51464.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/51464.aspx WCF e DIP, farneticazioni post-corso http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/05/50088.aspx <FONT face=Verdana size=2> <P>Sono reduce da un corso su .NET 3.0 tenuto come al solito in modo impeccabile dai ragazzi di <A title=DevLeap href="http://www.devleap.it/" target="" name="">DevLeap</A>.&nbsp;Le 2 ore di&nbsp;viaggio di ritorno verso casa sono state un momento di riflessione sui contenuti del corso, soprattutto su WCF (spiegato magistralmente da <A title=Paolo href="http://blogs.devleap.com/paolo/default.aspx" target="" name="">Paolo</A> ) e sulle sue implicazioni, a mente "calda" e quindi probabilmente con un po' di confusione in testa. Lentamente, ho iniziato a farneticare...</P> <P><STRONG>DIP, Dependency Inversion Principle</STRONG>: <EM>Abstractions should not depend upon details. Details should depend upon abstractions.</EM> (cit. Robert C. Martin)</P> <P>Supponiamo di seguire questo principio. Siamo in un contesto object oriented, e disegneremo per esempio un servizio di gestione ordini. Siccome vogliamo applicare il suddetto principio, definiamo interfacce opportune, per esempio:</P> <DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">public&nbsp;interface&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">IOrder<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">string&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">Id&nbsp;{&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">get</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">string&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">CustomerId&nbsp;{&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">get</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #008000; FONT-FAMILY: Courier New">//...<BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">}<BR><BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">public&nbsp;interface&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">IOrderService<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;IOrder&nbsp;GetOrder(</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">string&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">id);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #008000; FONT-FAMILY: Courier New">//...<BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">}<BR></DIV></SPAN> <P>Ora potremo creare le opportune implementazioni delle due interfacce.&nbsp;Potremo con semplicità&nbsp;avere differenti&nbsp;implementazioni del servizio, differenti non solo dal punto di vista funzionale ma soprattutto infrastrutturale, avendo magari opportuni adapter dietro la stessa interfaccia che ci consentano di avere il servizio reale in process, piuttosto che remoto via remoting, o ancora sotto COM+...&nbsp; e anche in WCF, no?</P> <P>Forse no, almeno non in modo "naturale"...&nbsp;Il problema nasce da lontano, credo, ed è simile al più discusso problema di "impedenza" tra il mondo object-oriented e quello entity-relationship ben conosciuto da chi dibatte intorno agli ORM. WCF == SOA, e SOA != OO. Ma anche, WCF == .NET, e .NET == OO. Per proprietà transitiva otteniamo un bel WCF != WCF <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width = 19 align= absMiddle border = 0 > . Bel problema...</P> <P>In WCF il codice precedente potrebbe diventare così (chiedo scusa per eventuali imprecisioni, vado a memoria... <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0> )</P><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"> <DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">public&nbsp;<FONT color=red>class</FONT>&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">Order<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"><FONT color=red>public&nbsp;string&nbsp;</FONT></SPAN><FONT color=red><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT color=red>Id</FONT>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"><FONT color=red>public&nbsp;string</FONT>&nbsp;</SPAN></FONT><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT color=red>CustomerId<FONT color=#400040>;</FONT><BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #008000; FONT-FAMILY: Courier New">//...<BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">}<BR><BR><FONT color=#408080><STRONG><EM>[ServiceContract]<BR></EM></STRONG></FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">public&nbsp;interface&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">IOrderService<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#408080><STRONG><EM>[OperationContract]</EM></STRONG></FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=red>Order</FONT>&nbsp;GetOrder(</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New">string&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">id);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #008000; FONT-FAMILY: Courier New">//...<BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New">}<BR></DIV></SPAN></SPAN> <P><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT face=Verdana>Supponendo un modello di servizio WCF di tipo RPC (col modello "data contract"&nbsp;dal punto di vista che cerco di illustrare forse è&nbsp;anche peggio...), ecco che abbiamo 2 particolarità:</FONT></SPAN></P> <OL> <LI><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New" ><FONT face=Verdana>non possiamo più avere un interfaccia (<FONT face="Courier New">IOrder</FONT>) come valore di ritorno, ma dobbiamo avere qualcosa di serializzabile (<FONT face="Courier New">Order</FONT>), quindi una classe concreta: il DIP va un po' a farsi benedire, faccio dipendere un'astrazione da una classe concreta, per di più di dominio e quindi potenzialmente instabile (= soggetta a cambiamenti), a meno che io non la crei ad hoc per quest'unico scopo, quindi come puro contenitore di campi senza logiche applicative, fattibile ma magari non bellissimo; e comunque la cosa mi costringerebbe probabilmente ad istanziare oggetti ad hoc al solo scopo di trasferire dati, quando magari io i miei dati potrei già averli in una forma adatta ad essere "nascosta" dietro un'interfaccia</FONT></SPAN> <LI><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New" ><FONT face=Verdana>abbiamo gli attributi <FONT face="Courier New">ServiceContract</FONT> ed <FONT face="Courier New">OperationContract</FONT> sulla definizione dell'interfaccia del servizio: se quest'interfaccia dovesse essere la stessa dietro cui implemento anche versioni "non WCF" del servizio, essa sarebbe "sporcata" da dettagli concreti, non astratti, dipendenti dal framework applicativo in uso (WCF); di nuovo, un'astrazione che dipende da dettagli concreti, per mantenere la situazione pulita ed allo stesso tempo usare WCF dovrei avere due set paralleli di interfacce di servizio, e di nuovo adattatori in mezzo...</FONT></SPAN></LI></OL> <P><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT face=Verdana>Come dicevo prima, in realtà tutto credo nasca dal fatto che ragionare SOA non è ragionare OO, ma che usiamo OO per implementare SOA. Un'interfaccia OO <U>non</U> è un contratto SOA, ma la facciamo lavorare come se lo fosse.</FONT></SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT face=Verdana> Nulla di nuovo, va bene tutto, in fondo basta saperlo e gestirlo, no? Ma allora il dubbio è: quando Microsoft dice che WCF unifica ASMX, WSE, COM+ e Remoting, in realtà ci sta un po' sviando... io con Remoting posso&nbsp;avere il servizio remoto usando il primo modello di interfacce, quello "ideale", con WCF no, quindi WCF rimpiazza Remoting ma con i costi visti sopra, che non è detto che siano sempre accettabili. Se poi l'esigenza non è interoperare, bensì remotizzare servizi (.NET su .NET) rimanendo su una metafora d'uso che renda "trasparente" la posizione reale del servizio, allora in definitiva WCF, che ha un milione di cose che vorrei poter usare, non riesco ad usarlo se non attraverso "accrocchi", come&nbsp;due set di interfacce ed un ulteriore livello di indirezione e quindi di serializzazione da creare per ogni singolo servizio. Una situazione con application server fatto con IIS e servizi ospitati via Remoting, è ovviamente realizzabile anche con WCF, ma a mio avviso non ha la stessa "pulizia" se il cardine del problema è la trasparenza della posizione del servizio rispetto al client.</FONT></SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"><FONT face=Verdana>Insomma, a questo punto, viva WCF ma...&nbsp; lunga vita anche a Remoting! <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0>&nbsp; Perchè Remoting vivrà ancora a lungo, vero?? ...vero?????&nbsp; <IMG height=19 src="http://www.imhoproject.org/files/complice.gif" width=19 align=absMiddle border=0></FONT></SPAN></P> </FONT> <FONT size=2 ><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/WASP.NET/aggbug/50088.aspx" width="1" height="1" /> Roberto Vespa http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/05/50088.aspx Thu, 05 Oct 2006 23:36:00 GMT http://blogs.ugidotnet.org/WASP.NET/archive/2006/10/05/50088.aspx#feedback 3 http://blogs.ugidotnet.org/WASP.NET/comments/commentRss/50088.aspx http://blogs.ugidotnet.org/WASP.NET/services/trackbacks/50088.aspx