<?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>Sadek Drobi's Blog &#187; DOTNET</title>
	<atom:link href="http://sadekdrobi.com/category/dotnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://sadekdrobi.com</link>
	<description>Sadek Drobi</description>
	<lastBuildDate>Wed, 06 Jan 2010 23:11:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A monad in C# for simplifying WPF multi-threading for a more responsive GUI</title>
		<link>http://sadekdrobi.com/2009/06/26/a-monad-in-c-for-simplifying-wpf-multi-threading-for-a-more-responsive-gui/</link>
		<comments>http://sadekdrobi.com/2009/06/26/a-monad-in-c-for-simplifying-wpf-multi-threading-for-a-more-responsive-gui/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 19:13:40 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[Monads]]></category>
		<category><![CDATA[Thread]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/?p=563</guid>
		<description><![CDATA[
Code included here is over simplified for clarity, I hosted a better implementation code on CodePlex. These  modifications change strictly nothing for the client code and are only an implementation detail. I use a continuation rather than a delay, and I chose to design a custom continuation class rather than using a delegate because [...]]]></description>
			<content:encoded><![CDATA[<div style="font-family: courier new; background: white; color: gray; font-size: 10pt">
<p>Code included here is over simplified for clarity, I hosted a better implementation code on <a href="http://viewmonad.codeplex.com/sourcecontrol/changeset/view/22890?projectName=viewmonad#447750">CodePlex</a>. These  modifications change strictly nothing for the client code and are only an implementation detail. I use a continuation rather than a delay, and I chose to design a custom continuation class rather than using a delegate because of a type system limitations.</p>
</div>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2008/12/dsc-2468.jpg"><img style="border-right-width: 0px; margin: 0px 15px 0px 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="DSC_2468" align="left" src="http://sadekdrobi.com/wp-content/uploads/2008/12/dsc-2468-thumb-196x300.jpg" width="279" height="426"></a>Most GUI frameworks, including Silverlight and WPF, are shipped with a fundamental problem: long use of the main thread causes the Window to blackout, and using different threads requires you to get your hands dirty with the Dispatcher stuff and freezable objects. Worse, you wont learn the necessity to do so until you get a surprise of &#8220;The calling thread cannot access this object because a different thread owns it.&#8221; exception when all what you were doing is to use available methods on an object that seemed you have access to, at lease it seemed until runtime! This post illustrates a solution based on Monads abstraction and LinQ syntax.<br />
<span id="more-563"></span></p>
<p>This is a problem you get often when applying Model View Presenter pattern [MVP]. There, your view (which is a WPF control) implements a contract IView that the presenter in its turn will use to extract values and then make operations on the view.</p>
<p>&nbsp;</p>
<p><em>interface ISayHello { string GetName(); Unit SayHello(string name); } </em></p>
<p><em>class MyLoginControl:Control,<strong>ISayHello </strong>{</em></p>
<p><em>//this interface gets implemented by the corresponding control as texboxes and a text area&#8230;</em></p>
<p><em>}</em></p>
<p>The problem appears when for doing any realistic responsive application, the presenter (representing business operations if you&#8217;d like) will have to run on a background thread to leave the main thread free for graphics rendering.</p>
<p>While working on a background thread, the presenter needs to access the view (having a reference to it through a contract) and there something wrong happen <strong>&#8220;The calling thread cannot access this object because a different thread owns it.&#8221;</strong> .&nbsp; </p>
<p>The problem here is simply that the view is giving quite a promise that it simply can not satisfy which is implementing the IView contract.</p>
<p>The view cannot satisfy the <em><strong>ISayHello </strong></em>contract under all circumstances, and not even under a commonly desirable condition (the presenter or business code running on another thread). This fact is simply not communicated through the type.</p>
<p>The solution I suggest to this problem that I implemented and employed in a production real world project is based on the LinQ syntax added to C# last year. In the solution I use two things: an extension method and a special type.</p>
<p>The type that I use is the monadic type (thanks to Wesdyer for his enlightening posts): <em><strong>View&lt;T&gt;</strong></em></p>
<p>So in my case my type will be View&lt;IView&gt; which means that what I am offering here is a a type that acts under some special circumstances as the Contract <em><strong>ISayHello</strong></em> . If I want for example to extract the name from the WPF control, I need to do something with the <strong><em><em><strong>View&lt;ISayHello&gt;</strong></em>.</em></strong>&nbsp;</p>
<h2>Using the View&lt;T&gt; Monad:</h2>
<p>And here comes the LinQ syntax for help. Having a reference to <em><strong>View&lt;ISayHello&gt;</strong></em>, the only way with which I can access the desired value or methods is using <strong>Linq</strong>:</p>
<p>Having the view contract: </p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 interface\cf0  \cf4 ISayHello\par ??\cf0     \{\par ??        \cf4 Unit\cf0  SayHello(\cf1 string\cf0  Name);\par ??        \cf1 string\cf0  GetName();\par ??    \}\par ??    }<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">interface</span> <span style="color: #2b91af">ISayHello</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">Unit</span> SayHello(<span style="color: blue">string</span> Name);</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">string</span> GetName();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp; } <a href="$image[43].png"></a>&nbsp;<a href="$image[22].png"></a> </p>
</div>
<p>I can extract a view monad that I can pass to the presenter as <em><strong>View&lt;ISayHello&gt;</strong></em>&nbsp;</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red43\green145\blue175;\red255\green255\blue255;\red0\green0\blue0;\red0\green0\blue255;}??\fs20 \cf1 View\cf0 &lt;\cf1 ISayHello\cf0 &gt; view = \cf4 this\cf0 .AsView&lt;\cf1 Window1\cf0 , \cf1 ISayHello\cf0 &gt;();}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: #2b91af">View</span>&lt;<span style="color: #2b91af">ISayHello</span>&gt; view = <span style="color: blue">this</span>.AsView&lt;<span style="color: #2b91af">Window1</span>, <span style="color: #2b91af">ISayHello</span>&gt;(); </p>
</div>
<p>note the type <em><strong>View&lt;ISayHello&gt;</strong></em> which is somehow useless without the LinQ syntax:</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;}??\fs20 (\cf3 from\cf0  v \cf3 in\cf0  view\par ??                \cf3 let\cf0  name = v.GetName()\par ??                \cf3 select\cf0  v.SayHello(name)).Do();}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>(<span style="color: blue">from</span> v <span style="color: blue">in</span> view</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;<span style="color: blue">let</span> name = v.GetName()</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;<span style="color: blue">select</span> v.SayHello(name)).Do();</p>
</div>
<p>and you can also use several contracts in the same expression:</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;}??\fs20 \cf1 from\cf0  v \cf1 in\cf0  view1\par ??                \cf1 from\cf0  v2 \cf1 in\cf0  view2}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">from</span> v <span style="color: blue">in</span> view1</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">from</span> v2 <span style="color: blue">in</span> view2</p>
<p style="margin: 0px">&nbsp;</p>
<p style="margin: 0px">&nbsp;</p>
</div>
<h2>Implementation of the View&lt;T&gt; Monad:</h2>
<p>&nbsp;</p>
<p>View&lt;T&gt; is not really special. It is just a Delay&lt;T&gt; which is a Func&lt;T&gt;. And the Select implementation is the same one for functions and is not special at all: </p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 delegate\cf0  R \cf4 View\cf0 &lt;R&gt;();}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">delegate</span> R <span style="color: #2b91af">View</span>&lt;R&gt;();</p>
</div>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 enum\cf0  \cf4 Unit\par ??\cf0     \{\par ??        Unit\par ??    \}\par ??    \cf1 public\cf0  \cf1 static\cf0  \cf1 class\cf0  \cf4 WPFMonadExtensions\par ??\cf0     \{\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 View\cf0 &lt;U&gt; SelectMany&lt;T, U&gt;(\cf1 this\cf0  \cf4 View\cf0 &lt;T&gt; m, \cf4 Func\cf0 &lt;T, \cf4 View\cf0 &lt;U&gt;&gt; k)\par ??        \{\par ??            \cf1 return\cf0  () =&gt; k(m())();\par ??        \}\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 View\cf0 &lt;U&gt; Select&lt;T, U&gt;(\cf1 this\cf0  \cf4 View\cf0 &lt;T&gt; m, \cf4 Func\cf0 &lt;T, U&gt; selector)\par ??        \{\par ??            \cf1 return\cf0  () =&gt; selector(m());\par ??        \}\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 View\cf0 &lt;V&gt; SelectMany&lt;T, U, V&gt;(\cf1 this\cf0  \cf4 View\cf0 &lt;T&gt; source, \cf4 Func\cf0 &lt;T, \cf4 View\cf0 &lt;U&gt;&gt; kSelector, \cf4 Func\cf0 &lt;T, U, V&gt; resultSelector)\par ??        \{\par ??            \cf1 return\cf0  () =&gt;\par ??                       \{\par ??                           \cf1 var\cf0  t = source();\par ??                           \cf1 var\cf0  u = kSelector(t)();\par ??                           \cf1 return\cf0  resultSelector(t, u);\par ??                       \};\par ??        \}\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 Unit\cf0  Do(\cf1 this\cf0  \cf4 View\cf0 &lt;\cf4 Unit\cf0 &gt; k)\par ??        \{\par ??            \cf1 return\cf0  k();\par ??        \}}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">enum</span> <span style="color: #2b91af">Unit</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unit</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">class</span> <span style="color: #2b91af">WPFMonadExtensions</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">View</span>&lt;U&gt; SelectMany&lt;T, U&gt;(<span style="color: blue">this</span> <span style="color: #2b91af">View</span>&lt;T&gt; m, <span style="color: #2b91af">Func</span>&lt;T, <span style="color: #2b91af">View</span>&lt;U&gt;&gt; k)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> () =&gt; k(m())();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">View</span>&lt;U&gt; Select&lt;T, U&gt;(<span style="color: blue">this</span> <span style="color: #2b91af">View</span>&lt;T&gt; m, <span style="color: #2b91af">Func</span>&lt;T, U&gt; selector)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> () =&gt; selector(m());</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">View</span>&lt;V&gt; SelectMany&lt;T, U, V&gt;(<span style="color: blue">this</span> <span style="color: #2b91af">View</span>&lt;T&gt; source, <span style="color: #2b91af">Func</span>&lt;T, <span style="color: #2b91af">View</span>&lt;U&gt;&gt; kSelector, <span style="color: #2b91af">Func</span>&lt;T, U, V&gt; resultSelector)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> () =&gt;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> t = source();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> u = kSelector(t)();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> resultSelector(t, u);</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">Unit</span> Do(<span style="color: blue">this</span> <span style="color: #2b91af">View</span>&lt;<span style="color: #2b91af">Unit</span>&gt; k)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> k();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>The fact that I am defining a new delegate type here (View&lt;T&gt;) is because we don&#8217;t have type synonyms is C#. And because of this I had to reimplement all the Select methods for this type. Of course all of that Monad plumping code is invisible and all the user needs to do is use the LinQ syntax.</p>
<p>The only specific part about the View monad, is the way you extract it. For Wpf for example the .AsView implementation looks like: </p>
<p>&nbsp;</p>
<p><!--<br />
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 static\cf0  \cf4 View\cf0 &lt;TView&gt; AsView&lt;TWPF, TView&gt;(\cf1 this\cf0  TWPF value) \cf1 where\cf0  TWPF : \cf4 UIElement\cf0 , TView\par ??        \{\par ??            \cf1 return\cf0  value.ToWpfMonad&lt;TWPF, TView&gt;();\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 View\cf0 &lt;Answer&gt; ToWpfMonad&lt;T, Answer&gt;(\cf1 this\cf0  T value)\par ??           \cf1 where\cf0  T : \cf4 UIElement\cf0 , Answer\par ??        \{\par ??            \cf1 return\cf0  () =&gt;\par ??            \{\par ??                Answer a = \cf1 default\cf0 (Answer);\par ??                value.Dispatcher.Invoke(\cf4 DispatcherPriority\cf0 .Normal, (\cf4 EventHandler\cf0 )((sender, e) =&gt;\par ??                \{\par ??                    a = value;\par ??                    \cf1 if\cf0  (a \cf1 is\cf0  \cf4 Freezable\cf0 )\par ??                    \{\par ??                        \cf1 var\cf0  result = ((\cf4 Freezable\cf0 )(\cf1 object\cf0 )a).Clone();\par ??                        a = (Answer)(\cf1 object\cf0 )result;\par ??                        result.Freeze();\par ??                    \}\par ??                \}), \cf1 null\cf0 , \cf1 null\cf0 );\par ??\par ??                \cf1 return\cf0  a;\par ??            \};\par ??        \}}<br />
--></p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">View</span>&lt;TView&gt; AsView&lt;TWPF, TView&gt;(<span style="color: blue">this</span> TWPF value) <span style="color: blue">where</span> TWPF : <span style="color: #2b91af">UIElement</span>, TView</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> value.ToWpfMonad&lt;TWPF, TView&gt;();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">View</span>&lt;Answer&gt; ToWpfMonad&lt;T, Answer&gt;(<span style="color: blue">this</span> T value)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">where</span> T : <span style="color: #2b91af">UIElement</span>, Answer</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> () =&gt;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Answer a = <span style="color: blue">default</span>(Answer);</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.Dispatcher.Invoke(<span style="color: #2b91af">DispatcherPriority</span>.Normal, (<span style="color: #2b91af">EventHandler</span>)((sender, e) =&gt;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = value;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (a <span style="color: blue">is</span> <span style="color: #2b91af">Freezable</span>)</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> result = ((<span style="color: #2b91af">Freezable</span>)(<span style="color: blue">object</span>)a).Clone();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = (Answer)(<span style="color: blue">object</span>)result;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.Freeze();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }), <span style="color: blue">null</span>, <span style="color: blue">null</span>);</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> a;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
</div>
<p>Which merely tells about how to execute the delay when applied.</p>
<p>This is the code responsible for calling on WPF windows using dispatcher and other plumping details. Again code here is simplified for clarity. In the same way one can implement an AsView extension method for Silverlight with no need to change the Select implementation. View&lt;T&gt; is a generic monad and contain nothing specific to GUI technology.</p>
<p>&nbsp;</p>
<h2>Conclusion</h2>
<p>The Monad generalization provides a good solution for WPF/Silverlight thread problem. The solution is barely about communicating through the type system the fact that WPF/Silverlight <em>controls</em> are special, and using LinQ expression to operate on them leaving the plumping (Dispatcher.Invoke, Freezable) to the monad library implementers. Also this frees the caller from thread logic that is specific to the implementation technology. </p>
<p>In my project I didn&#8217;t work much on the freezing/unfreezing of Wpf controls (copy them and extract them to other threads) as it actually wasn&#8217;t necessary for my project. However, I think that a proper implementation of .AsView for WPF/Silverlight that manages Freezable and nested Freezable objects copying would be very interesting and would complete the API.</p>
<p>PS: I decided to finish this draft quickly as I am not having enough time to finish properly. Please tolerate typos and don&#8217;t hesitate to ask questions.</p>
<p/>
<div style="font-family: courier new; background: white; color: red; font-size: 10pt">The running example with a better implementation that is rather based on continuations is hosted on <a href="http://viewmonad.codeplex.com/sourcecontrol/changeset/view/22890?projectName=viewmonad#447750">CodePlex</a></div>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/06/26/a-monad-in-c-for-simplifying-wpf-multi-threading-for-a-more-responsive-gui/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Abstraction for People: Configurations, Patterns, DSLs and Monads</title>
		<link>http://sadekdrobi.com/2009/03/29/abstraction-for-people-configurations-patterns-dsls-and-monads/</link>
		<comments>http://sadekdrobi.com/2009/03/29/abstraction-for-people-configurations-patterns-dsls-and-monads/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 23:10:53 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[Model Mismatch]]></category>
		<category><![CDATA[Paradigm Oriented Programming Language]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Useability]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/03/29/abstraction-for-people-configurations-patterns-dsls-and-monads/</guid>
		<description><![CDATA[

LinQ is often understood in terms of introducing a Domain Specific Language to work with data to C# and .Net in general. The fact is:it is not, and there is a considerable difference between LinQ syntax nature and a DSL. The problem is that DSL definition is blur enough to take anything interesting or cool [...]]]></description>
			<content:encoded><![CDATA[</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/03/dsc-2692a3.jpg"><img style="border-right-width: 0px; margin: 0px 20px 0px 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="DSC_2692a3" align="left" src="http://sadekdrobi.com/wp-content/uploads/2009/03/dsc-2692a3-thumb.jpg" width="222" height="327"></a></p>
<p>LinQ is often understood in terms of introducing a Domain Specific Language to work with data to C# and .Net in general. The fact is:it is not, and there is a considerable difference between LinQ syntax nature and a DSL. The problem is that DSL definition is blur enough to take anything interesting or cool under it!</p>
<p><span id="more-596"></span>
<p>Back to the beginning. When faced to doing software for a business that has some moving parts, a good practice is to make a generalization or an abstraction of the fixed part and express what is moving through some sort of configurations. That is in some respect what most of enterprise frameworks do when implementing the fixed part and letting you nicely only express what varies for your context. This way you are almost only concerned about your part since the framework itself is supposed to be steady and well abstracted and as a result implicit in your context. This experience hasn&#8217;t been nice enough when XML used to be involved. As someone that defends multi-paradigm design I could argue that XML can play a best fit in some contexts but this is out of the scope of this post. XML charset is not optimal for a lot of cases, so why not creating our own charset, and here comes DSLs.</p>
<p>Of course here I am only talking about the rise of DSLs in the enterprise and not the DSLs that FP been doing for ages, and I&#8217;ll get back to this one later.</p>
<p>Now using my favorite meta magical super dynamic language, I&#8217;d like to construct my customized embedded(or internal) domain specific language, and I&#8217;ll make my best to be English like/business like/ host language unlike to be really specific. And that is where my brains blocks! How can I get grasp of that thing, that &#8216;lil&#8217; language? It might be a personal problem I have because of the nature of my profession as a consultant: I switch contexts often, and&#8230; well I can only hope that it is 1:designed, 2: designed considering practices, rules and well established&#8230; did I say patterns?</p>
<p>&nbsp;</p>
<h3>P for Patterns :</h3>
<p>Another way of providing a solution to the problem of generality/variability is use a catalogue of non-formal generalization of recurring solutions to recurrent problems that provide a rich knowledge base of experience about tackling the kind of problem. Being of non-formal nature means that patterns aren&#8217;t provided as a framework but rather as a set of vocabulary and description that has its power in being adaptive&nbsp; and flexible. In my own experience, what I found particularly interesting when working with code that uses patterns is the way they communicate intent. If I find &#8220;Strategy&#8221; postfix I start searching for the other parts of the patterns and then start building on that. Providing this shared vocabulary helps me getting operational quite fast and help me scan code faster in a more &#8220;visual&#8221; way.</p>
<p>The good thing also about patterns is that I am still playing under the rules of my preferred hosting language. I know very well doing two very important things with it: combining and abstraction. A programming language is a set primitives together with a way to combine them and a mechanism for abstraction. What about my lil DSL? well it depends&#8230; Did I make sure to break any host language logic in there? Did I fight the intuitive nice &#8220;.&#8221;? Or did I decide that to implement my DSL for scratch? A programming language without means of abstraction results inevitably in long flat copy/paste configurations files and please don&#8217;t argue with me about their maintainability. What is the problem? The problem is that I am not a programming language designer, and to create a programming language no matter how simple and small it is, you need to have programming language design skills, so do you?</p>
<h3>Abstraction and Communication for People:</h3>
<p>Something that really drew my attention in functional programming languages like Haskell is their solid formal abstractions used for expressing computational patterns. These abstractions are packaged into a framework, and have a clear identity defined by a set of rules and are useable whenever semantics match. Take monads for example. It doesn&#8217;t matter if you are working with state, a database, the web, the screen or a robitic arm: you just use the do notation. The do notation in Haskell is a convenient way of working with a sound abstraction that is <a href="http://en.wikipedia.org/wiki/Monads_in_functional_programming">THE MONAD</a>. And all what you need to do for your framework is to verify that you satisfy the Monad laws and then you can safely use that syntax for it. This sharing of well identified semantics of the abstraction help developers reuse a well established mental model. LinQ syntax is the same, the dot &#8220;.&#8221; operator is the same, F#&#8217;s&nbsp; &#8220;|&gt;&#8221; operator is the same and examples are a lot. And I tend to prefer these kind of abstractions as they don&#8217;t sacrifice readability for developers for &#8220;readability&#8221; for users. I guess they have both the communicative property of Design Patterns yet they are formal and are offered as a concrete framework. Then of course you can name them DSLs, if you insist :) .</p>
<p>Now, if you are from the functional programming camp, and you have been doing embedded domain specific language using Lisp or Haskell for long time, then I apologize for wasting your time. I know you guys know best about doing abstractions, and you have lessons to tell if we&#8217;d only listen. And for those interested in some examples in EDSLs from the functional world, <a href="http://www.amazon.com/Haskell-School-Expression-Functional-Programming/dp/0521644089/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1238371080&amp;sr=1-1">Paul Hudak goes through the design of a language for reactive animation in his book</a>, <a href="http://augustss.blogspot.com/">Lennart Augustsson</a> discussed EDSLs in Haskell on his blog.</p>
<h3>Conclusion</h3>
<p>Though an attractive option of abstraction, DSLs trade off readability for developers for &#8220;potential&#8221; readability of users. Haskell monads, F#&#8217;s &#8220;|&gt;&#8221; operator and LinQ are examples of sound formal abstraction that can be offered as frameworks (code). These abstractions can save developers time being in a form of a recurring pattern that can be used in different contexts that match semantically, thus reusing developers&#8217; understanding of the abstraction&#8217;s mental model. </p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/03/29/abstraction-for-people-configurations-patterns-dsls-and-monads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erik Mejier: LinQ, Beyond List Comprehensions in C# and .Net</title>
		<link>http://sadekdrobi.com/2009/03/05/erik-mejier-linq-beyond-list-comprehensions-in-c-and-net/</link>
		<comments>http://sadekdrobi.com/2009/03/05/erik-mejier-linq-beyond-list-comprehensions-in-c-and-net/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 21:55:53 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[LinQ]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/03/05/erik-mejier-linq-beyond-list-comprehensions-in-c-and-net/</guid>
		<description><![CDATA[Erik Meijer talks about less known LINQ features, like meta programming, about the differences between functional languages and OO ones, asynchronous computation, and others.

http://www.infoq.com/interviews/LINQ-Erik-Meijer
]]></description>
			<content:encoded><![CDATA[<p>Erik Meijer talks about less known LINQ features, like meta programming, about the differences between functional languages and OO ones, asynchronous computation, and others.</p>
<p><span id="more-591"></span></p>
<p><a href="http://www.infoq.com/interviews/LINQ-Erik-Meijer">http://www.infoq.com/interviews/LINQ-Erik-Meijer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/03/05/erik-mejier-linq-beyond-list-comprehensions-in-c-and-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quiz:: SharpLight &#124;&gt; What does this do?</title>
		<link>http://sadekdrobi.com/2009/02/03/quiz-sharplight-what-does-this-do/</link>
		<comments>http://sadekdrobi.com/2009/02/03/quiz-sharplight-what-does-this-do/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 14:02:09 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[sharplight]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/02/03/quiz-sharplight-what-does-this-do/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/02/combination1.jpg"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="combination" src="http://sadekdrobi.com/wp-content/uploads/2009/02/combination-thumb1.jpg" width="627" height="105" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/02/03/quiz-sharplight-what-does-this-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quizz:: SharpLight &#124;&gt; What does this do?</title>
		<link>http://sadekdrobi.com/2009/01/19/quizz-sharplight-what-does-this-do/</link>
		<comments>http://sadekdrobi.com/2009/01/19/quizz-sharplight-what-does-this-do/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 10:40:58 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[sharplight]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/01/19/quizz-sharplight-what-does-this-do/</guid>
		<description><![CDATA[div &#60;&#60;   &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a &#34;sadekdrobi.com&#34;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;&#60; img &#34;http://is.gd/gqVX&#34;    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ++ &#34;my lil&#8217; friend&#34;
]]></description>
			<content:encoded><![CDATA[<p>div &lt;&lt;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a &quot;sadekdrobi.com&quot;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;&lt; img &quot;<a title="http://is.gd/gqVX" href="http://is.gd/gqVX">http://is.gd/gqVX</a>&quot;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ++ &quot;my lil&#8217; friend&quot;</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/01/19/quizz-sharplight-what-does-this-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who told Java Checked Exceptions were a Bad Idea?</title>
		<link>http://sadekdrobi.com/2009/01/04/who-told-java-checked-exceptions-were-a-bad-idea/</link>
		<comments>http://sadekdrobi.com/2009/01/04/who-told-java-checked-exceptions-were-a-bad-idea/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 00:50:22 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[Decipline]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/01/04/who-told-java-checked-exceptions-were-a-bad-idea/</guid>
		<description><![CDATA[
One of the few things that lack seriously, IMO, in C# is the power of Java checked exceptions. In Java world? things happen weirdly. Maybe it is a result of crowd intelligence and a bad side effect of open source. Often, people in J2EE world tend to believe the opposite. Anyway you see the effect [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/01/dsc-02851.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 15px 10px 0px; border-left: 0px; border-bottom: 0px" height="315" alt="DSC_0285" src="http://sadekdrobi.com/wp-content/uploads/2009/01/dsc-0285-thumb1.jpg" width="459" align="left" border="0"></a>
<p>One of the few things that lack seriously, IMO, in C# is the power of Java checked exceptions. In Java world? things happen weirdly. Maybe it is a result of <a href="http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds#Failures_of_crowd_intelligence">crowd intelligence</a> and a bad side effect of open source. Often, people in J2EE world tend to believe the opposite. Anyway you see the effect in most preferred frameworks (such as today&#8217;s popular ORMs and Containers) of wrapping checked Java exceptions and rethrowing them as runtime ones. </p>
<p><span id="more-569"></span></p>
<p>I guess offering runtime exceptions together with compile time ones did a hole in the Java type system, but this hole was left to discipline, in a way of giving the tools and letting smart enterprise programmers decide for the right tool for the job. Things turned to happen differently in the enterprise world.&nbsp; Programmers abused of this freedom of choice and mainstream frameworks designers decided to dismiss and bury one of the most interesting features of the Java type system.</p>
<p>Why do I like Java checked exceptions? Well simply because it saves me from surprises. And I tend not to like surprises much!</p>
<p>The funny thing is that, in my experience, it is mostly architects that dismiss Java checked exceptions whereas Compile time exceptions are a very good asset for cleaner and bug free architecture.</p>
<p>I just take a look at a &#8220;standard&#8221; DAO method that gets an entity</p>
<p>Customer getCustomer(CustomerId id);</p>
<p>This method lies! what if there is no connection? what if the Id is incorrect? The signature of the methods gives quite a promise that under all circumstances it will returns a Customer. Now for any architecture this is bad. It used to be better before some popular frameworks decided to completely omit it! Before? well I used to control my architecture better!</p>
<p>Before these &#8220;good practices&#8221; become mainstream, imposed in mainstream frameworks, It used to be often more predictable the return type a method has. For my example, the signature would tell me that the method will either return a customer OR throws a &#8220;Dao Exception&#8221;.</p>
<p>Customer getCustomer(CustomerId id) throws DaoException;</p>
<p>No surprise. Now when I use this method, I will certainly need to handle the case when the method will return something else than a Customer. Now of course, a Java &#8220;enterprise developer&#8221; could do one of to things:</p>
<p>1- Out of laziness or incompetence, keep rethrowing data access exceptions up until you&#8217;ll have to deal with it up in the GUI logic (where handling an infrastructure error does not often belong)</p>
<p>This often sounds for me the main argument for dismissing Java Compile Time Exceptions claiming that it is a &#8220;code boilerplate&#8221;. The thing is that you&#8217;ll have to deal with these exceptions once even when you turn them into runtime. The fact of wrapping them into runtime does not eliminate them (even if I wish it did). But having them as compile time will make easy to spot where a &#8220;bad&#8221; developer did not handle the exception correctly simply by following the signature and type system. Then the solution will be to wrap them into more business friendly, context meaningful Compile Time Exceptions that need to be handled. This way the contract communicated better the result of executing a piece of logic.</p>
<p>This turns to be as useful for &#8220;void&#8221; return type methods. With Compile Time Exception a method can simply communicate the fact that it will either return &#8220;void&#8221; or will throw an exception to be handled.</p>
<p>2- Out of laziness or incompetence, frustrated developers will start &#8220;catch&#8221;ing checked exception without rethrowing them.</p>
<p>This one is a result of the hole in the type system that is left intentionally to leave some place for flexibility relying on discipline. Nevertheless, and before the big favor of generous frameworks I mentioned earlier, this turned out to be an easy problem to spot. Most IDEs and code analyses tools can find easily empty catch clauses and warn me about them.</p>
<p>&nbsp;</p>
<p>I often get surprised of the limited use of Java language wealth in enterprise J2EE applications!</p>
<p>Good thing: C# and .Net are introducing checked exceptions together with other DbC stuff (like non null objects) in the next release. Sad thing: Java has Compile Time Exceptions since version 1, open source chose to unvalue them!</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/01/04/who-told-java-checked-exceptions-were-a-bad-idea/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>RefX:: ORMs, Relational Data, Mismatch, LinQ and DSLs</title>
		<link>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/</link>
		<comments>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 02:42:22 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile in the Enterprise]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[D90]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[Mapping]]></category>
		<category><![CDATA[Model Mismatch]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Polyglot Programming]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/</guid>
		<description><![CDATA[   
Having worked with several Object-Relational mapping frameworks in the last few years, I got to a point where I couldn&#8217;t justify their complexity in my project. We often talk about the mismatch between the database and the object worlds, and that is where ORMs are often stated and referenced for &#8220;bridging the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2008/11/raw000781.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="361" alt="Raw00078" src="http://sadekdrobi.com/wp-content/uploads/2008/11/raw00078-thumb1.jpg" width="534" border="0"></a> <a href="http://sadekdrobi.com/wp-content/uploads/2008/11/raw001701.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="379" alt="Raw00170" src="http://sadekdrobi.com/wp-content/uploads/2008/11/raw00170-thumb1.jpg" width="258" border="0"></a> <a href="http://sadekdrobi.com/wp-content/uploads/2008/11/dsc-01911.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="378" alt="DSC_0191" src="http://sadekdrobi.com/wp-content/uploads/2008/11/dsc-0191-thumb1.jpg" width="257" border="0"></a> </p>
<p>Having worked with several Object-Relational mapping frameworks in the last few years, I got to a point where I couldn&#8217;t justify their complexity in my project. We often talk about the mismatch between the database and the object worlds, and that is where ORMs are often stated and referenced for &#8220;bridging the gap&#8221;!</p>
<p>Well I prefer to call it lifting the gap, or highering the gap, to have it now between DAOs and the rest of the code than having it between database and code.But I wouldn&#8217;t call this in any way reducing the gap.</p>
<p><span id="more-538"></span></p>
<p>First thing to mention here, is that data structures are not evil. We often deal with XML data structure but we absolutely refuse to deal with relational data structures. The problem might be related to time, XML came with a whole arsenal of managed APIs that represent its model in a way that makes it more comfortable for you to manipulate these documents. All together with transformation APIs that made it a lot easier to fill your object model out of an XML. Relational data structure on the other hand did not have the luxury of standard APIs and representation models in mainstream languages, and that made dealing with a database request result so arbitrary (Datasets existed in .Net but they have been cursed heavily and has been forced out of the cool toolbox, do not know yet why!) .&nbsp; </p>
<p>In some way, I guess that the &#8220;mismatch&#8221; between Relational data structures and objects exists much similarly between XML and objects, however we didn&#8217;t think for so long of a doing a mapping between XML and object OXM? (no we are starting to do so, writing some XML to map XML to objects!).</p>
<p>With the experience I had with mapping technologies, I can say that they do not solve the problem for me. They merely add yet another useless level of abstraction where your domain types look nothing like relational data structures, but yet nothing like your target domain model! They have gone a half way, and now its your turn to poison your application with a lot of absurd ORM code trying to stretch this bridge to reduce the gap&#8230; </p>
<p>Geeks love talking about intrusivty of an ORMs and compare level of intrusivty in different terms. Intrusivty is much more than the lack of an interface or methods to implement in your domain objects. I guess I am ok to deal with that kind of intrusivity. However all ORMs I tried do not give me the opportunity to express my domain model in the way I would like to. I have to deal with notions of Lazy Loading, Attached/Detached entities, Entity sets, ids, back fields and a lot of other things that I don&#8217;t want to appear in my model and that make the resulting code so ugly and complex that I don&#8217;t wish to visit soon.</p>
<p>As Bob Martin said before, we are missing the opportunity to do oop, I would enforce and say we are missing the opportunity to model at all. And I guess we have gone too far with ORMs and it is time to go back to the basics, in the same way we have done after the EJB great abstraction.</p>
<p>It is very contradictory, while we are so excited about DSLs and the goodness they can potentially bring to enterprise development that results in a declarative semanticful style of programming, we can&#8217;t help but to engage all of our means in trying to bury SQL (and effective, semanticful, declarative powerful domain specific language) behind a dumb API to &#8220;abstract database access&#8221;! I guess we got to chose one strategy, either we keep SQL and we&nbsp; keep marketing DSLs or we hope for a new advanced GPL compiler that will hide all of this in the same way modern languages did with garbage collection, concurrency and synchronization.</p>
<p>Since I am not yet a compiler writer, and I aint got around an effective way of integrating database in mainstream languages (there is actually a very productive in memory database on Haskell that worth trying), I decide to keep the DSL, and to work with them without the need to hide them, but rather to get a better tooling to help converting between difference data structures.</p>
<p>I guess you&#8217;ve guessed it by now. For me LinQ is the mid-term solution for the data structure mismatch. No not LinQ to sql, nor Ado.Net entities (they are helpful and we might use them but lets focus on the solution). LinQ is a very productive tool that halps effectively transform anything to anything in few lines of code. I mean that I can still use powerful SQL to get data effeciently and then convert them with one line of LinQ into the destination data structure. No abstraction leak, less complexity: Use the right tool where it applies. </p>
<p>So what I would actually do is to use a framework that will execute my SQL or SQL like query on the database and get me the records in much the same way they are in the database,Much in the same way Active Record gets you records as they are in the database. No useless efforts from the framework to bend the data to make it look untruthfully like the destination model.&nbsp; I guess I know better my domain model, and with this better tooling I can get it done with no problem.</p>
<p>&nbsp;</p>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f663d4e1-de43-4d9c-9f89-7b45ec5b5a86" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Mots clÃ©s Technorati : <a href="http://technorati.com/tags/mapping" rel="tag">mapping</a>,<a href="http://technorati.com/tags/orm" rel="tag">orm</a>,<a href="http://technorati.com/tags/linq" rel="tag">linq</a>,<a href="http://technorati.com/tags/mismatch" rel="tag">mismatch</a>,<a href="http://technorati.com/tags/relational.%20data%20structure" rel="tag">relational. data structure</a>,<a href="http://technorati.com/tags/abstraction" rel="tag">abstraction</a>,<a href="http://technorati.com/tags/domain%20model" rel="tag">domain model</a>,<a href="http://technorati.com/tags/deseign" rel="tag">deseign</a></div>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ted Neward on Present and Past Languages</title>
		<link>http://sadekdrobi.com/2008/10/28/ted-neward-on-present-and-past-languages/</link>
		<comments>http://sadekdrobi.com/2008/10/28/ted-neward-on-present-and-past-languages/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 13:28:58 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[Polyglot Programming]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/10/28/ted-neward-on-present-and-past-languages/</guid>
		<description><![CDATA[This is an interview I did at QCon with Ted Neward. Talking to Ted was very interesting even though arguing with him turned to be not easy at all :)
]]></description>
			<content:encoded><![CDATA[<p>This is <a href="http://www.infoq.com/interviews/Languages-Ted-Neward">an interview I did at QCon with Ted Neward</a>. Talking to <a href="http://blogs.tedneward.com/">Ted</a> was very interesting even though arguing with him turned to be not easy at all :)</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/10/28/ted-neward-on-present-and-past-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>And you get all the VM libraries for free! Is it actually what I want when I switch languages?</title>
		<link>http://sadekdrobi.com/2008/06/01/and-you-get-all-the-vm-libraries-for-free-is-it-actually-what-i-want-when-i-switch-languages/</link>
		<comments>http://sadekdrobi.com/2008/06/01/and-you-get-all-the-vm-libraries-for-free-is-it-actually-what-i-want-when-i-switch-languages/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 22:50:22 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[Decipline]]></category>
		<category><![CDATA[F#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Marketing Promises]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[Multi-languages projects]]></category>
		<category><![CDATA[Mutability]]></category>
		<category><![CDATA[Polyglot Programming]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/06/01/and-you-get-all-the-vm-libraries-for-free-is-it-actually-what-i-want-when-i-switch-languages/</guid>
		<description><![CDATA[ So it is getting more and more interesting. A vast number of languages available. And they are even available on your favorite platform. So you may not need anymore to beg for a process of changing a deployment environment to change your programming tools. It is all changing, and you may now start thinking [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2008/06/dsc-0459.jpg"><img height="359" width="247" src="http://sadekdrobi.com/wp-content/uploads/2008/06/dsc-0459-thumb.jpg" align="left" alt="DSC_0459" border="0" style="margin: 0px 20px 0px 0px; border: 0px" /></a> So it is getting more and more interesting. A vast number of languages available. And they are even available on your favorite platform. So you may not need anymore to beg for a process of changing a deployment environment to change your programming tools. It is all changing, and you may now start thinking about what language or paradigm suits best the domain or even the sub domain you are trying to model.</p>
<p>Everyday we hear about languages implementations on the JVM or the CLR. Every language has its own taste and semantics. All of these implementations try the best to satisfy an important second promise which is leveraging the preexisting platform libraries and giving an easy access to them from within that language. So on the CLR you get a promise of an easy access to all the .NET framework, and from Java, well, to the J2EE enormous libraries.</p>
<p><strong>Well designed .Net libraries might be bad designed F# libraries</strong></p>
<p>Some days ago I was trying to solve a small problem using F# (a new member to the .Net family). The reason I chose F# for this problem is the functional paradigm, my specific problem was easier to model using functional paradigm than any other paradigm. What I noticed while using F# is how easy it was to access the large .Net libraries, but I also noticed how can that potentially affect my way of programming. As I already mentioned the reason I chose F# was its semantics, I realized that .Net don&#8217;t talk F# and to access it I had to program with its semantics: imperatively, with a command like style almost dropping the expression oriented style that was one of the reasons I chose the language for!</p>
<p>Worse, this drew my attention to how this promise of 100% integrity with the preexisting libraries can affect the language design and implementation. Looking at implementations of popular languages like Ruby and Python on the JVM/CLR one can notice concepts that have almost forced in the languages (like attributes and signatures) . I guess these additions add noise to the language and to the code written with them, but that leads to an important question: How languages should communicate in a multilingual project? And what and where should be the seams when communicating between them?</p>
<p><strong>Some libraries and frameworks are not even necessary for other languages, some just don&#8217;t fit, and some need to be wrapped and adapted for the new language</strong></p>
<p>Before trying to think how to communicate between languages, I need to think about what is the kind of libraries I need for the new language. I mean of course it might be technically possible to use Spring and Hibernate when programming JRuby. But in case it is your first choice then, I guess you might be missing the point. There are a lot of frameworks and libraries that have been constructed because of limitations of the language. That is why you need to think twice before just accessing a foreign library because it might be supported natively by your language of choice or its supporting libraries.</p>
<p>Nonetheless , there are some necessary libraries that just don&#8217;t exist in your language of choice, and it would be kind of nice to have the painless access to them. But on the other hand, and as stated previously, these libraries don&#8217;t talk your language. It is somehow senseless, for instance, to specify type parameters while accessing strongly typed APIs from a dynamic language like Ruby, or say implementing strategies or writing 10 lines of imperative code for configuring a mutable object from a functional programming language like F#.</p>
<p>Some of these necessary APIs can be adapted for the target language. So in this case our issue is solvable by wrapping these well thought mature APIs to make them fit better in the target language paradigm. This can be done using abstractions while leaving other unnecessary details behind like state or type casting. This makes them less intrusive on your paradigm or language. Some libraries&#8217;s paradigm, however, is impossible to hide, and in this case you either need an equivalent library for your language, or you need to think carefully about your modules and boundaries to be able to use different libraries with different paradigms without one module being intrusive on another.</p>
<p><strong>Understanding properties and semantics of each used language is the key to a better integration and communication</strong></p>
<p>Each programming language is built and designed based on some theories, principles and concepts. Understanding these does not only help you in your decision of language choice, but this also helps you identifying where and how languages should be communicating. So for example modules written with functional programming languages can be imagined as stateless services that take an input and yield an output, modules written using OOP as holding the state, and modules written with configuration languages place some global, most probably immutable, variables into the environment. This thinking also helps defining barriers between modules to identify when the scope of one language ends for the starting edge of another.</p>
<p><strong>Finally</strong></p>
<p>In this post I tried to draw attention to a hairy, in my view, promise we get from language specification implementers of a seamless integration with existing libraries and frameworks. I guess in the no-fit case, the seam will be in your code and it will obscure it and add noise to your language rather than nicely being abstracted behind a foreign API wrapper. Proper design is instrumental for a non intrusive integration. Properties of each of the used language and frameworks should be considered.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/06/01/and-you-get-all-the-vm-libraries-for-free-is-it-actually-what-i-want-when-i-switch-languages/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Transactions are not automatic! Logs neither&#8230;</title>
		<link>http://sadekdrobi.com/2007/05/27/transactions-are-not-automatic-logs-neither/</link>
		<comments>http://sadekdrobi.com/2007/05/27/transactions-are-not-automatic-logs-neither/#comments</comments>
		<pubDate>Sun, 27 May 2007 20:12:24 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/05/27/transactions-are-not-automatic-logs-neither/</guid>
		<description><![CDATA[
As Aspect Oriented Programming is getting more and more known, aÂ lot of wrongÂ usages appear.Â Surprisingly, I&#8217;ve seen common agreementÂ among J2ee/.net architects for applying it in their application architectures.
First of all, Aspects are not only about the Spring&#8217;sÂ  code injection by interception. Even if it looks like interesting, this style of AOP use can be misapplied. One [...]]]></description>
			<content:encoded><![CDATA[<p><a atomicselection="true" href="http://sadekdrobi.com/wp-content/uploads/2007/06/windowslivewritertransactionsarenotautomaticlogsneither-137dbsadek000119.jpg"><img border="0" width="482" src="http://sadekdrobi.com/wp-content/uploads/2007/06/windowslivewritertransactionsarenotautomaticlogsneither-137dbsadek0001-thumb17.jpg" height="236" style="border-width: 0px" /></a></p>
<p>As Aspect Oriented Programming is getting more and more known, aÂ lot of wrongÂ usages appear.Â Surprisingly, I&#8217;ve seen common agreementÂ among J2ee/.net architects for applying it in their application architectures.</p>
<p>First of all, Aspects are not only about the Spring&#8217;sÂ  code injection by interception. Even if it looks like interesting, this style of AOP use can be misapplied. One of these misapplications is in transactions. I ve heard it a lot, &#8220;All my services are transactions&#8221; or &#8220;All methods that end with service are transactions&#8221; and worse &#8220;all of this package (assembly) is transactional!&#8221;</p>
<p>Transactions are a part of business logic, they should be explicit in the code, and they should belong toÂ whatever layer they need to belong to. Transactions are <strong>not</strong> automatic, and cant be applied as an aspect of a wholeÂ layer or as an architecture decision.</p>
<p>Yet applying them as <em>Aspects</em> (Aspect) <em>Attributes</em> or <em>Tags </em>is explicit, but they should not be exclusive to somewhere in the architecture, THEY ARE NOT A PART OF THE ARCHITECTURE!</p>
<p>I like the .Net&#8217;s implementation of TransactionScope in <em>System.Transactions. </em>It fits rather good to the functional meaning of transactions. I still prefer to have a moreÂ explicit code that expresses and treats them. After all, EBay is Transactionless (talking about database technical transactions) and Amazon doesn&#8217;t do any Distributed Transactions! That confirms that transactions should be treated as businessÂ  notions rather than technical.</p>
<p>I guess it wont be very intresting for readers ifÂ I introduce an <em>aspect</em> for loggin all my events and ideasÂ to this weblog! Even if it would be much eaiser for me :) Beleive me, that would be floody!</p>
<div class="redditbutton"><script type="text/javascript">reddit_url = 'http://sadekdrobi.com/2007/05/27/transactions-are-not-automatic-logs-neither/';</script><script src="http://reddit.com/button.js?t=2" type="text/javascript"></script></div>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/05/27/transactions-are-not-automatic-logs-neither/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
