<?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>Udi Dahan - The Software Simplist &#187; AOP</title>
	<atom:link href="http://www.udidahan.com/category/aop/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.udidahan.com</link>
	<description>Enterprise Development Expert &#38; SOA Specialist</description>
	<lastBuildDate>Sun, 08 Jan 2012 12:45:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Logging &#8211; The Smart Way</title>
		<link>http://www.udidahan.com/2008/08/01/logging-the-smart-way/</link>
		<comments>http://www.udidahan.com/2008/08/01/logging-the-smart-way/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 13:07:20 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Logging]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/2008/08/01/logging-the-smart-way/</guid>
		<description><![CDATA[Don&#8217;t.
Not in applicative code anyway.
This follows up on Ayende&#8217;s post about the AOP way.
Now, I have nothing against AOP but some developers are leery of it.
In broader terms, all logging goes in framework-level code. For smart clients, one really good place to put logging is in your Command infrastructure &#8211; every time a command is [...]]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t.</p>
<p>Not in applicative code anyway.</p>
<p>This follows up on Ayende&#8217;s post about the <a href="http://ayende.com/Blog/archive/2008/07/31/Logging--the-AOP-way.aspx">AOP way</a>.</p>
<p>Now, I have nothing against AOP but some developers are leery of it.</p>
<p>In broader terms, all logging goes in framework-level code. For smart clients, one really good place to put logging is in your Command infrastructure &#8211; every time a command is invoked, log it and the args. For data access, well, any decent O/R Mapper has a lot of logging already, just use it. For communication, ditto. Funny that just last week this was one of the major bits of feedback I gave in a code review.</p>
<h4>The Important Part <a href="http://www.udidahan.com/wp-content/uploads/image34.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 10px 10px; border-left: 0px; border-bottom: 0px" height="204" alt="image" src="http://www.udidahan.com/wp-content/uploads/image-thumb30.png" width="244" align="right" border="0"></a> </h4>
<p>Logging is useful for developers to find out <em>why</em> a system isn&#8217;t working correctly.</p>
<p>It is terrible for knowing <em>that</em> a system isn&#8217;t working correctly.</p>
<p>If you&#8217;re entire exception management strategy is &#8220;write it to the log&#8221;, how will an admin know that something&#8217;s wrong? Did you remember to configure your logging library that errors (and maybe warnings too) should be pushed out to a monitoring system? Do you have a monitoring system?</p>
<p>And if the admins don&#8217;t know anything&#8217;s wrong, they won&#8217;t know they need to increase the fidelity of the logs, will they? Are you planning on providing training for your admins telling them this (and all the other things they need to know)? Or maybe this will all be set up as an automatic script?</p>
<h4>An Agile Digression</h4>
<p>I hope all that&#8217;s on your agile (&#8221;we can ship at the end of every 2 week iteration&#8221;) product backlog (pardon my cynicism). I hope it&#8217;s at least something that you&#8217;re looking at per release and feeding the relevant features into your iterations. Yes, there&#8217;s project work to do (writing training manuals) that isn&#8217;t &#8220;development&#8221; that needs to be handled; if you don&#8217;t timebox it into the same iterations, it won&#8217;t get done.</p>
<p>Now, back to you&#8217;re regularly schedule logging&#8230;</p>
<h4>Things Logging Doesn&#8217;t Address<a href="http://www.udidahan.com/wp-content/uploads/image35.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 10px 10px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://www.udidahan.com/wp-content/uploads/image-thumb31.png" width="140" align="right" border="0"></a> </h4>
<p>Logging is a mildly useless tool for pinpointing <em>where</em> in the system the source of a problem is.</p>
<blockquote><p>&#8220;I know the entity isn&#8217;t in the database. I can see that. I want to know <em>why</em> it isn&#8217;t there.&#8221;</p>
</blockquote>
<p>Sure, if you had every SQL statement logged you could figure these sorts of things out out. Of course, performance-wise, you wouldn&#8217;t put the system into production like that. In which case, the delete statement wouldn&#8217;t have been logged leaving you with precious little information to solve the root cause.</p>
<p>Also consider that the more logging you do, the more crap you&#8217;ll have to sift through to find the proverbial needle. Developers often don&#8217;t think twice about increasing the amount of <strike>crap</strike> logs they generate&#8230;</p>
<h4>The Real Problem</h4>
<p>The real problem is that developers think too much about logging and not <strike>at all</strike> nearly enough about designing the system in ways that it&#8217;ll be <strike>easy</strike> possible to answer questions like those above without having to know exactly how the system is built. One of the reasons that developers should care about this is that it&#8217;ll decrease the number of times they need to get up at 3:00 am to answer those questions.</p>
<h4>A Path to the Solution<a href="http://www.udidahan.com/wp-content/uploads/image36.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 10px 10px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://www.udidahan.com/wp-content/uploads/image-thumb32.png" width="184" align="right" border="0"></a> </h4>
<p>Now, if you had some kind of business activity monitoring (BAM) capability in your system, an admin could do a simple search/query [WHEN entity DELETED] and find out answers to the questions above, find out the time that the relevant activities occurred, figure out what the problem is on their own, and maybe even fix it &#8211; especially if it has to do with some esoteric configuration variable.Regardless of whether you buy a BAM tool or roll what you need yourself, you need to understand what about the system needs to be monitored. That&#8217;s a very different thought-process to go through than &#8220;should we log this? Yeah, sure, why not.&#8221;</p>
<p>It&#8217;s called &#8220;Design for Operations&#8221;.</p>
<p>Take a holistic perspective on exception management, logging, monitoring, etc. Think about questions like those above and then analyse your use of the relevant tools in that context. Think about all the different kinds of users of the information that&#8217;s going to be generated and how quickly their going to need to act on that information. Admins in the data-center in the middle of a crisis are going to have different needs than developers analysing logs on their machine. Think about:</p>
<ul>
<li>How will the administrator know that a server has been configured properly?</li>
<li>If the system is feeling slow, how can the administrator know which server/process is to blame?</li>
<ul>
<li>So that maybe they can scale out that part of the system.</li>
</ul>
</ul>
<h4>In Closing<a href="http://www.udidahan.com/wp-content/uploads/image37.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 10px 10px; border-left: 0px; border-bottom: 0px" height="162" alt="image" src="http://www.udidahan.com/wp-content/uploads/image-thumb33.png" width="162" align="right" border="0"></a> </h4>
<p>It&#8217;s a mindset. </p>
<p>It takes time to make the shift.</p>
<p>It takes more time to bring the development process to this kind of maturity (god, I hate that word).</p>
<p>Writing exceptions to the log is not a strategy.</p>
<p>At the very best, its a tactic.</p>
<p>What&#8217;s your strategy?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2008/08/01/logging-the-smart-way/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Eureka! AOP is the final piece of the multi-threaded smart client puzzle</title>
		<link>http://www.udidahan.com/2007/12/07/eureka-aop-is-the-final-piece-of-the-multi-threaded-smart-client-puzzle/</link>
		<comments>http://www.udidahan.com/2007/12/07/eureka-aop-is-the-final-piece-of-the-multi-threaded-smart-client-puzzle/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 23:01:50 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[NServiceBus]]></category>
		<category><![CDATA[Smart Client]]></category>
		<category><![CDATA[Threading]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/12/07/eureka-aop-is-the-final-piece-of-the-multi-threaded-smart-client-puzzle/</guid>
		<description><![CDATA[If you&#8217;ve read my recent post on the threading issues I&#8217;ve been dealing with in Smart Client Applications, then you&#8217;re probably beginning to get the picture that its fairly complex. To tell you the truth, it is. And up until this point I haven&#8217;t been able to find anything that&#8217;ll help &#8211; and that includes [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve read my recent post on the <a href="http://udidahan.weblogs.us/2007/12/06/object-builder-the-place-to-fix-system-wide-threading-bugs/">threading issues I&#8217;ve been dealing with in Smart Client Applications</a>, then you&#8217;re probably beginning to get the picture that its fairly complex. To tell you the truth, it is. And up until this point I haven&#8217;t been able to find anything that&#8217;ll help &#8211; and that includes the CAB/SCSF. But yesterday I had my epiphany. The answer was in AOP.</p>
<p>You see, the main problem that I hadn&#8217;t been able to solve was that in order for the code to be thread-safe, you had to make sure that no code in the views would/could change entity data. One solution is not to use data-binding, which sucks, but isn&#8217;t enough to be sure. Another solution is to have all supervising-controllers clone an entity before they give it to a view. Even if you could possibly code review every line of those classes, the new guy (or old guy who forgot) will, by accident, write one new line of code that could pass an entity to a view without cloning it first. That&#8217;s not a very sustainable solution.</p>
<p>This thing has been bothering me for a couple of months now and I hadn&#8217;t found a way around it. Until yesterday, like I said. I was talking to somebody about threading stuff, and somehow my unconscience lobbed me this thought about AOP. Now I&#8217;m not the sharpest pencil in the pack, but I know to listen when my unconscience &#8220;speaks&#8221;.</p>
<p>So I set about going over what I knew about AOP &#8211; interceptors, advisors, advice, introductions, etc, etc. And then it dawned on me. I could intercept all calls to any object that implemented IView, check the parameters of those calls, and if they implemented IEntity, to clone them before passing them through.</p>
<p>&lt;Homer-style WOOHOO /&gt;</p>
<p>The great thing is that developers don&#8217;t need to remember to clone entities &#8211; it happens automatically. The even greater thing is that this will lead developers to writing the correct kind of interaction between their views and supervising controllers.</p>
<p>Together with <a href="http://www.nServiceBus.com">nServiceBus</a>, this is going to make the extremely difficult problem of writing thread-safe smart clients possible. </p>
<p>I&#8217;ve never made use of AOP in a framework before so I&#8217;d like to get the broader community&#8217;s feedback on this before incorporating this in production. I&#8217;ve spoken with some serious AOP folks who have allayed most of my uncertainties, but I&#8217;d like to hear more. Anyway, here&#8217;s the <a href="http://udidahan.weblogs.us/wp-content/uploads/aoptest.zip">proof of concept</a> (that makes use of <a href="http://www.springframework.net">Spring</a>). </p>
<p>If this turns out to be a viable solution, I think we&#8217;ll have a solid environment for building a software factory on top of. That is something that I&#8217;m really excited about. In this multi-core future (present) that is upon us, multi-threading on the client is pretty much a necessity. We need a way to get things safe and stable by default without requiring a member of the CLR team to hold our hand.</p>
<p>Anybody who&#8217;s interested in helping, drop a comment below.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/12/07/eureka-aop-is-the-final-piece-of-the-multi-threaded-smart-client-puzzle/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Architecture, Business Rules, and Aspects, oh my !</title>
		<link>http://www.udidahan.com/2003/11/14/architecture-business-rules-and-aspects-oh-my/</link>
		<comments>http://www.udidahan.com/2003/11/14/architecture-business-rules-and-aspects-oh-my/#comments</comments>
		<pubDate>Fri, 14 Nov 2003 19:07:42 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Business Rules]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/8</guid>
		<description><![CDATA[<p>I've been reading a lot from the <a href="http://www.agilemanagement.net/Articles/Weblog/blog.html">agile management</a> blog lately, and I came upon <a href="http://www.agilemanagement.net/Articles/Weblog/BusinessRulesinAspects.html">this entry</a> about implementing business rules with aspects. If you haven't yet read <a href="http://www.agilemanagement.net/Articles/Weblog/FeaturedBlogEntries/BusinessRulesObjectModeli.html">this previous entry</a> about the division of the system architecture not only along system lines, but also along "risk of change" lines, then I suggest you read it first.</p>

<p>First of all, I would like both developers and managers to read the previous entry because of its profound meaning. We CAN and should separate different parts of the system having differing levels of risk. Once again, <a href="http://udidahan.weblogs.us/archives/000374.html">"3-tier architectures"</a> don't address these issues.</p>


<p>So, if we are dividing the architecture along risk lines as well, then obviously the UI would be the riskiest - having the highest probability to change - over the life of the project. However, business rules are often considered quite stable. Why ? Because their time-line of change is often stretched out over many project life-times - rather obvious really, business rules deal with the business, not the project. During development of the project we are often given the requirements in such a way that it is difficult to know what is domain knowledge and what is a business rule. It takes effort to separate out what are the business rules - what has changed in the past, and what will change in the future.</p>

<p>For example, in an academic project I performed some time ago, I was given a set of requirements including:</p>


<p>
1. A student can register to a given course once in a semester.<BR>
2. A student can register to a project in a semester.<BR>
</p>

<p>Which is the business rule, which is the domain ? In this case (1) is the domain, and (2) is the rule - "a project" meaning "only one project" as I later found out. This rule changed sometime after my second alpha to "A student can register to only one project <u>alone</u> in a semester, but several projects in the same semester as long as they have a partner for each of those projects."</p>


<p>As it is apparent, I, as a developer, have to take into account these risk/change factors and change my architecture accordingly. Ever since that project I have always created a business rules layer separate from the infamous "BL" ( Business Logic ). </p>


<p>Now, getting to the issue of implemeting using aspects. I am a big proponent of AOP, however I often find alternative implementations to be more desirable. Most of the examples given for the use of AOP including logging, transactions, security and others that can be made part of a framework, as .Net has done in many cases. Many have pushed Java's superiority because of AspectJ, and although .Net doesn't have an Aspect.Net yet ( although various developments are under way ), I have yet to miss it. <a href="http://staff.newtelligence.net/clemensv/Default.aspx">Clemens Vasters</a> has done some truly incredible stuff in the use of attributes in .Net for implementing AOP stuff. I've always thought that attributes should be used that way.</p>


<p>I find that there is one basic flaw in the conclusion to using aspects for connecting business rules to systems. The entire white paper is <a href="http://ssel.vub.ac.be/Members/Maja/papers/Cibran-BIS03.pdf">here</a>.  ( Yes, its a pdf unfortunately - only good for print really, <a href="http://www.useit.com/alertbox/20030714.html">Jakob Nielsen thinks so too</a>. ) The basic premise is that I'm building an entire system in an OO manner, which I've stopped doing some time ago for <a href="http://udidahan.weblogs.us/archives/000374.html">these</a> reasons. Clemens has great insights on this as well, see them <a href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=6868ac5d-16cc-4863-bde4-11f663691c76">here</a>.</p>


<p>When using an SOA, your UI, or any other system needing services for that matter, will be sending messages to the guts of your system - the "BL" for you hardcore 3-tier-guys. Let's call the thing receiving messages in this case the Gateway. All the gateway does is receive messages ( like "Register student number 12 to course number 15 in semester 21" ) and pass them on to the appropriate handler. The word "handler" hear is used like in the term "event handler" for a reason: </p>


<p><u><b>The receipt of a message is an event.</b></u></p>


<p>In the white-paper the authors refer to these events as a problem that has to be dealt with. Why ? Because when working in an object oriented fashion, you would have to intercept the call to:</p>


<p>new Student(12).RegisterToProject(93);</p>


<p>in order to handle the event, ie check/activate a business rule. Aspects are great for this sort of thing. However, when working in a service-oriented fashion, you would send a message of type "RegisterStudentToProject" with the parameters StudentID and ProjectID as above. No need to intercept any call since it has to first go through the gateway. The gateway would then pass the message to the business rules engine which would then find and activate the appropriate rules before and after the actual call to register the student. The rules engine does something like this:</p>


<p>
If ( ActivateBusinessRulesForMessageAndReturnTrueIfCanMakeCall(myMessage) )<BR>
{<BR>
&#160;&#160;MakeCallForMessage(myMessage);<BR>
&#160;&#160;ActivateBusinessRulesAfterMessage(myMessage);<BR>
}</p>


<p>The business rules themeselves are implemented in a separate layer than the engine. The mapping between rules and messages is also done in a layer separate from both the engine and the rules. Once we have a layer for each of these, we have architecturally separated the parts that change more often in the system from the rest of it.</p>

<p>One can also move to a more dynamic model. One in which you define a language for defining rules, and the mapping to messages as well. Thus, changes could be made by changing a configuration file instead of recompiling any part of the system.</p>

<p>Note that when you have lots of rules and the order for activating them matters, you should move to a commercial rule engine instead of implementing your own. You'll see that performance becomes an issue as the number of rules increases.</p>

<p>I hope that I've managed to introduce yet another strength of the SOA over the pure OO paradigm.</p>

<p>Tell me what you think !</p>

<p>Where does the SOA fall short ? <BR>
Where does the OOA beat the SOA ?<BR>
Am I full of it ?</p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading a lot from the <A href="http://www.agilemanagement.net/Articles/Weblog/blog.html">agile management</A> blog lately, and I came upon <A href="http://www.agilemanagement.net/Articles/Weblog/BusinessRulesinAspects.html">this entry</A> about implementing business rules with aspects. If you haven&#8217;t yet read <A href="http://www.agilemanagement.net/Articles/Weblog/FeaturedBlogEntries/BusinessRulesObjectModeli.html">this previous entry</A> about the division of the system architecture not only along system lines, but also along &#8220;risk of change&#8221; lines, then I suggest you read it first. </p>
<p>First of all, I would like both developers and managers to read the previous entry because of its profound meaning. We CAN and should separate different parts of the system having differing levels of risk. Once again, <A href="http://udidahan.weblogs.us/archives/000374.html">&#8220;3-tier architectures&#8221;</A> don&#8217;t address these issues. So, if we are dividing the architecture along risk lines as well, then obviously the UI would be the riskiest &#8211; having the highest probability to change &#8211; over the life of the project. </p>
<p>However, business rules are often considered quite stable. Why ? Because their time-line of change is often stretched out over many project life-times &#8211; rather obvious really, business rules deal with the business, not the project. During development of the project we are often given the requirements in such a way that it is difficult to know what is domain knowledge and what is a business rule. It takes effort to separate out what are the business rules &#8211; what has changed in the past, and what will change in the future. </p>
<p>For example, in an academic project I performed some time ago, I was given a set of requirements including: 1. A student can register to a given course once in a semester. 2. A student can register to a project in a semester. Which is the business rule, which is the domain ? In this case (1) is the domain, and (2) is the rule &#8211; &#8220;a project&#8221; meaning &#8220;only one project&#8221; as I later found out. This rule changed sometime after my second alpha to &#8220;A student can register to only one project <U>alone</U> in a semester, but several projects in the same semester as long as they have a partner for each of those projects.&#8221; </p>
<p>As it is apparent, I, as a developer, have to take into account these risk/change factors and change my architecture accordingly. Ever since that project I have always created a business rules layer separate from the infamous &#8220;BL&#8221; ( Business Logic ). </p>
<p>Now, getting to the issue of implemeting using aspects. I am a big proponent of AOP, however I often find alternative implementations to be more desirable. Most of the examples given for the use of AOP including logging, transactions, security and others that can be made part of a framework, as .Net has done in many cases. Many have pushed Java&#8217;s superiority because of AspectJ, and although .Net doesn&#8217;t have an Aspect.Net yet ( although various developments are under way ), I have yet to miss it. <A href="http://staff.newtelligence.net/clemensv/Default.aspx">Clemens Vasters</A> has done some truly incredible stuff in the use of attributes in .Net for implementing AOP stuff. I&#8217;ve always thought that attributes should be used that way. I find that there is one basic flaw in the conclusion to using aspects for connecting business rules to systems. The entire white paper is <A href="http://ssel.vub.ac.be/Members/Maja/papers/Cibran-BIS03.pdf">here</A>. ( Yes, its a pdf unfortunately &#8211; only good for print really, <A href="http://www.useit.com/alertbox/20030714.html">Jakob Nielsen thinks so too</A>. ) The basic premise is that I&#8217;m building an entire system in an OO manner, which I&#8217;ve stopped doing some time ago for <A href="http://udidahan.weblogs.us/2003/11/08/simple/">these</A> reasons. Clemens has great insights on this as well, see them <A href="http://staff.newtelligence.net/clemensv/PermaLink.aspx?guid=6868ac5d-16cc-4863-bde4-11f663691c76">here</A>. </p>
<p>When using an SOA, your UI, or any other system needing services for that matter, will be sending messages to the guts of your system &#8211; the &#8220;BL&#8221; for you hardcore 3-tier-guys. Let&#8217;s call the thing receiving messages in this case the Gateway. All the gateway does is receive messages ( like &#8220;Register student number 12 to course number 15 in semester 21&#8243; ) and pass them on to the appropriate handler. The word &#8220;handler&#8221; hear is used like in the term &#8220;event handler&#8221; for a reason: <U><B>The receipt of a message is an event.</B></U> In the white-paper the authors refer to these events as a problem that has to be dealt with. Why ? Because when working in an object oriented fashion, you would have to intercept the call to: new Student(12).RegisterToProject(93); in order to handle the event, ie check/activate a business rule. Aspects are great for this sort of thing. However, when working in a service-oriented fashion, you would send a message of type &#8220;RegisterStudentToProject&#8221; with the parameters StudentID and ProjectID as above. No need to intercept any call since it has to first go through the gateway. The gateway would then pass the message to the business rules engine which would then find and activate the appropriate rules before and after the actual call to register the student. </p>
<p>The rules engine does something like this: </p>
<p>If ( ActivateBusinessRulesForMessageAndReturnTrueIfCanMakeCall(myMessage) )<br />
{<br />
  MakeCallForMessage(myMessage);<br />
  ActivateBusinessRulesAfterMessage(myMessage);<br />
} </p>
<p>The business rules themeselves are implemented in a separate layer than the engine. The mapping between rules and messages is also done in a layer separate from both the engine and the rules. Once we have a layer for each of these, we have architecturally separated the parts that change more often in the system from the rest of it. One can also move to a more dynamic model. One in which you define a language for defining rules, and the mapping to messages as well. Thus, changes could be made by changing a configuration file instead of recompiling any part of the system. </p>
<p>Note that when you have lots of rules and the order for activating them matters, you should move to a commercial rule engine instead of implementing your own. You&#8217;ll see that performance becomes an issue as the number of rules increases. </p>
<p>I hope that I&#8217;ve managed to introduce yet another strength of the SOA over the pure OO paradigm. Tell me what you think ! Where does the SOA fall short ? Where does the OOA beat the SOA ? Am I full of it ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2003/11/14/architecture-business-rules-and-aspects-oh-my/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

