<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technisch ontwerp &#187; Bert Willems</title>
	<atom:link href="http://www.technischontwerp.nl/author/bert/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.technischontwerp.nl</link>
	<description>alles over het maken technische ontwerpen</description>
	<lastBuildDate>Thu, 14 Jan 2010 13:00:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pattern van de Week deel 5: Adapter – Design Pattern</title>
		<link>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-5-adapter-%e2%80%93-design-pattern/</link>
		<comments>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-5-adapter-%e2%80%93-design-pattern/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 13:00:13 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=153</guid>
		<description><![CDATA[Deze week bespreek ik een van mijn favoriete patterns: het Adapter pattern. Ik vond de volgende definitie van het woord adapter:
Aanpassingseenheid tussen twee systemen, meestal waarmee een toestel dat op laagspanning werkt ook op het lichtnet kan worden aangesloten.
Wat mij betreft is dit een prima definitie want het beschrijft exact wat dit patroon is: Aanpassingseenheid [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-155 alignright" title="adapter" src="http://www.technischontwerp.nl/wp-content/uploads/2010/01/adapter-150x150.jpg" alt="" width="150" height="150" />Deze week bespreek ik een van mijn favoriete patterns: het Adapter pattern. Ik vond de volgende definitie van het woord adapter:</p>
<blockquote><p>Aanpassingseenheid tussen twee systemen, meestal waarmee een toestel dat op laagspanning werkt ook op het lichtnet kan worden aangesloten.</p></blockquote>
<p>Wat mij betreft is dit een prima definitie want het beschrijft exact wat dit patroon is: Aanpassingseenheid tussen twee systemen.</p>
<p>Stel: ik heb interface A en klasse B. B implementeerd niet A en kan dus niet direct door clients van A gebruikt worden. Als dit wel wenselijk is dan kun je dit probleem oplossen met behulp van een Adapter: maak een nieuwe klasse C die interface A implementeerd en klasse B encapsuleerd. Implementeer de methods van interface A en map deze naar de geencapsuleerde instantie van B. Klaar! Je kunt nu op de plaatsen waar je interface A wilt hebben object B &#8216;adapten&#8217;.</p>
<p>Ik gebruik dit pattern in mijn eigen framework bijvoorbeeld om mijn applicatie context geschikt te maken voor gebruik in de Apache Velocity template engine.</p>
<p>Kort en krachtig, net zoals als het Adapter patroon zelf.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-5-adapter-%e2%80%93-design-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nieuwe releases van Castle Project componenten</title>
		<link>http://www.technischontwerp.nl/2010/01/nieuwe-releases-van-castle-project-componenten/</link>
		<comments>http://www.technischontwerp.nl/2010/01/nieuwe-releases-van-castle-project-componenten/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 08:35:27 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Overig]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Castle Project]]></category>
		<category><![CDATA[MicroKernel]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[Nieuws]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=158</guid>
		<description><![CDATA[Deze week zijn er nieuwe releases vrijgegeven van een aantal componenten van het Castle Project framework. Het Castle Project is, zoals ze zelf zeggen:
Castle is an open source project for .net that  aspires to simplify the  development of enterprise and web applications.  Offering a set of tools (working together or independently) and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-160" title="Castle Project" src="http://www.technischontwerp.nl/wp-content/uploads/2010/01/castleproject-150x108.gif" alt="" width="150" height="108" />Deze week zijn er nieuwe releases vrijgegeven van een aantal componenten van het Castle Project framework. Het Castle Project is, zoals ze zelf zeggen:</p>
<blockquote><p><strong>Castle</strong> is an <strong>open source</strong> project for .net that  aspires to simplify the  development of enterprise and web applications.  Offering a set of tools (working together or independently) and integration  with others open source projects, <strong>Castle</strong> helps you get more done  with less code and in less time.</p></blockquote>
<p>Het bevat o.a. support voor een MVC web framework (MonoRail), dependency injection (MicroKernel, Windsor Container) &amp; een ORM mapper (ActiveRecord).</p>
<h3>Core 1.2</h3>
<p>Het hoofd component van het framework. In deze versie is het Email Sender component en de Logging service geintegreerd.</p>
<h3>MicroKernel/Windsor 2.1.1</h3>
<p>Dit is het dependency injection component van het Castle Framework. De nieuwe features zijn:</p>
<ul>
<li>Type forwarding</li>
<li>Support for lazy loading van components</li>
<li>Performance improvements</li>
</ul>
<h3>ActiveRecord 2.1</h3>
<p>Dit is het ORM component van het Castle Framework. De nieuwe features zijn:</p>
<ul>
<li>Bijgewerkt met versie 2.1.4 van NHibernate</li>
<li>ActiveRecord bepaald nu zelf op basis van het type wat de primary key generator moet zijn.</li>
<li>Support voor read-only properties, hiermee kun je door de database gegenereerde waardes in je object beschikbaar maken.</li>
</ul>
<h3>Bronnen:</h3>
<p><a href="http://kozmic.pl/archive/2010/01/12/castle-windsor-2.1-dynamic-proxy-2.2-and-more-released.aspx">http://kozmic.pl/archive/2010/01/12/castle-windsor-2.1-dynamic-proxy-2.2-and-more-released.aspx</a><br />
<a href="http://mortslikeus.blogspot.com/2010/01/activerecord-21-released.html"> http://mortslikeus.blogspot.com/2010/01/activerecord-21-released.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2010/01/nieuwe-releases-van-castle-project-componenten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pattern van de Week deel 4: Money &#8211; Patterns of Enterprise Application Architecture</title>
		<link>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-4-money-patterns-of-enterprise-application-architecture/</link>
		<comments>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-4-money-patterns-of-enterprise-application-architecture/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 20:06:13 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Enterprise Application Architecture]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=135</guid>
		<description><![CDATA[Allereest alle goede wensen voor dit nieuwe jaar! Laten we direct het belangrijkste onderwerp van 2010 bespreken: geld. Dit is wellicht wat kortzichtig en bekrompen echter heeft dit onderwerp menig architect in verlegenheid gebracht. Niet omdat het project duurder uitviel dan verwacht maar meer omdat de rol van geld (bedragen) binnen software architectuur wel eens [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-140" title="geld" src="http://www.technischontwerp.nl/wp-content/uploads/2010/01/money-150x150.jpg" alt="" width="150" height="150" />Allereest alle goede wensen voor dit nieuwe jaar! Laten we direct het belangrijkste onderwerp van 2010 bespreken: geld. Dit is wellicht wat kortzichtig en bekrompen echter heeft dit onderwerp menig architect in verlegenheid gebracht. Niet omdat het project duurder uitviel dan verwacht maar meer omdat de rol van geld (bedragen) binnen software architectuur wel eens onderschat wordt. Laten we de waarde van een bedrag maar opslaan in een decimal of floating point veld, we doen er verder toch niet zo veel mee. Fair enough.</p>
<p>Maar dan: de applicatie moet meer gaan rekenen met die bedragen: optellen, percentages en (hopelijk) vermenigvuldigen. Geen probleem: de meeste programmeertalen kunnen deze eenvoudige operaties al uitvoeren op primitives. So far, so good. Echter zijn deze berekeningen nu overal versplinterd in de codebase terug te vinden.</p>
<p>Nu de applicatie zo succesvol is dat er ook andere valuta dan de euro gebruikt gaan worden, gaat het jammerlijk mis: overal moeten bedragen omgerekend worden naar de ene valuta.Vervolgens moet er een bedrag bij opgeteld worden, waarna het resultaat weer terug omgerekend moet worden naar de begin valuta. Dit is natuurlijk vragen om problemen.</p>
<p>Er is echter een oplossing: het Money pattern zoals beschreven door Martin Fowler in zijn boek Patterns of Enterprise Application Architecture. En dit is werkelijk een schitterende oplossing met dank aan zijn eenvoud: maak een Money klasse die verantwoordelijk is voor het beheren van het bedrag, de valuta en het uitvoeren van berekeningen en transformaties van de ene valuta naar het andere. Er is nu een verantwoordelijke voor beheren van de kleintjes: de Money klasse. Heerlijk, ik wou dat mijn persoonlijke financiën ook zo makelijk te beheren waren.</p>
<p>Persoonlijk maak ik altijd gebruik van een Money klasse, ook in de meest eenvoudige applicaties omdat je maar nooit weet of het nodig zal zijn. In dit geval: better safe than sorry. Zijn jullie het hier mee eens? Of heb je een eigen oplossing? Plaats een reactie en deel je mening of ervaring!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2010/01/pattern-van-de-week-deel-4-money-patterns-of-enterprise-application-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern van de Week deel 3: Strategy – Design Pattern</title>
		<link>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-3-strategy-%e2%80%93-design-pattern/</link>
		<comments>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-3-strategy-%e2%80%93-design-pattern/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 09:17:33 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=130</guid>
		<description><![CDATA[Een beetje later dan gepland maar ook deze week laat ik weer een pattern de revue passeren. Deze week het Strategy pattern zoals beschreven bij de Gang of Four omdat het gewoon een heerlijk simpel pattern is.
Eigenlijk is het Strategy pattern het verbergen van de implementatie achter een interface. De interface definieert een methode en [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-132" title="strategy-pattern" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/strategy-150x150.jpg" alt="" width="150" height="150" />Een beetje later dan gepland maar ook deze week laat ik weer een pattern de revue passeren. Deze week het <strong>Strategy</strong> pattern zoals beschreven bij de Gang of Four omdat het gewoon een heerlijk simpel pattern is.</p>
<p>Eigenlijk is het Strategy pattern het verbergen van de implementatie achter een interface. De interface definieert een methode en de client maakt alleen gebruik van deze methode. Nu kun je verschillende implementaties maken van deze methode door een klasse te definieren die erft van de interface. De client weet dan niet meer welke implementatie er nu achter de interface zit: de implementaties zijn dus uitwisselbaar geworden. Deze &#8216;uitwisselbaarheid&#8217; is vooral krachtig in combinatie met dependency injection frameworks.</p>
<p>Ik gebruik het Strategy pattern vooral in het ontwerpen van mijn eigen framework, ik wil bepaalde delen kunnen vervangen zondat dat ik daar code voor hoef aan te passen.</p>
<p>Dat is het voor deze week. Iemand die hier iets aan toe wil voegen?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-3-strategy-%e2%80%93-design-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mono 2.6 en MonoDevelop 2.2 gereleased</title>
		<link>http://www.technischontwerp.nl/2009/12/mono-2-6-en-monodevelop-2-2-gereleased/</link>
		<comments>http://www.technischontwerp.nl/2009/12/mono-2-6-en-monodevelop-2-2-gereleased/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 11:06:25 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Overig]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[MonoDevelop]]></category>
		<category><![CDATA[Nieuws]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=116</guid>
		<description><![CDATA[
Eergisteren is de nieuwste versie van Mono gereleased. Het open source alternatief voor het Microsoft .NET framework is aangeland op versie 2.6. De kern van deze release is de debugger en cross platform.
De belangrijkste nieuwe features zijn:

Windows Communication Foundation subset zoals beschikbaar voor Silverlight 2.0
LINQ to SQL
De nieuwe debugger geintegreerd met MonoDevelop
Inclusief de door Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-122" title="mono project" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/mono-project-logo.png" alt="mono project" width="139" height="45" /></p>
<p>Eergisteren is de nieuwste versie van Mono gereleased. Het open source alternatief voor het Microsoft .NET framework is aangeland op versie 2.6. De kern van deze release is de debugger en cross platform.</p>
<p>De belangrijkste nieuwe features zijn:</p>
<ul>
<li>Windows Communication Foundation subset zoals beschikbaar voor Silverlight 2.0</li>
<li>LINQ to SQL</li>
<li>De nieuwe debugger geintegreerd met MonoDevelop</li>
<li>Inclusief de door Microsoft open source gemaakte versies van ASP.NET MVC, ASP.NET AJAX en de Dynamic Language Runtime</li>
<li>En natuurlijk zijn verbetering op het gebied van performance en compatibiliteit met de Microsoft .NET API</li>
</ul>
<p>Daarnaast is er een nieuwe versie van de populaire tegenhanger van Visual Studio gereleased: MonoDevelop 2.2. De belangrijkste features van deze nieuwe versie zijn:</p>
<ul>
<li>Ingebouwde debugger</li>
<li>Refactor mogelijkheden (Inline rename, extract method, sort usings, etc.)</li>
<li>Grafische interface is verbeterd</li>
<li>Support voor ASP.NET MVC en T4 ontwikkeling</li>
</ul>
<p>Het originele pers berich is te vinden op: <a title="Mono 2.6 and MonoDevelop 2.2 released" href="http://www.mono-project.com/news/archive/2009/Dec-15.html" target="_blank">http://www.mono-project.com/news/archive/2009/Dec-15.html</a></p>
<p>Zijn er al early adopters die hun mening willen delen? Plaats een reactie en laat het ons weten!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/mono-2-6-en-monodevelop-2-2-gereleased/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Naakte Guerilla SOAs</title>
		<link>http://www.technischontwerp.nl/2009/12/naakte-guerilla-soas/</link>
		<comments>http://www.technischontwerp.nl/2009/12/naakte-guerilla-soas/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 07:30:39 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Architectuur]]></category>
		<category><![CDATA[Enterprise Service Bus]]></category>
		<category><![CDATA[Service Oriented Architecture]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=55</guid>
		<description><![CDATA[Ok, dit is mischien de vreemdste titel in de Nederlandse blog historie, maar er zit een goed verhaal achter geinspireerd op een presentatie van Jim Webber, architect bij ThoughtWorks. Zijn hilarische relaas gaat over service georienteerde architecturen en de Enterprise Service Bus.
Zoals bij jullie bekend is een Service Oriented Architectuur grof gezegd het aan elkaar [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-105" title="bus chrashes into a wall" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/bus-crash-150x150.jpg" alt="bus chrashes into a wall" width="150" height="150" />Ok, dit is mischien de vreemdste titel in de Nederlandse blog historie, maar er zit een goed verhaal achter geinspireerd op een <a title="Jim Webber on &quot;Guerilla SOA&quot;" href="http://www.infoq.com/presentations/webber-guerilla-soa" target="_blank">presentatie van Jim Webber</a>, architect bij ThoughtWorks. Zijn hilarische relaas gaat over service georienteerde architecturen en de Enterprise Service Bus.</p>
<p>Zoals bij jullie bekend is een Service Oriented Architectuur grof gezegd het aan elkaar knopen van systemen. Dit levert traditioneel een spaghetti van verschillende oplossingen op: CSV exports, gedeelde databases en webservices. Overal moeten er datatransformaties gedaan worden en nieuwe endpoints gemaakt worden omdat het ene systeem een SOAP interface heeft maar het andere alleen maar met CSV om kan gaan.</p>
<p>Wat doet een wel denkende object georienteerde developer als dingen complex worden? Juist, encapsuleren. Deze oplossing heet Enterprise Service Bus. De ESB is een grote doos waarin je al je spaghetti kunt verstoppen zodat niemand het meer ziet. Een beetje workflow om het geheel op smaak te brengen en iedereen (de business) is happy.</p>
<p>Eind goed, al goed? Niet volgens Jim Webber. Hij stelt dat je nu vast zit aan de leverancier van de ESB oplossingen en dat het uitbreiden van de ESB een kostbare operatie is. Wat er dan meestal gebeurd is het volgende: Zij (de business) willen weer eens wat anders en dit mag natuurlijk niets kosten omdat de return of investment onduidelijk is. Wat doe je dan? Je maakt een prototype buiten de ESB om met de uitdrukkelijke boodschap dat dit tijdelijk is. Iedereen (de business) blij: alles werkt zoals ze willen en het was ook nog goedkoop.</p>
<p><span id="more-55"></span></p>
<p>Stop de pers! Deze oplossing is tijdelijk! We hebben nog dagen nodig om deze prima werkende oplossing weg te gooien en opnieuw op te bouwen binnen de ESB. Zij: &#8220;Heren architect, het werkt toch?&#8221;. Probeer nu de business maar eens te overtuigen dat het echt nodig is om een goed werkende oplossing weg te gooien. Ik heb zo het vermoeden dat het niet gaat lukken. 5 jaar later heb je weer een grote doos spaghetti en daartussen zweeft nog ergens een dure complexe gehaktbal (ESB).</p>
<p>Ok, dus de ESB is niet de oplossing. Wat is het dan wel? Volgens Jim Webber was de initiele spaghetti zo erg nog niet omdat (letterlijke quote, don&#8217;t shoot the messenger):</p>
<blockquote><p>Business people have spaghetti for a brain. One day they want this, the next day something else.</p></blockquote>
<p>Zijn oplossing: kies voor de pragmatische aanpak. Bespaar je de moeite en kosten van een ESB en implementeer simpele SOAP services. Leg de verantwoordelijkheid van de data transformaties bij de service en client implementatie. Zorg ervoor dat de discussie op message niveau plaatsvind omdat de business ook op dit niveau zit. Hij vergelijkt deze aanpak met de guerilla taktiek terwijl de ESB meer weg heeft van een frontale aanval.</p>
<p>Wat vinden jullie? Zijn jullie het met Jim eens of verklaar je hem voor gek? Heeft de ESB jullie geholpen of zorgt het alleen maar voor problemen? Ik hoor graag jullie reactie!</p>
<p><strong>Bron:</strong><br />
<a title="Jim Webber on &quot;Guerilla SOA&quot;" href="http://www.infoq.com/presentations/webber-guerilla-soa" target="_blank">http://www.infoq.com/presentations/webber-guerilla-soa</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/naakte-guerilla-soas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern van de Week deel 2: Flyweight – Design Pattern</title>
		<link>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-2-flyweight-%e2%80%93-design-pattern/</link>
		<comments>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-2-flyweight-%e2%80%93-design-pattern/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 11:00:18 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Design Pattern]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=56</guid>
		<description><![CDATA[Welkom bij deze tweede post in de reeks over patterns die wereldwijd toegepast worden bij het ontwerpen van software. Deze week behandel ik het Flyweight pattern zoals vast gelegd door de fameuze Gang of Four.
Het Flyweight pattern komt van pas wanneer je een groot aantal objecten verwacht die hetzelde zijn. Het meest tot de verbeelding [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-63 alignleft" title="Zo licht als een veertje" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/veertje-150x150.jpg" alt="Zo licht als een veertje" width="150" height="150" />Welkom bij deze tweede post in de reeks over patterns die wereldwijd toegepast worden bij het ontwerpen van software. Deze week behandel ik het <strong>Flyweight</strong> pattern zoals vast gelegd door de fameuze <a title="Erich Gamma, Richard Helm, Ralph Johnson &amp; John Vlissides" href="http://en.wikipedia.org/wiki/Gang_of_four" target="_blank">Gang of Four</a>.</p>
<p>Het Flyweight pattern komt van pas wanneer je een groot aantal objecten verwacht die hetzelde zijn. Het meest tot de verbeelding sprekende voorbeeld is een tekst editor applicatie. Stel dat  er voor elke individuel teken in deze post een apart object aangemaakt zou moeten. Ik heb het niet geteld maar ik vermoed dat de letter E het vaakst voorkomt. Het zou natuurlijk zonde zijn om over elke letter E geheugen te reserveren omdat ze allemaal hetzelde zijn.</p>
<p><span id="more-56"></span></p>
<p>Hoe werkt het Flyweight pattern? Eigenlijk heel erg simpel: implementeer een <strong>Factory</strong> klasse die verantwoordelijk is voor het instantieren van objecten om deze vervolgens te cachen. Wanneer de client code de Factory om een soortgelijk object vraagd geeft deze het reeds geinstantieerde object terug uit de cache in plaats van een nieuw object te instantieren. De Factory klasse werkt dus als volgt:</p>
<pre><strong>Pseudocode</strong>
if (flyweightCache[parameters] exists)
   return existing flyweight
else
   new flyweight(parameters)
   add flyweight to cache
   return flyweight</pre>
<p>Zoals je ziet fungeert de Factory klasse in dit pattern als cache zonder dat de client code hier van af weet. De Factory klasse kun je zo intelligent maken als nodig is door bijvoorbeeld sommige object die echt vaak opgevraagd worden uit de cache te serveren, terwijl andere object wel elke keer geinstantieerd worden. Ook kan de Factory beoordelen of <em>parameters </em>er op duid dat het object een eigen unieke state heeft en dus niet uit de cache gehaald kan worden.</p>
<p>Wanneer is het Flyweight pattern geschikt? Als:</p>
<ul>
<li>De applicatie enorme hoeveelheden object gebruikt</li>
<li>Het geheugen vol loopt</li>
<li>De objecten hebben geen unieke state, of de state kan gemakkelijk ondergebracht worden in een ander minder gebruikt object</li>
<li>De applicatie niet afhangkelijk is van de identiteit van deze objecten</li>
</ul>
<p>Gerelateerde patterns:</p>
<ul>
<li><a title="Value Objects – Domain Driven Design" href="http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-1-value-objects-domain-driven-design/">Value Object &#8211; Domain Driven Design</a></li>
<li>Factory Pattern &#8211; Design Patterns</li>
</ul>
<p>Dat is het voor deze week. Ik hoop dat je nu begrijpt hoe het Flyweight pattern werkt. Heb je nog vragen of opmerkingen? Plaats gerust een reactie!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-2-flyweight-%e2%80%93-design-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Expliciete vs ImplicieteTijdstransities</title>
		<link>http://www.technischontwerp.nl/2009/12/expliciete-vs-impliciete-tijdstransities/</link>
		<comments>http://www.technischontwerp.nl/2009/12/expliciete-vs-impliciete-tijdstransities/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:00:17 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Overig]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=90</guid>
		<description><![CDATA[In veel applicaties worden de state van objecten bepaald door tijd. Neem bijvoorbeeld deze blogpost: ik heb deze post vrijdagmiddag geschreven maar pas op maandag laten publiceren. Dit heeft op maandag een verborgen (impliciete) state transitie veroorzaakt; namelijk van &#8217;scheduled&#8217; naar &#8216;published&#8217;.
Vaak een heeft een state transitie in het domein wel een betekenis. Ik wil [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-92" title="klok" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/klok-150x150.jpg" alt="klok" width="90" height="90" />In veel applicaties worden de state van objecten bepaald door tijd. Neem bijvoorbeeld deze blogpost: ik heb deze post vrijdagmiddag geschreven maar pas op maandag laten publiceren. Dit heeft op maandag een verborgen (impliciete) state transitie veroorzaakt; namelijk van &#8217;scheduled&#8217; naar &#8216;published&#8217;.</p>
<p>Vaak een heeft een state transitie in het domein wel een betekenis. Ik wil bijvoorbeeld zodra er een artikel gepubliceerd is ook een notificatie e-mail uit laten gaan. Je wilt in dit geval dat je applicatie met een expliciete state transitie.</p>
<p>De welbekende blogger Ayende Rahien heeft een mooi stuk over dit ontwerp geschreven op zijn <a title="Time transitions should be explicit" href="http://ayende.com/Blog/archive/2009/12/08/time-transitions-should-be-explicit.aspx" target="_blank">weblog</a>. Zijn stuk is zeker de moeite waard om te lezen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/expliciete-vs-impliciete-tijdstransities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern van de Week deel 1: Value Objects &#8211;  Domain Driven Design</title>
		<link>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-1-value-objects-domain-driven-design/</link>
		<comments>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-1-value-objects-domain-driven-design/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 08:20:24 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=31</guid>
		<description><![CDATA[




Welkom bij deze eerste post in de reeks over patterns die wereldwijd toegepast worden bij het ontwerpen van software. Deze week behandel ik het Value Object pattern zoals gebruikt in Domain Driven Design.
Veel objecten hebben geen conceptuele identiteit, ze beschrijven simpelweg een aspect van iets. Het is niet van belang of je nu instantie A [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_40" class="wp-caption alignright" style="width: 137px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-40" title="Value Object" src="http://www.technischontwerp.nl/wp-content/uploads/2009/12/value-object.jpg" alt="Value Object" width="127" height="85" /></dt>
</dl>
</div>
<p>Welkom bij deze eerste post in de reeks over patterns die wereldwijd toegepast worden bij het ontwerpen van software. Deze week behandel ik het <strong>Value Object</strong> pattern zoals gebruikt in <strong>Domain Driven Design</strong>.</p>
<p>Veel objecten hebben geen conceptuele identiteit, ze beschrijven simpelweg een aspect van iets. Het is niet van belang of je nu instantie A van dit object hebt of instantie B omdat de instanties conceptueel hetzelfde zijn. Laat ik eerst een voorbeeld geven om dit statement toe te lichten.</p>
<blockquote><p><strong>Voorbeeld</strong><br />
Ik word gevraagd om een applicatie te bouwen waarin een verzekeraar zijn klanten kan beheren. Stel dat er 2 personen zijn: A en B en stel dat deze personen op hetzelfde adres wonen. Dan kun je gerust een brief sturen bestemd voor persoon A naar het adres van persoon B. Ook kun je onmogelijk op basis van het adres een van deze personen identificeren. Het adres is en heeft dus geen identiteit.</p></blockquote>
<p>De conclusie dat een object geen eigen identiteit heeft kan grote gevolgen hebben voor bijvoorbeeld het database ontwerp waarvoor je kiest: Om ruimte te besparen zou je de adressen in een aparte tabel op kunnen slaan met een 1 op N relatie met de personen tabel. Of het instantieren van dit object, ik denk bijvoorbeeld meteen aan het <a title="Flyweight - Uitleg van dit Design pattern " href="http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-2-flyweight-%E2%80%93-design-pattern/"><strong>Flyweight</strong></a> pattern.<br />
<span id="more-31"></span><br />
Typische voorbeelden van Value Objects:</p>
<ul>
<li>Kleuren</li>
<li>Tekens en tekenreeksen</li>
<li>Afmetingen &amp; punten</li>
<li>Posities &amp; locaties</li>
<li>Stijlen</li>
</ul>
<p>Bovenstaande items zijn maar enkele voorbeelden en zijn bovendien niet in alle gevallen Value Objects. Stel je voor dat je een programma aan het maken bent voor het mengen van kleuren, dan zal kleur waarschijnlijk geen Value Object zijn.</p>
<p>Dit pattern heeft mij geholpen om objecten goed te kunnen classificeren wat er toe heeft geleid dat mijn ontwerpen eenvoudiger werden. Ook bij het bepalen welke (N)Hibernate mapping ik het beste kon gebruiken is dit een waardevol pattern.</p>
<p>Gerelateerde patterns:</p>
<ul>
<li><a title="Flyweight - Uitleg van dit Design pattern " href="../2009/12/pattern-van-de-week-deel-2-flyweight-%E2%80%93-design-pattern/">Flyweight pattern &#8211; Design Pattern</a></li>
</ul>
<p>Ik ben benieuwd wat jullie ervaringen zijn met het Value Object pattern. Heeft het jou geholpen? Of juist niet? Deel je ervaring door hier een reactie te plaatsen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/pattern-van-de-week-deel-1-value-objects-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Van UML naar Java, een praktijkvoorbeeld</title>
		<link>http://www.technischontwerp.nl/2009/12/van-uml-naar-java-een-praktijkvoorbeeld/</link>
		<comments>http://www.technischontwerp.nl/2009/12/van-uml-naar-java-een-praktijkvoorbeeld/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 13:31:07 +0000</pubDate>
		<dc:creator>Bert Willems</dc:creator>
				<category><![CDATA[Praktijk]]></category>
		<category><![CDATA[Architectuur]]></category>
		<category><![CDATA[Codegeneratie]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.technischontwerp.nl/?p=8</guid>
		<description><![CDATA[De afgelopen maanden heb ik samen met een aantal collega’s een vacatureportaal op het Liferay portal framework geïmplementeerd. Daarbij hebben we veelvuldig gebruik gemaakt van het genereren van Java code vanuit UML diagrammen en visa versa. Deze ervaring wil ik graag met jullie delen.
De opdracht was simpel: neem een bestaande webservice met vacatures, bedrijfsprofielen, zoekprofielen, [...]]]></description>
			<content:encoded><![CDATA[<p>De afgelopen maanden heb ik samen met een aantal collega’s een vacatureportaal op het <a title="Liferay" href="http://www.liferay.com" target="_blank">Liferay portal framework</a> geïmplementeerd. Daarbij hebben we veelvuldig gebruik gemaakt van het genereren van Java code vanuit UML diagrammen en visa versa. Deze ervaring wil ik graag met jullie delen.</p>
<p>De opdracht was simpel: neem een bestaande webservice met vacatures, bedrijfsprofielen, zoekprofielen, etc.. Ontwikkel op basis daarvan de <a title="Wat is een portlet?" href="http://en.wikipedia.org/wiki/Portlet" target="_blank">portlets</a> die tesamen de portal gaan vormen. De webservice was deels gedocumenteerd en er was een functioneel ontwerp gemaakt. Een goed startpunt voor een project.</p>
<h3>Technisch ontwerp</h3>
<p>We zijn begonnen met het maken van een technisch ontwerp omdat we de webservice eerst goed wilde begrijpen en omdat we de volgende zaken goed gescheiden wilden houden:</p>
<ul>
<li>De portlets</li>
<li>De webservice client implementatie</li>
</ul>
<p>We hebben het technisch ontwerp gemaakt met behulp van UML interactie-, klasse- en sequentiediagrammen. Dit hebben we gedaan in <a title="Sparkx Enterprise Architect" href="http://www.sparxsystems.com.au/products/ea/index.html" target="_blank">Sparkx Enterprise Architect</a>, naar mijn mening een van de beste UML tools.</p>
<h3><span id="more-8"></span>Lagen</h3>
<p>Voor het opdelen van de applicatie in verschillende lagen was onze belangrijkste doel om de webservice aanroepen uit de presentatie laag te houden. Om dit te realiseren zijn we tot een betrekkelijk eenvoudig 3 lagen model gekomen om de code functioneel op te delen:</p>
<ol>
<li>Service laag, deze laag is verantwoordelijk voor het aanroepen van de webservice.</li>
<li>Model laag, deze laag bevat het domein model van de applicatie.</li>
<li>Portlet/Presentatie laag, deze laag verzorgt de presentatie en de afhandeling van de gebruikers acties.</li>
</ol>
<p>Elke laag heeft een specifieke functie. Ik zal in de volgende secties de drie lagen bespreken.</p>
<h3>Model laag</h3>
<p>Deze laag bevat de domeinklassen welke bepaald werden door het domein model van de webservice. De klassen in deze laag zijn <a title="Wat is een POJO?" href="http://en.wikipedia.org/wiki/Plain_Old_Java_Object">POJO</a>s (Plain Old Java Objects) met de nodige mapping attributen om van XML (resultaat van een webservice aanroep) naar object de deserialiseren.</p>
<p>Daarnaast hebben we zelf een aantal klassen toegevoegd die fungeerden als <a title="Wat is een aggregate?" href="http://domaindrivendesign.org/node/88" target="_blank">aggregate</a>. Een aggregate is bedoel om het aantal relaties tussen objecten te beperken. Je kunt zeggen dat een aggregate als groep fungeert.</p>
<blockquote><p><strong>Voorbeeld</strong><br />
Om alle gegevens van een vacature op te halen moesten we een handvol webservice methoden aanroepen, dit is niet wat je in je presentatie code wilt terugzien. Dus hebben we een aggregate ontworpen die de resultaten van de diverse aanroepen bundelt.</p></blockquote>
<p>Door elke klasse te modeleren in UML en direct te voorzien van de juiste mapping attributen en documentatie hebben we veel tijd bespaard: een druk op de knop en de Java klassen in deze laag waren gegenereerd.</p>
<h3>Service laag</h3>
<p>We hebben de service laag in UML uitgedrukt in de vorm van een klassendiagram met daarin alleen de interfaces. We hebben er voor gekozen om de interfaces functioneel op te delen: De vacature service is verantwoordelijk voor het zoeken en ophalen van vacatures en de bedrijfsprofielenservice is verantwoordelijk voor het ophalen van de bedrijfsprofielen.</p>
<p>De belangrijkste taak van de service laag is het groeperen van de diverse webservice aanroepen en het bundelen van de resultaten in aggregate objecten, lees: het abstraheren van de webservice.</p>
<p>Bij het ontwerpen van de service interfaces hebben we uitgezocht welke webservice aanroepen elke methode moet gaan doen. De namen van de webservice aanroepen hebben we vastgelegd in de documentatie van de desbetreffende methode.</p>
<p>Nadat we de interface gemaakt hadden hebben we de implementatieklassen gedefinieerd puur ter generatie van de code.</p>
<h3>Portlet/Presentatie laag</h3>
<p>Deze laag is verantwoordelijk voor het presenteren van de informatie en het afhandelen van gebruikershandelingen. We hebben bij het maken van het technisch ontwerp vooral gelet op de gebruikershandelingen die plaats kunnen vinden, de verschillende states waarin een portlet zich kan bevinden en de aanroepen naar de service laag. Dit hebben we gedaan met behulp van state- en interactiediagrammen.</p>
<h3>Codegeneratie</h3>
<p>Zoals eerder aangegeven hebben we intensief gebruik gemaakt van code generatie van UML diagrammen naar Java code. Dit heeft ons tijdswinst opgeleverd omdat we niet meer handmatig alle klassen over hoefden te zetten, wat saai en foutgevoelig werk is.</p>
<p>Gedurende het project zijn we op een aantal punten afgeweken van het technisch ontwerp. Gelukkig ondersteund Sparkx Enterprise Architect de mogelijkheid om van de gegenereerde code te synchroniseren met de UML diagrammen waardoor het technisch ontwerp gemakkelijk bijgewerkt kon worden.</p>
<h3>Conclusie</h3>
<p>Door slim gebruikt te maken van codegeneratie en code synchronisatie is het mogelijk om een van een statisch document een meegroeiend ontwerp te maken. Daarnaast kun je door slim gebruik te maken van aggregates complexiteit verbergen.</p>
<p>Ik hoop dat dit artikel je geholpen heeft bij nadenken over de architectuur van je eigen applicaties. Heb je een andere visie of ben je het ergens mee oneens? Plaats dan een reactie!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.technischontwerp.nl/2009/12/van-uml-naar-java-een-praktijkvoorbeeld/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
