<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>Architettura</title>
        <link>http://blogs.ugidotnet.org/crad/category/Architettura.aspx</link>
        <description>Design Patterns a gogo da queste parti</description>
        <language>it-IT</language>
        <copyright>Marco De Sanctis</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Costanti pubbliche? AHIAHIAHI</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx</link>
            <description>&lt;p&gt;Premessa: ciò che scriverò è una banalità, ma secondo me in tanti non ne sono al corrente o non ci pensano. Di cosa parlo? Di cose del genere:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:23264bd7-da92-41a5-ba6e-3c35ed74d666" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="width:100%;;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyConst &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il danno potenziale che le &lt;strong&gt;costanti pubbliche &lt;/strong&gt;possono creare alla stabilità delle nostre applicazioni è enorme.&lt;/p&gt;
&lt;p&gt;Why? Perché le costanti non sono altro che &lt;strong&gt;placeholder&lt;/strong&gt; risolti &lt;strong&gt;in fase di compilazione&lt;/strong&gt;. Questo vuol dire che, finché non si ricompila, il valore non viene aggiornato.&lt;/p&gt;
&lt;p&gt;Implicazioni?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Assembly A che definisce una costante MyConst = 10&lt;/li&gt;
&lt;li&gt;Assembly B che referenzia Assembly A e ne utilizza MyConst&lt;/li&gt;
&lt;li&gt;Assembly A cambia MyConst a 15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finché non ricompilo Assembly B&lt;/strong&gt;, questo continua a vedere MyConst = 10&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Ogni tanto mi capita di trovare righe di codice simili a quella in alto, con seguenti bug "strani" e dolori per scovarli. Ecco perché cerco sempre di abituare i junior che lavorano con me alla regola:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Le costanti devono essere sempre private o internal. Se serve esporle allora si utilizzino dei field readonly&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Augh!&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:e23a99d5-f626-4d0a-a547-d6a97a6dad5b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/Costanti" rel="tag"&gt;Costanti&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Readonly%20field" rel="tag"&gt;Readonly field&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/90956.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx</guid>
            <pubDate>Thu, 31 Jan 2008 16:15:13 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2008/01/31/costanti-pubbliche-ahiahiahi.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/90956.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Un buon esempio di IoC e separation of concerns</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx</link>
            <description>&lt;p&gt;Parlo di &lt;a href="http://www.cuyahoga-project.org/"&gt;Cuyahoga&lt;/a&gt;, il noto CMS basato su &lt;a href="http://www.castleproject.org/index.html"&gt;Castle Windsor&lt;/a&gt; e &lt;a href="http://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;. Incuriosito da &lt;a href="http://ayende.com/Blog/archive/2007/11/28/Code-Review-PetShop-3.0.aspx"&gt;questo post&lt;/a&gt; di &lt;a href="http://ayende.com/Blog/Default.aspx"&gt;Ayende&lt;/a&gt; ieri ne ho spulciato un po' i sorgenti. E visto che li considero didatticamente interessanti, ve li consiglio.&lt;/p&gt; &lt;p&gt;Certo, non è da prendere tutto come oro colato (il modulo del Forum, ad esempio, espone tutti i servizi in una grande, enorme, monolitica classe, che accede direttamente a NHibernate, brrrrr...) però può essere una buona sorgente per qualche idea.&lt;/p&gt; &lt;p&gt;Tanto per dirne una, mi è piaciuta la strutturazione del Data Access Layer che sfrutta la "trasversalità" di NHibernate: IUserDao espone solo i servizi specifici dell'utente (es. Autenticazione, GetByUsername), mentre i servizi generici (GetById, ListAll, ecc.ecc.) sono forniti da ICommonDao, che però avrei preferito sfruttasse i generics.&lt;/p&gt; &lt;p&gt;Magari se non avete nulla di interessante da leggere nel vostro feed aggregator, dateci un'occhiata!&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6bf9b668-6803-429a-9a38-86dfe1fe882f" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/Architettura" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://technorati.com/tags/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Castle%20Windsor" rel="tag"&gt;Castle Windsor&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/90010.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx</guid>
            <pubDate>Thu, 29 Nov 2007 13:12:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/11/29/un-buon-esempio-di-ioc-e-separation-of-concerns.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/90010.aspx</wfw:commentRss>
        </item>
        <item>
            <title>I pattern sono come le centurie di Nostradamus?</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/11/26/i-pattern-sono-come-le-centurie-di-nostradamus.aspx</link>
            <description>&lt;p&gt;Posso anche essere d'accordo (anzi, lo sono decisamente) con &lt;a href="http://blogs.ugidotnet.org/pape/archive/2007/11/26/ok-io-e-janky-non-siamo-daccordo.aspx"&gt;Andrea&lt;/a&gt; e &lt;a href="http://blogs.ugidotnet.org/dinoes/archive/2007/11/26/89942.aspx"&gt;Dino&lt;/a&gt;, ma solo fintanto che li consideriamo &lt;em&gt;&lt;font color="#ff0000"&gt;come una sorta di guida all'implementazione&lt;/font&gt;&lt;/em&gt;. Allora sì che devo prendere spunto (giusto il paragone con le centurie), interpretandone il significato e adattandone però la struttura al mio problema specifico, magari disconstandomene fino ad avere un qualcosa di diverso. Che però &lt;em&gt;&lt;font color="#ff0000"&gt;non è più il pattern da cui sono partito&lt;/font&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Credo sia un concetto parecchio importante, e che richieda pertanto un certo rigore nelle definizioni e nel significato che si attribuisce loro. Perché? Perché i pattern hanno anche un'altra importante funzionalità, oltre quella di darci una traccia (più o meno aderente alla realtà) ad un problema ricorrente. Ossia quello di rappresentare *un dizionario*, un linguaggio che permetta a due progettisti di capirsi al volo quando parlano di un aspetto del design. E allora in questo caso la definizione dovrebbe essere precisa, talmente precisa da essere sicuri che se io propongo ad Andrea di soddisfare quel requisito tramite un &lt;a href="http://martinfowler.com/eaaCatalog/layerSupertype.html"&gt;Layer Supertype&lt;/a&gt;, o di utilizzare un &lt;a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html"&gt;DTO&lt;/a&gt; per esporre i dati all'esterno, o di gestire la persistenza tramite un &lt;a href="http://martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record&lt;/a&gt; (BUAHAH ecco che ci siamo), io e Andrea dobbiamo capirci al volo, senza nessun rischio di &lt;em&gt;misunderstanding&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;E allora dire che questo framework "è quasi un Active Record" mi fa storcere un po' il naso, perché o lo è o non lo è. Punto. &lt;/p&gt; &lt;p&gt;Tra l'altro, credo proprio che Linq To SQL sia un perfetto esempio di &lt;a href="http://martinfowler.com/eaaCatalog/dataMapper.html"&gt;DataMapper&lt;/a&gt;, anzi, di &lt;a href="http://martinfowler.com/eaaCatalog/metadataMapping.html"&gt;MetaData Mapper&lt;/a&gt;, e che di &lt;a href="http://martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record&lt;/a&gt; non abbia proprio nulla. Perché, visto che citiamo &lt;a href="http://martinfowler.com/"&gt;Fowler&lt;/a&gt;, allora lui stesso descrive &lt;a href="http://martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record&lt;/a&gt; come&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;My two cents...&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:3bcdb8cf-49fe-45c9-b871-7088e16f373d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/Architettura" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Pattern" rel="tag"&gt;Pattern&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Active%20Record" rel="tag"&gt;Active Record&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/89945.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/11/26/i-pattern-sono-come-le-centurie-di-nostradamus.aspx</guid>
            <pubDate>Mon, 26 Nov 2007 17:47:38 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/11/26/i-pattern-sono-come-le-centurie-di-nostradamus.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/89945.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WCF, DTO, Fatture e RapportinoMaker (TM)</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx</link>
            <description>&lt;p&gt;Volevo lasciare un commento &lt;a href="http://blog.vivendobyte.net/archive/2007/10/29/326.aspx"&gt;al post di Igor&lt;/a&gt;, poi ne è venuto fuori un papiro e allora è meglio scrivere qui.&lt;/p&gt; &lt;p&gt;A mio modo di vedere, c'è un errore di fondo nel concetto di DTO espresso in quel post. Un DTO, infatti, &lt;strong&gt;*NON*&lt;/strong&gt; deve né ereditare, né incapsulare l'oggetto che rappresenta; anzi... dirò di più: un DTO non deve avere alcuna relazione con l'entità (o le entità) di dominio che rappresenta, altrimenti non sarebbe un DTO!!&lt;/p&gt; &lt;p&gt;Cerco di spiegare meglio il concetto. Perché creo ed espongo un DTO? Una delle ragioni può essere che non voglio/posso esporre direttamente una mia entity di dominio. E allora che senso ha creare un DTO che la incapsula? o da cui eredita? Finirei comunque per esporla, no?&lt;/p&gt; &lt;p&gt;In realtà, il DTO &lt;a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html"&gt;ha un significato più ampio&lt;/a&gt;: è semplicemente un modo per codificare un particolare messaggio &lt;strong&gt;rappresentandolo&lt;/strong&gt; in forma di oggetto, e non necessariamente è mappato 1-1 con le entità di un domain model (diciamo pure che in generale, ha decisamente poco a che vedere con esse).&lt;/p&gt; &lt;p&gt;Nel caso di Igor, volendo creare un DTO per l'oggetto Fattura, probabilmente realizzerei qualcosa del genere:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:2009d44d-d780-444f-a9a4-5da7549b5d3d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="width:100%;background-color:#EEEEEE;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #999999;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;[DataContract]
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; FatturaDTO
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;{
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;  [DataMember]
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Numero;
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;  [DataMember]
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; DateTime Data;
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;  [DataMember]
&lt;/span&gt;&lt;span style="color: #999999;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; RagioneSocialeCliente
&lt;/span&gt;&lt;span style="color: #999999;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;  ...
&lt;/span&gt;&lt;span style="color: #999999;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(notare la proprietà RagioneSocialeCliente), magari con un costruttore che accetti un'istanza di "Fattura" e popoli i relativi field. Le stringone XML &lt;a href="http://blog.vivendobyte.net/archive/2007/10/25/318.aspx"&gt;di questo esempio di Igor&lt;/a&gt; sono anch'esse dei DTO, magari in senso lato (ma neanche troppo).&lt;/p&gt;
&lt;p&gt;BTW, sicuramente si tratta di un approccio dispendioso, che personalmente adotterei solo se ho vincoli che mi impongono una SOA rigorosa. Mi capita spesso, nel lavoro di tutti i giorni, di dover esporre servizi a client Java o PL/SQL, o magari di esporli e basta, senza sapere chi mai li invocherà, con in mano solo un documento di specifiche di forma da rispettare. E in quel caso allora è necessario specificare un insieme di messaggi che standardizzino il protocollo di comunicazione con i miei servizi e che restino immutabili anche a seguito di eventuali modifiche che un giorno farò al mio domain model. I DTO, per l'appunto.
&lt;/p&gt;&lt;p&gt;Molto spesso però - e questo mi sembra proprio il caso di Igor - la reale necessità non è quella di esporre servizi a terze parti, ma &lt;strong&gt;semplicemente quella di avere un'applicazione distribuita&lt;/strong&gt;, pur mantenendo stretto controllo di ciò che è in esecuzione sul client e sul server. Per dirla in parole povere, me ne frego dell'interoperabilità e non espongo nulla a nessuno, voglio solo avere la possibilità di interfacciarmi da remoto con una parte della mia applicazione.
&lt;/p&gt;&lt;p&gt;Ottimo. Beh, in questi casi non vedo controindicazioni ad utilizzare direttamente le entity del domain model, se possibile. Dirò di più, magari voglio avere gli stessi tipi di oggetti sia sul client che sul server. Di SOA non ha neanche la più lontana parvenza, ma chi se ne frega? non mi serve avere un'architettura orientata ai servizi.&lt;/p&gt;
&lt;p&gt;Allora, in uno scenario simile può essere utile anche questo tip.&lt;br /&gt;&lt;a href="http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx"&gt;http://blogs.ugidotnet.org/Crad/archive/2007/04/02/74468.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ah... last but not least: invece che con DataContract, i servizi WCF funzionano benone anche con entity marcate semplicemente come Serializable. &lt;img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /&gt;
&lt;/p&gt;&lt;p&gt; &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:ecdf522c-9671-48ce-8b9c-00ec6b1021db" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/DTO" rel="tag"&gt;DTO&lt;/a&gt;, &lt;a href="http://technorati.com/tags/SOA" rel="tag"&gt;SOA&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/89286.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx</guid>
            <pubDate>Tue, 30 Oct 2007 01:33:30 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/10/30/wcf-dto-fatture-e-rapportinomaker-tm.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/89286.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Per quelli che... &amp;quot;l'architettura &amp;egrave; solo frizzi e lazzi&amp;quot;</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/03/16/73124.aspx</link>
            <description>&lt;p&gt;In questi giorni, insieme al mio team, ci stiamo cimentando nella realizzazione di un progetto piuttosto complesso in tempi (quando mai) a dir poco strettissimi. Si tratta di una condizione piuttosto estrema, tant'è che non è stato affatto facile far digerire a tutti l'idea di pensare ad un'architettura ben fatta, di separare i compiti tra i vari layer e di scrivere gli unit test.&lt;/p&gt; &lt;p&gt;Alla fine per fortuna il buon senso ha prevalso, e la nostra applicazione, ora come ora&lt;/p&gt; &lt;ol&gt; &lt;li&gt;ha il suo bel domain model  &lt;/li&gt;&lt;li&gt;è suddivisa in layer, tutti disaccoppiati ed esposti solo tramite interfacce  &lt;/li&gt;&lt;li&gt;fa uso di inversion of control, dependency injection e aspect oriented programming&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Quali vantaggi *PRATICI* e quale *RISPARMIO* (in termini di fatica e tempo) ci ha portato l'evitare di buttar giù la testa e mettersi a scrivere codice?&lt;/p&gt; &lt;p&gt;Sul punto 1 non mi soffermo, è oramai piuttosto noto come il modello tabellare mal si adatti a variazioni dell'informazione da trattare, cose che capitano spesso, soprattutto nelle fasi iniziali di un progetto, in cui i requisiti non sono ancora perfettamente definiti.&lt;/p&gt; &lt;p&gt;Passiamo al punto 2. La suddivisione in layer ha consentito di dividere il nostro team in diversi gruppi, che si sono concentrati separatamente nello sviluppo delle rispettive librerie. &lt;/p&gt; &lt;p&gt;Il team del DAL ha lavorato a stretto contatto con il responsabile dello sviluppo su DB Oracle. &lt;/p&gt; &lt;p&gt;Il team del BL, proprio grazie al fatto che il DAL è esposto tramite interfacce, ha potuto sviluppare la libreria di propria competenza &lt;strong&gt;senza che il DAL esistesse&lt;/strong&gt;, facendo uso di Test Driven Development e di mocking.&lt;/p&gt; &lt;p&gt;Idem dicasi per il team che si è dedicato al presentation layer.&lt;/p&gt; &lt;p&gt;Prima conclusione: &lt;strong&gt;creare interazioni loosely-coupled consente di parallelizzare il processo di sviluppo&lt;/strong&gt;. Con librerie fortemente accoppiate, sarebbe stato un dannato incubo.&lt;/p&gt; &lt;p&gt;Punto 3. Lo scenario di deploy sarà sicuramente distribuito: il database non sarà direttamente esposto al web server su cui girerà la nostra applicazione, che dovrà pertanto interagirvi tramite web service. Ottimo. Peccato che attualmente&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Non c'è tempo per realizzarli  &lt;/li&gt;&lt;li&gt;Ancora non è chiaro quale tecnologia utilizzare (WCF? WSE? ASP.NET?)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Ma a noi cosa ci frega? I layer comunicano esclusivamente tramite interfacce, quindi posso usare tutta la inversion of control che voglio: al momento, in cui non ci sono risorse da dedicare allo sviluppo dei web service, espongo direttamente le librerie che connettono i vari strati; domani, quando ci sarà più calma, realizzerò lo strato di trasporto, che esporrò tramite le stesse interfacce ed in maniera del tutto trasparente ai layer utilizzatori: ma se oggi per caricare un utente scrivo&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e2da88c2-7a3d-4c38-963b-7ded831ea064" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="width:100%;;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000;"&gt;IUserServices userServices &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServicesRepository.Get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IUserServices&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
User currentUser &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; userServices.LoadById(userId);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;domani, quando dentro quello IUserServices ci sarà un proxy che si collegherà ad un web service, il mio codice continuerà ad essere perfettamente valido e funzionante. Senza una buona architettura, avrei dovuto realizzare un qualcosa che in seguito avrei dovuto smontare completamente e ricreare da zero.&lt;/p&gt;
&lt;p&gt;Ma ancora... il fatto di disaccoppiare gli strati applicativi mi consente di iniettare logica in maniera assolutamente pervasiva: fino ad oggi, leggere una entity da DB comportava la lettura di tutti gli oggetti associati. So che non è bello, è sicuramente uno spreco di risorse leggere informazioni che probabilmente non saranno mai utilizzate. Ma sono convinto che, dal momento in cui si decide di utilizzare un domain model, bisogna *&lt;strong&gt;garantirne&lt;/strong&gt;* la navigabilità: lo  sviluppatore, dopo aver caricato l'oggetto User, deve poterne esplorare le dipendenze quando e come vuole. Ma allora? siamo alle solite... una buona architettura mi ha consentito, con un pizzico di AOP, di implementare un LazyLoad che fa perfettamente al nostro caso e che, meraviglia delle meraviglie, fa il paio con l'inversion of control del paragrafo sopra, funzionando senza incertezze sia con lo strato di servizi "in presa diretta" che con nello scenario distribuito che oggi non c'è ma che domani si dovrà necessariamente realizzare (perché è da specifiche). Prossimamente, riuscirò ad introdurre un sistema di log automatico, quantomeno per chiamate ai servizi e errori, e una cache.&lt;/p&gt;
&lt;p&gt;Seconda conclusione: l'uso di IoC, DI e AOP ci consente di &lt;strong&gt;impostare il lavoro di progettazione e sviluppo su "ciò che sappiamo che un giorno ci sarà"&lt;/strong&gt;, senza badare a quel poco che c'è oggi. Le funzionalità aggiuntive potranno essere realizzate in maniera del tutto indipendente, man mano che si libereranno risorse, e poi introdotte a costo quasi nullo all'interno di quanto già esistente.&lt;/p&gt;
&lt;p&gt;Ecco perché, da un paio d'anni a questa parte, la mia passione per questi argomenti è andata via via crescendo e perché sono assolutamente convinto, a dispetto di ciò che molti possono pensare, che una buona ingegnerizzazione del software consente di risparmiare *&lt;strong&gt;DA SUBITO&lt;/strong&gt;* (e non dalla fantomatica versione 2.0 che probabilmente non vedrà mai la luce) tempo, fatica e risorse umane, producendo un risultato qualitativamente con pochi eguali.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:72d3e046-abc7-43f5-9041-f7ca741f8049" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/Architettura" rel="tag"&gt;Architettura&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/73124.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/03/16/73124.aspx</guid>
            <pubDate>Fri, 16 Mar 2007 02:05:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/03/16/73124.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/73124.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Architecture Journal e le applicazioni modulari</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/01/29/69014.aspx</link>
            <description>&lt;p&gt;Considero &lt;a href="http://www.architecturejournal.net/"&gt;Architecture Journal&lt;/a&gt; una pubblicazione veramente di alto livello, che affronta argomenti complessi con una grande competenza. L'ultimo numero è dedicato alle Composite Application, con uno sguardo a ciò che le tecnologie Microsoft ci mettono a disposizione oggi (leggasi Office 2007, Smart Client Software Factory e Composite UI Application Block).&lt;/p&gt; &lt;p&gt;Per chi non fosse abbonato alla rivista cartacea, oltre l'ovvio consiglio di &lt;a href="https://www.msarchitecturejournal.com/default.aspx"&gt;rimediare a questa lacuna&lt;/a&gt; (è addirittura FREE!!),&amp;nbsp;l'invito è di tenere d'occhio &lt;a href="http://www.architecturejournal.net/2006/issue10/"&gt;questa pagina&lt;/a&gt;: attualmente son presenti solo due articoli, a breve verranno pubblicati anche quelli che restano.&lt;/p&gt; &lt;p&gt;Ciao :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/69014.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/01/29/69014.aspx</guid>
            <pubDate>Mon, 29 Jan 2007 12:40:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/01/29/69014.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/69014.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Stasera la chat sugli ORM</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx</link>
            <description>&lt;p&gt;Ancora grazie ad &lt;a href="http://blogs.ugidotnet.org/blogema/"&gt;Emanuele&lt;/a&gt; per aver pensato a questa iniziativa. Farò di tutto per non mancare, perché l'argomento mi appassiona tantissimo (oltre che essere di estrema attualità).&lt;/p&gt; &lt;p&gt;Appuntamento alle ore 21, le modalità di partecipazione sono descritte in &lt;a href="http://blogs.ugidotnet.org/BlogEma/archive/2007/01/08/65513.aspx"&gt;qui&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/67967.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx</guid>
            <pubDate>Mon, 22 Jan 2007 12:58:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2007/01/22/67967.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/67967.aspx</wfw:commentRss>
        </item>
        <item>
            <title>NHibernate e lo special case</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2006/11/20/NHibernate_SpecialCase.aspx</link>
            <description>&lt;p&gt;Come fare per utilizzare il pattern SpecialCase con NHibernate?&lt;/p&gt;
&lt;p&gt;C.p.l.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/55188.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2006/11/20/NHibernate_SpecialCase.aspx</guid>
            <pubDate>Mon, 20 Nov 2006 01:04:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2006/11/20/NHibernate_SpecialCase.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/55188.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Un articolo da incorniciare...</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2006/11/10/54410.aspx</link>
            <description>&lt;p&gt;...per farci le preghierine la sera. Già, quello di &lt;a href="http://www.ayende.com/"&gt;Ayende&lt;/a&gt; su &lt;a href="http://msdn2.microsoft.com/en-us/default.aspx"&gt;MSDN&lt;/a&gt; che trovate &lt;a href="http://msdn2.microsoft.com/en-us/library/aa973811.aspx"&gt;qui&lt;/a&gt;. Correte, leggetelo, rileggetelo, bevete un bicchier d'acqua e leggetelo un'altra volta.&lt;/p&gt; &lt;p&gt;Strepitoso.&lt;/p&gt; &lt;p&gt;Punto.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/54410.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2006/11/10/54410.aspx</guid>
            <pubDate>Fri, 10 Nov 2006 22:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2006/11/10/54410.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/54410.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Bell'articolo su Model View Presenter</title>
            <link>http://blogs.ugidotnet.org/crad/archive/2006/08/04/45904.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Il Model View Presenter è, tra i pattern relativi al 
presentation layer, quello&amp;nbsp;che in questo periodo mi intriga di più &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;, perché secondo me riesce a separare la 
logica di presentazione con la concreta implementazione dell'interfaccia in un 
modo molto più netto di quanto non accada con il "cugino" &lt;A title="" href="http://www.martinfowler.com/eaaCatalog/modelViewController.html" target="" name=""&gt;Model View Controller&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Perché dico questo? Perché 10 minuti fa, sul divano, stavo leggiucchiando &lt;A title="" href="http://msdn.microsoft.com/msdnmag/issues/06/08/default.aspx" target="" name=""&gt;l'ultimo MSDN Magazine&lt;/A&gt;&amp;nbsp;(o, meglio, l'ultimo che mi è 
arrivato) e mi sono imbattuto in un bell'articolo di Jean Paul Boodhoo e ho 
pensato di fare cosa gradita segnalandolo &lt;IMG height=19 src="http://www.imhoproject.org/files/occhiolino.gif" width=19 align=absMiddle border=0&gt;&amp;nbsp;Come sempre, è presente anche la 
versione online che potete trovare a &lt;A title="" href="http://msdn.microsoft.com/msdnmag/issues/06/08/DesignPatterns/default.aspx" target="" name=""&gt;questo link&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Ah, dimenticavo, la ciliegina sulla torta è che l'esempio proposto è tutto 
sviluppato in TDD.&lt;/P&gt;
&lt;P&gt;Se vi capita, dateci un'occhiata.&lt;/P&gt;

&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.3&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --&gt;
&lt;img src="http://blogs.ugidotnet.org/crad/aggbug/45904.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marco De Sanctis</dc:creator>
            <guid>http://blogs.ugidotnet.org/crad/archive/2006/08/04/45904.aspx</guid>
            <pubDate>Fri, 04 Aug 2006 22:47:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/crad/archive/2006/08/04/45904.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/crad/comments/commentRss/45904.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>