<?xml version="1.0" encoding="UTF-8" ?>

<rss version="2.0"
  xmlns:ent="http://www.purl.org/NET/ENT/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
  <title>Reflections on software development . . .</title>
  <link>http://swcses.eponym.com/blog</link>
  <description>Collection of thoughts regarding software development and design best practices targeted at the object-oriented business application developer</description>
  <language>en-us</language>
  <lastBuildDate>Mon, 01 Dec 2008 17:01:23 -0600</lastBuildDate>
  <category domain="http://swcses.eponym.com/blog">Main Page</category>
  <generator>Blogware</generator>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally Speaking...</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html</guid>
    <pubDate>Tue, 18 Nov 2008 08:24:12 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is an index of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html&quot;&gt;The best software is never written&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html&quot;&gt;Write something down&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html&quot;&gt;Practice, practice, practice&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html&quot;&gt;It is not about how fast you can get something done&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html&quot;&gt;No spaghetti or balls of mud&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html&quot;&gt;There are at least 3 layers to every application&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html&quot;&gt;Favor theory over rules&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html&quot;&gt;Programming a computer is easy&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html&quot;&gt;Everyone writes hacks&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html&quot;&gt;Business-Object-Oriented should be standard operating procedure&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html&quot;&gt;Make the user more effective&lt;/A&gt; &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Make the user more effective</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html</guid>
    <pubDate>Fri, 14 Nov 2008 16:37:28 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Applications (especially the user interface portion) should serve the user by making the user more effective, not more flexible. We have the tendency to try to create user interfaces that allow a user to do everything, have full control. At worst developers&amp;nbsp;build an application as just a front end to a database essentially giving the user a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/5/3/1931065.html&quot;&gt;database table editor&lt;/A&gt;.&amp;nbsp;If that&#39;s all we were meant to do we would all be&amp;nbsp;using Microsoft Access to create database front-ends. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Software&amp;nbsp;should be a tool to help users do their job better. This requires that we work hard to understand their job. We need to gain understanding beyond the tasks they must complete and instead strive to&amp;nbsp;understand their goals. This may sound a little touchy-feely but in the end it is really about learning the user&#39;s business and creating an application that makes the user more effective at their job.&amp;nbsp; Replacing a file cabinet with a computerized file cabinet is not application development, it&#39;s called shifting the burden. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Business-Object-Oriented should be standard operating procedure</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html</guid>
    <pubDate>Thu, 13 Nov 2008 17:41:33 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Create an &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html&quot;&gt;object model that models the business&lt;/A&gt;. Put business logic inside the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;objects&lt;/A&gt;, put process logic inside the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/3/21/3594107.html&quot;&gt;services&lt;/A&gt;, and put implementation code in utility classes.&amp;nbsp;Life as a business application developer gets immeasurably easier when you follow this simple, flexible, and technology-independent&amp;nbsp;pattern.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Everyone writes hacks</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html</guid>
    <pubDate>Thu, 13 Nov 2008 08:19:03 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Everyone has to write a hack from time to time thanks to time constraints and other imposing factors.&amp;nbsp;And by hack I mean code that we know is way less than perfect, &lt;A href=&quot;http://en.wikipedia.org/wiki/Code_smell&quot;&gt;smells bad&lt;/A&gt; but left alone, or a change&amp;nbsp;in a model that is much different than maybe the database that supports the application.&amp;nbsp;I often hack together methods on an object with full knowledge that my tests will bring out its dark side and help me refactor it later. What separates the masters from the merely competent is how hacks are written and what &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;happens afterwards&lt;/SPAN&gt;.&amp;nbsp; &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;When I stumble over my own hacks from a year ago I am reminded why I am not yet the master I wish to be.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Writing hacks should take place as deep as possible in the application. When we do write a hack we need to put the hack as deep in the code as possible so no code above it ever has to worry about the same issue again. Unfortunately some of the most hacked up&amp;nbsp;applications have no choice but to implement hacks right in the user interface, the absolute last place where you want to do it.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;It is too easy to just throw up our hands and decide we&#39;ll just have to hack something together so it works.&amp;nbsp; When a hack is written it should be &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;officially &lt;/SPAN&gt;documented and&amp;nbsp;the fix should be added to the top of the to-do list for the next release.&amp;nbsp;&amp;nbsp;Any and all implications to the model must be understood by all stakeholders.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;No&lt;/SPAN&gt;&amp;nbsp;&lt;A href=&quot;http://www.sjvgreens.org/broken.shtml&quot;&gt;&lt;FONT color=#800080&gt;Broken Window Syndrome&lt;/FONT&gt;&lt;/A&gt;!&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Programming a computer is easy</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html</guid>
    <pubDate>Wed, 12 Nov 2008 08:06:44 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;Programming a computer is easy, productive and clear communication is very hard. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html&quot;&gt;Work on the latter&lt;/A&gt;. &amp;lt;-- Universal Model&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;http://www.amazon.com/Object-Oriented-Analysis-Applications-Addison-Wesley-Technology/dp/020189551X&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- &lt;SPAN id=btAsinTitle&gt;Object-Oriented Analysis and Design with Applications [Booch]&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;http://www.mindtools.com/CommSkll/CommunicationIntro.htm&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Communication Skills 101&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;http://www.khake.com/page66.html&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Communication Skills 102 . . .&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;https://www.google.com/accounts/NewAccount?service=blogger&amp;amp;continue=https%3A%2F%2Fwww.blogger.com%2Floginz%3Fd%3D%252Fcreate-blog.g%26a%3DADD_SERVICE_FLAG&amp;amp;hl=en&amp;amp;sendvemail=true&amp;amp;followup=https%3A%2F%2Fwww.blogger.com%2Floginz%3Fd%3D%252Fhome%26a%3DSERVICE_ONLY&amp;amp;naui=8&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Start thinking out loud about what you think you know&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in; mso-list: l0 level2 lfo1&quot;&gt;&lt;A href=&quot;http://www.amazon.com/Difficult-Conversations-Discuss-what-Matters/dp/014028852X&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Difficult Conversations: How to Discuss what Matters Most [Stone]&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Favor theory over rules</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html</guid>
    <pubDate>Tue, 11 Nov 2008 08:10:35 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Favor theory, general methods, and the &lt;EM&gt;reasons why&lt;/EM&gt; over rules, frameworks, and &lt;EM&gt;how things are done.&lt;/EM&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;It is &lt;STRONG&gt;not&lt;/STRONG&gt; about how test-driven, or agile, or extreme, or object-oriented, or domain-driven, or feature-driven, or procedural, or [fill in the blank] design and development is done, it is &lt;EM&gt;why&lt;/EM&gt;. Understand &lt;EM&gt;why&lt;/EM&gt; and you can successfully apply the best practices in your own context.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;For the life of me I cannot find the source of this. However, years ago a book was written by some CEO who turned a failing corporation around to make it very successful.&amp;nbsp; Years after that the author discovered criticism for his book as the methods he described in his book were not proving successful for other CEOs. In speaking engagements the author would later address the naiveté of people who thought the same things would work for them. Readers failed to understand the &lt;EM&gt;why&lt;/EM&gt; of what the CEO did. The bungling CEOs needed to comprehend the why and then come up with solutions for their own environment, their own context. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...There are at least 3 layers to every application</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html</guid>
    <pubDate>Mon, 10 Nov 2008 08:10:09 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;At a minimum, implement the most basic 3 layers of code (Presentation, Application, Data Access), even if they are not necessarily &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;FONT color=#800080&gt;tiered&lt;/FONT&gt;&lt;/A&gt;. Anything else is &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_ball_of_mud&quot;&gt;muddy&lt;/A&gt; and has no place in professional development of the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Separation of concerns is &lt;STRONG&gt;the most basic&lt;/STRONG&gt; axiom of good development. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...No spaghetti or balls of mud</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html</guid>
    <pubDate>Thu, 06 Nov 2008 16:12:17 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;No spaghetti, no balls of mud, no permanent hacking&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Signs your application might be a plate of spaghetti, ball of mud, or permanent hack…&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;When you are faced with fixing a subsystem, object, function, or small chunk of code you often feel it would be easier to rewrite it.&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;When a business rule changes you are not sure where all you have to make the change. This can be a simple as “Let’s make sure all people’s names are displayed like this…” or as serious as “Let’s change all calculations done with dollar amounts to round like this…”&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;The objects from your “business” layer don’t have any &quot;business&quot; methods&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Code routines have little separation of concerns and tend to be large&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;You routinely have objects with more than 10 properties&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;You have code that exists a year after you said it was just a temporary fix&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;You have no layers in your code, no discernable architecture.&lt;/LI&gt;&lt;/UL&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...It is not about how fast you can get something done</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html</guid>
    <pubDate>Thu, 06 Nov 2008 08:26:38 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;It is&amp;nbsp;not about the speed to completion, it&amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;is&lt;/EM&gt;&lt;/STRONG&gt; all about understanding and maintaining code which affects the overall speed of the application’s lifecycle. We deliver quickly by delivering little bits at a time with each little bit being well-built, well-tested, and easily changeable. Those bits being objects that like Legos can be used to build and change many different things in our application domain with great ease.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;You should be able to check your code in at the end of the day without compilation problems. If you cannot then you are probably not delivering little bits of well-built, well-tested, and easily changeable code.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;Know that your application will spend most of its life in maintenance and extension. The first build is only the beginning. Knowing this, build small with quality at every step. The first step to quality is a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;FONT color=#800080&gt;separation&lt;/FONT&gt;&lt;/A&gt; of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/10/3273095.html&quot;&gt;&lt;FONT color=#800080&gt;concerns&lt;/FONT&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;Do not engage in premature optimization &lt;STRONG&gt;or&lt;/STRONG&gt; generalization.&amp;nbsp; Worry about speed when it’s actually a problem. Make your code more flexible and generic when that flexibility is required. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;Applications should evolve not spontaneously arrive. The metaphor of building an application being like engineering serves us well to a point. However, I cannot go to the mall where an escalator is installed and widen it by two inches to allow wheelchair access, but a change to the width attribute of an object can be done, tested, and released in an hour. In other words, the &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_Design_Up_Front&quot;&gt;big design up front&lt;/A&gt; required for engineering physical things does not apply to the engineering of software.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Write as much test code as you can that does not require human interaction. This allows you to change and extend things fast and with confidence.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Practice, practice, practice</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html</guid>
    <pubDate>Wed, 05 Nov 2008 16:27:08 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The only thing worse than bad development practices, is no development practices. Developers can debate best practices ad infinitum, ad nauseam. However, even disagreement does not excuse having no practices at all. Although painful, it is worth seeing what a development team can agree on and sticking to as many best practices as possible. Doing this makes working on each others’ code much easier, let alone just understanding it. Furthermore best practices can help new developers avoid mistakes if they follow practices set up by the senior developers. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;To avoid pointless disagreement, I have found it works best for a development team to figure out the least common denominator so to speak. The developers need to whittle down the debate to the point of intent and then ignore personal preference. For example, two development teams here quibbled over whether or not variable scope identification should be a prefix or a suffix on a variable. However, that debate was&amp;nbsp;mostly a personal preference debate. What was most important is that both teams recognized the usefulness and elegance of scope identification and did &lt;STRONG&gt;something&lt;/STRONG&gt;. They agreed they would not mix and match, but no one would declare a company-wide edict. Everyone is happy.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;It is also worth staying mindful of what is personal preference and what truly has benefits and drawbacks.&amp;nbsp;&amp;nbsp;&amp;nbsp;When you encounter something that makes your stomach churn but only because of personal preference, you can hold off speaking up and save your debate-points for something that really matters. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Write something down</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html</guid>
    <pubDate>Wed, 05 Nov 2008 08:03:39 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Regardless of how simple the new implementation or change you are about to make is…write something down.&amp;nbsp;At my office, a particular developer is fond of saying, “&lt;EM&gt;Someone&lt;/EM&gt; needs to think it through and write it down.” I couldn’t agree more.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;On the smallest level you comment and pseudo code your way through the solution before writing code. Taken a step further you can &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;scratch &lt;/SPAN&gt;notes on the back of a&amp;nbsp;napkin or&amp;nbsp;have whiteboard discussions with other developers. But rarely is there a change so insignificant that you don’t at least write down in plain English what you think you are about to do.&amp;nbsp; If you cannot say it in plain English, you cannot code it.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...The best software is never written</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html</guid>
    <pubDate>Tue, 04 Nov 2008 12:27:11 -0600</pubDate>
    <description>The best code (easiest to maintain and has the least amount of bugs) is the code you never write. So you only build the simplest thing that provides value, careful never to add bells and whistles to an unstable code base. </description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>An encapsulation misunderstanding</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/10/21/3940876.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/10/21/3940876.html</guid>
    <pubDate>Tue, 21 Oct 2008 13:36:16 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In a discussion outside of this blog a developer suggested to me that encapsulation was kind of pointless in light of today’s more practiced methodologies. He said that we hide data behind a class so that if the data changed it would not affect anyone using the class. However, because he works on an agile development team with an iterative development cycle that lives and breathes changes, encapsulation was of little concern to him. His application is self-contained at his company so he is aware of all the client code. A simple change to a class’ interface and the compiler will point out all the places affected. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I explained that I too am in an environment where I have control over all clients of the object model so the affects of a simple data change can be easily handled. The encapsulation misunderstanding here is that exposing data is &lt;STRONG&gt;not&lt;/STRONG&gt; the problem, or at least not the direct problem. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;Writing logic against exposed data&lt;/EM&gt; is what leads to duplicated logic, difficult and incomplete tests, and a fragile design. I have mentioned &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/5/1/3659890.html#WhatDoIDo&quot;&gt;previously in this blog&lt;/A&gt; that at the end of the day my business objects do expose their data, more than would be ideal for sure. The solutions required to prevent exposure are often just not that practical. What is of the utmost importance is that the correct reasons are understood for not abusing the exposed data so any abuse is less likely to happen. The less this is understood and enforced, the more dangerous exposing object data is.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;If you are on a team of OO developers very keen to this understanding and code reviews or other practices are in place, then you could expose all your objects’ data without much fear of fragility. On the other hand, if you are surrounded by developers of varying OO-awareness then more ought to be done to hide object data so logic is not accidentally misplaced.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Is the Business Object Dead?</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/10/17/3933540.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/10/17/3933540.html</guid>
    <pubDate>Fri, 17 Oct 2008 08:14:31 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;By my estimations (and minor research), most common business applications being written today are in Java, VB.Net and C#.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The languages are similar in many respects, not the least of which is that they are all object-oriented languages. I am aware that many if not &lt;EM&gt;most&lt;/EM&gt; business applications written in these languages ignore 40+ years of object theory and proven layered architecture benefits on their way to a lovely &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_ball_of_mud&quot;&gt;&lt;FONT color=#800080&gt;big ball of mud&lt;/FONT&gt;&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;However, there are &lt;A href=&quot;http://www.objectmentor.com/&quot;&gt;legions &lt;/A&gt;of developers who &lt;EM&gt;do&lt;/EM&gt; try to tap into the benefits of using an object-oriented design and a layered architecture to produce robust applications that are easy to build, understand, change, and maintain. When they do so they will make a decision as to whether an object representing a business concept will have methods for maintenance-related code or whether it will have methods that handle business logic. Rarely do objects have both as the two needs often lend themselves to different designs. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In the past year or so I have come to the surprising realization that most developers seem to make the methods of their objects maintenance related. The objects tend to be mutable bags of data that act only as a conduit to database tables for moving data in and out, business seems like an afterthought.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Frameworks like nHibernate and CSLA promote this kind of design in much the way &lt;A href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.forms.datagrid(VS.71).aspx&quot;&gt;Microsoft&lt;/A&gt; does which is ironic since users of nHibernate and other O/R mapping tools tend to be &lt;A href=&quot;http://weblogs.asp.net/rosherove/archive/2007/06/04/alt-net-alternative-tools-and-approaches-to-mainstream-net.aspx&quot;&gt;&lt;FONT color=#800080&gt;anti-Microsoft developers&lt;/FONT&gt;&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Gone or least fading is the idea of objects that represent business entities actually having only methods that relate to the business of the object, in other words, they are true &lt;EM&gt;business objects&lt;/EM&gt;.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;However, I’m not sure how an object-oriented developer whose emphasis is modeling a business in code rationalizes any other kind of design. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/GeneralProgrammingDesignBestPractices">General Programming &amp; Design Best Practices</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Obstacles to The Universal Model</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html</guid>
    <pubDate>Wed, 24 Sep 2008 19:06:01 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The classic design book from 1988 by Donald Norman, &lt;A href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107&quot;&gt;&lt;FONT color=#800080&gt;The Design of Everyday Things&lt;/FONT&gt;&lt;/A&gt;, is not about designing software, but rather designing any &lt;EM&gt;thing&lt;/EM&gt; that must be used by a person. The author makes the point that a good design is easier to use, easier to learn, and simply better when the &lt;EM&gt;thing’s&lt;/EM&gt;&lt;/EM&gt; design reflects the user’s view of how the &lt;EM&gt;thing&lt;/EM&gt;&lt;/EM&gt; works, or in other words: the user’s model. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;The basic idea is that for any given thing there is the user’s conceptual model and the implementation model. The implementation model is exactly how a &lt;EM&gt;thing&lt;/EM&gt; works or in other words, how it is implemented.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Poor design either directly reflects implementation which is often no concern of the user, or the design reflects some model which is not the implementation or user’s model.&amp;nbsp;A door that needs to be pushed designed with a bar that suggests you should pull it is an example that doesn&#39;t match either model.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Since software is just another designed &lt;EM&gt;thing&lt;/EM&gt;, the 1995 book &lt;A href=&quot;http://www.amazon.com/About-Face-Essentials-Interaction-Design/dp/B001C323BI&quot;&gt;&lt;FONT color=#800080&gt;About Face&lt;/FONT&gt;&lt;/A&gt; was written specifically to address this issue in regards to building applications. Like the authors of many object-oriented books, these authors extol the virtues of building applications that reflect the users’ real-life view of the things involved. Doing this along with reflecting a singular language to describe the real-life views is what Domain-driven design methodologies and the book &lt;A href=&quot;http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215&quot;&gt;Domain-Driven Design&lt;/A&gt; refer to as creating a ubiquitous language.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When it comes to the common business application I firmly believe that an object-oriented solution based on one model that the stakeholders and developers agree on is the best way to build easily-understood and easily-maintained business applications. I like to refer to that common model as the Universal Model. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;The universal model is not the user’s model exactly or the implementation model, but rather a model that gestates over time based on the cooperation of stakeholders and developers. The success of that model depends on the cooperation and open-mindedness of both the developers and the stakeholders. Though I have found plenty of literature on how &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html&quot;&gt;wonderful&lt;/A&gt; a combo of OO development, &lt;A href=&quot;http://en.wikipedia.org/wiki/Model_Driven_Engineering&quot;&gt;&lt;FONT color=#800080&gt;model-driven design&lt;/FONT&gt;&lt;/A&gt;, and a universal model is, there is little about just how hard it can be to come up with that model. Here are some of my notes on the obstacles to achieving a good Universal Model:&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 1: Geeks &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 2: Players don’t want to play&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 3: Compromise&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 4: Abstract Art&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 1: Geeks&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking, software developers are geeks who tend to see the world in 0s and 1s. By nature they tend to be interested in how things work and how to make things work. To them the implementation details are the real sexy details of an application (which might explain why many geeks do not care much for user interface development).&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Putting a universal model on top of their elegant implementation model can feel unnatural and even painful for a geek.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; The worst &lt;/SPAN&gt;is an egotistical stubborn geek who believes that users just need to understand what is &lt;EM&gt;really&lt;/EM&gt; going on because the universal model &lt;STRONG&gt;is&lt;/STRONG&gt;&lt;/STRONG&gt; the implementation model. The geek sees the implementation model as the only real model because it is true, clean, precise, logical, not-gray, 0s and 1, etc, etc,.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Geeks have to be made aware and then continually reminded who they are writing software for and who decides the success and relevance of their product.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Geeks must understand that communication will play a huge part in the success of their development effort and we cannot be hindered by using two different dialects to describe the same system. Geeks can have trouble sticking to the universal model, even when they agree to the concept. Implementation details bleed into discussions, user interfaces, and other public access points &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html#paps&quot;&gt;[1]&lt;/A&gt; to the model. We have to all be vigilant to catch each other “leaking implementation.&quot;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 2: &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;Players don’t want to play&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The software application &lt;STRONG&gt;is&lt;/STRONG&gt; the universal model.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The universal model is produced by &lt;STRONG&gt;both&lt;/STRONG&gt; the stakeholders and the developers.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Ergo the developers &lt;STRONG&gt;and&lt;/STRONG&gt; stakeholders design the software application.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Ideally both parties will agree to this concept and work hard to achieve the universal model. However, often both geeks and stakeholders won’t play along. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;Stakeholders start tuning out non-playing geeks when they talk of arrays, tables, data source grids, and referential integrity.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;And then there are stakeholders who are used to the old way of developing software that entails writing up what you want and then getting an application 6 months or more&amp;nbsp;later.&amp;nbsp; Regardless of the poor software they have gotten in the past, these stakeholders are not interested in being active participants in the design of better software.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;As with so many software development gotchas, an ounce of prevention is worth a pound of cure.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;From the beginning stakeholders have to be sold on the idea that &lt;STRONG&gt;they&lt;/STRONG&gt; are designing the software by crafting the universal model. When they use terms that are not in the model, the developers should not assume anything and make the stakeholder clarify right there on the spot.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Even when the stakeholders don’t play a long, it benefits us to try to figure out their conceptual model so when they speak in business-lingo we have less translation to do. When geeks won’t play along it behooves the team to move them deeper into the code and out of the public access points &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html#paps&quot;&gt;[1]&lt;/A&gt;. This allows them to work blissfully away on implementation code. When a geek that is not playing along speaks up in a meeting it might be worth restating what was said in terms of the universal model to make sure everyone is clear. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 3: Compromise&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Once upon a time I considered the user model &lt;EM&gt;the&lt;/EM&gt; model that I had to match my design against. I would chastise myself and other developers who tried to introduce new terms into the universal model that did not seem to exist before. For example, when designing a system that managed when documents can be viewed I balked at a new concept called Viewability Specification. I argued that no one says that now or has before, and a user does not need to know about those kind of details. However, the concept &lt;EM&gt;did&lt;/EM&gt; exist before; it had just never been labeled. Having a universal model requires that we label things and agree on how we will refer to these things. On the flip side, I had also been too strict&amp;nbsp;about letting stakeholders use words that did not fit the reality of the design.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;For example, in a system that processes mass amounts of email, the users referred to the people who were sent emails as&amp;nbsp;&lt;EM&gt;recipients&lt;/EM&gt;. However, the geek in me pointed out that because of delivery problems not every person is truly a recipient of an email. So we used the term &lt;EM&gt;Addressee&lt;/EM&gt; instead. Stupid. No one used that word, everyone continued to call them recipients, and the universal model was rendered pointless.&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;This compromise also means that stakeholders will have to understand some basic object modeling concepts. In a nutshell they need to understand that every thing in the system ties to an object and an object can figure things out based on what it knows. Some objects&#39; state is stored so it can be used again&amp;nbsp;even after a computer is turned off and back on. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have to compromise on the model. There are times when developers will have to accept user-speak when it is more abstract than we would like, and users will have to refer to concepts with new terms not used before. Stakeholders and geeks alike can be anxious about the idea of stakeholders speaking in terms of objects, but the concept is so very simple and non technical.&amp;nbsp; The truth is that this can only go so far. Stakeholders might be interested in some of the more gory design details but&amp;nbsp; they will never want (or&amp;nbsp;should have)&amp;nbsp;to grasp the concepts of interfaces, classes, inheritance, or any other gobbledygook. So try as we might, 0% translation between real life and the model is not possible. Do your best, compromise where needed.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 4: Abstract Art&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Common disagreements in OO design often are in regard to levels of abstraction. What feels perfect for one developer is too abstract or&amp;nbsp;too in depth for another. The universal model sits somewhere among the many&amp;nbsp;levels of abstraction. The discussions about what is part of the universal model and what is deeper implementation is fraught with debatable material. Trying to discern whether a nuance needs to matter to a user can be tough. Most nuances are small, so on an individual basis they are easy to let slip into the model, however they do&amp;nbsp;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/7/21/2147956.html&quot;&gt;&lt;FONT color=#800080&gt;add up over time&lt;/FONT&gt;&lt;/A&gt; and can make the model too complex. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have to ask ourselves what matters to the public consumer and producers of a concept in our model. Anything that does not matter does not need to be part of the universal model. For example, in the document system mentioned earlier we implemented 2 kinds of documents for various technical reasons. However, when consumed the user does not care what kind of document it is only that it contains information. When produced the administrative user could make changes that technically change it from being one kind of a document to the other, however, the kind did not matter to the user. To them it was just a Document with slightly different attributes.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;So the universal model only contained the Document even though the implementation behind the scenes had two specialized document objects. This problem can also be solved by putting extra notes in the model for anything that is debated. In the document example there was only a Document in the &quot;index&quot; of the universal model. However, in the fine print there were extra notes added for anyone who cared that explained the 2 specialized docs. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;STRONG&gt;
&lt;HR&gt;
&lt;/STRONG&gt;&lt;/o:p&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT color=#000000&gt;[1] Public Access Points of an Application&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I use this term to refer to the user interfaces and all public objects and public interfaces of the system. This high-level code benefits from being the most abstract and an exact match of the universal model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;A name=paps&gt;&amp;nbsp;&lt;/A&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Benefits of the Universal Model</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html</guid>
    <pubDate>Wed, 24 Sep 2008 19:04:20 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Developing a universal model can be an easy way to get stakeholders to design the application without them having to learn anything technical. The basic object-oriented concepts of objects representing real-life things, determining things, and being stored is neither technical nor hard to grasp. Domain experts understand the complex interactions of objects in the real world; it is no stretch to visualize our software as a reflection of those same objects.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Realizing the effect of change is easy to see and communicate to stakeholders when they understand the model. They can see the ripple effect, or lack there of, when changes are suggested. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The universal model allows for the kind of gray, non black-and-white reality of a business domain to sit above the very black-and-white ultra-logical implementation details. When using an object-based language the majority of our code can directly match the universal model. Furthermore, it can also point out a gray reality that can even be implemented as gray instead of the assumed back and white. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Using &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html&quot;&gt;&lt;FONT color=#800080&gt;service objects&lt;/FONT&gt;&lt;/A&gt; we can easily represent user-defined processes that still adhere to object-oriented principles of keeping all the logic in the business objects. These user defined processes can be part of the model and easily expressed in the same terms used in the business domain.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>A step further</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/16/3887305.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/16/3887305.html</guid>
    <pubDate>Tue, 16 Sep 2008 08:39:44 -0500</pubDate>
    <description>&lt;P&gt;Every good idea or programming practice can be taken a step further.&lt;/P&gt;
&lt;P&gt;Every bad idea or programming practice can be taken a step further.&lt;/P&gt;
&lt;P&gt;There is no end to the &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;criticism &lt;/SPAN&gt;of code because of this.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>The Jerk Factor</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/8/3875363.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/8/3875363.html</guid>
    <pubDate>Mon, 08 Sep 2008 13:47:52 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I have worked at 5 different companies in the past 13 years and have worked directly or indirectly with I’d say about 35 developers and other technical people. That’s not a huge number, but about an average of 7 IT people per job. The competence level, skill level, and social dexterity of those people all varied; however, I have only ever worked with 1 person who was what one might technically call an ass. Everyone knew it.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Even those who were friendly with him knew he was a complete jerk. I would even suppose that he knows he is a jerk.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I bring it up now because it has taken me a while to realize what kind of impact a jerk has on a development team. Given a choice, no one wants to work with a jerk, let alone talk with a jerk if it was not absolutely necessary.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Think about that for one moment and you can get an idea of what kind of simple havoc that can cause on development teams. &lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Regardless of how smart the Jerk might be, no one else is learning from the jerk.&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Efforts can be made to create and follow &quot;best practices&quot; but no one will bother discussing them with the jerk&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;The group can work hard to make sure no one is a guy-in-a-room, but if no one wants to go in the room with the jerk then it seems inevitable a&lt;A href=&quot;http://codesnipers.com/?q=node/43&quot;&gt; guy-in-a-room&lt;/A&gt; will emerge. Or maybe a jerk in a room?&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;This is a soft touchy-feely bit of reality, but the workplace is less relaxed. People tend to walk on egg shells around a jerk, put their head down as they pass a jerk in the hallway, and can be afraid to laugh or goof around near a jerk. &lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Developers as a whole are artists who are sensitive about their creations, having a jerk around only throws gas on a fire&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The author of the book “&lt;A href=&quot;http://www.amazon.com/Asshole-Rule-Civilized-Workplace-Surviving/dp/0446698202&quot;&gt;&lt;FONT color=#800080&gt;The No *** **** Rule: Building a Civilized Workplace and Surviving One That Isn&#39;t&lt;/FONT&gt;&lt;/A&gt;” suggests that companies should try to screen for jerks and purge them from their ranks. I have not read the book, so I cannot tell you how he suggests we screen for them. However, from articles the author has written I can tell you his final advice is to try to avoid them, be polite but don’t engage, try to become indifferent and not care, and finally if all else fails, quit.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Spurred to write…</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/4/3868816.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/4/3868816.html</guid>
    <pubDate>Thu, 04 Sep 2008 10:14:10 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Two quick things I feel like I have reminded myself or someone else of alot in the past few weeks...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;It is worth remembering and being constantly reminded of, so it is worth writing down. &lt;EM&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;Business objects&lt;/A&gt; serve a purpose.&lt;/EM&gt;&amp;nbsp; Granted, they abstract a concept in a domain, but we must think of them as being used to handle logic, to handle business, to have responsibility. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;I often document this in terms of what an object can determine, calculate, or figure out. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;Not doing this leads to a&amp;nbsp;highly-coupled design.&amp;nbsp;When we do remind ourselves to think along these lines we find ourselves exposing less data or finding other methods or abstractions to do so.&amp;nbsp;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;
&lt;HR&gt;
&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Windows forms and web pages are objects. General object-oriented rules should apply. They can and should have methods and properties. Their implementation details should rarely if ever be exposed to the public. Java, VB.Net and C# are OO languages. I said, Java, VB.Net and C# are OO languages.&lt;/P&gt;&lt;/SPAN&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Patterns</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html</guid>
    <pubDate>Sun, 20 Jul 2008 13:08:11 -0500</pubDate>
    <description>&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Simple Object Patterns&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Referring to every object in an&amp;nbsp;object-oriented business application as an &quot;object&quot; results in a vague lingo that does nothing to enhance design communication.&amp;nbsp; Design is hard enough on its own,&amp;nbsp;add a few more developers working on the same design and it benefits everyone to be able to clearly express differences in the objects involved. &lt;/P&gt;
&lt;P&gt;The simple object patterns described here are not necessarily the complex patterns we usually think of when discussing &lt;A href=&quot;http://en.wikipedia.org/wiki/Design_Patterns&quot;&gt;object-oriented patterns&lt;/A&gt;. Rather they are single-object patterns or variations on a theme that are prevalent in the common business application. Many have to do with a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/10/3273095.html&quot;&gt;separation of concerns&lt;/A&gt; of course, and many are useful in our effort to maintain an object-oriented design in a business application environment that seems to frequently conflict with OO principles. &lt;/P&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;Business Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798968.html&quot;&gt;Business Object Collection&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798999.html&quot;&gt;Set Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798981.html&quot;&gt;Factory Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798980.html&quot;&gt;Entity Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3799003.html&quot;&gt;Value Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798990.html&quot;&gt;Key Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798986.html&quot;&gt;Info Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798975.html&quot;&gt;Detail Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html&quot;&gt;Service Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798995.html&quot;&gt;Manager Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798984.html&quot;&gt;Identity Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798970.html&quot;&gt;Data Transfer Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798973.html&quot;&gt;Data Wrapper&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798965.html&quot;&gt;Candidate Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3799000.html&quot;&gt;User Interface Controller Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3799001.html&quot;&gt;Library Object&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3799289.html&quot;&gt;User Interface Choice Object&lt;/A&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: User Interface Choice Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3799289.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3799289.html</guid>
    <pubDate>Fri, 18 Jul 2008 13:33:29 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;User Interface Choice Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create an object to be used on a user interface that can represent a choice other than one of the single &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;business objects&lt;/SPAN&gt;&lt;/A&gt; made available.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Consider a list box on a form that contains Ice Cream Topping Types. The user is required to choose a Topping but we don’t want to pick a default Topping for them.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A common solution is to make the first option in the list box, “Choose Topping”.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;If the Topping was not required but we wanted to make sure the user clearly chose no Topping (didn’t forget to make a choice) the first option in the list box might be “No Topping.” &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The list box in an object-oriented application would contain the Topping objects; however the top “Choose Topping” option is clearly not a Topping. A hack solution that corrupts the business layer is to add a bogus Topping object with a Name like “Choose Topping” and then let client code could figure out what to do with it. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A better solution is to create a UI Choice Object that contains the business object and tracks whether the option is No Choice, All Choices, or the Object. Instead of looping through the business objects and adding them to the list box, the code would first create a UIChoice object with a Display Property set to “Choose Topping” and set its Choice Type to “No Choice”. Then for each object in the collection it would create a new UI Choice and set its choice type to “Object” and adding that UI Choice to the list box.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;User interface code can then check a chosen UI Choice object to clearly see if it is a No Choice object, All Choices object, or Business Object and act appropriately. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;.Net developers can create a type-safe UI Choice object using generics to provide a standard way to put objects in and get objects out of list boxes and combo boxes.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Consequences&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A reusable standard OO solution can be used across a GUI application without resorting to hacking&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The business layer of a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;multi-tiered application&lt;/SPAN&gt;&lt;/A&gt; is not corrupted by hacky solutions&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Example Pseudo Code&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;class&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;UIChoice&lt;/SPAN&gt;&amp;lt;TypeOfObject&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;string&lt;/SPAN&gt; _Display;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;UIChoiceTypeEnum &lt;/SPAN&gt;_UIChoiceType;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;private&lt;/SPAN&gt; TypeOfObject _ObjectMaybe;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;string&lt;/SPAN&gt; Display&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; _Display;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;bool&lt;/SPAN&gt; IsObjectChoice&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; (_UIChoiceType == &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;UIChoiceTypeEnum&lt;/SPAN&gt;.ObjectChoice);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;bool&lt;/SPAN&gt; IsNoChoice&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; (_UIChoiceType == &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;UIChoiceTypeEnum&lt;/SPAN&gt;.NoChoice); &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: blue&quot;&gt;bool&lt;/SPAN&gt; IsAllChoices&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; (_UIChoiceType == &lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;UIChoiceTypeEnum&lt;/SPAN&gt;.AllChoices) ;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: gray&quot;&gt;///&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt; Returns the contained object this UIChoice refers to&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;public&lt;/SPAN&gt; TypeOfObject Object&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ThrowExpectionIfNull&lt;/SPAN&gt;(_ObjectMaybe)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: #2b91af&quot;&gt;ThrowExpectionIfFalse&lt;/SPAN&gt;(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;this&lt;/SPAN&gt;.IsObjectChoice);&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt; ObjectMaybe_mObj;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-layout-grid-align: none&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#39;Courier New&#39;; mso-no-proof: yes&quot;&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;&lt;/SPAN&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Value Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3799003.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3799003.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:32:18 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;Value Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create an object that is an attribute of another object without any identity relative to the domain and that can be interchangeable between objects that use the same attribute.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I have a Person and a Person has an Address. I have a Company and a Company has an address. The database may have a PersonAddress table and a CompanyAddress table. However, there is no need to create a PersonAddress object and a Company Address object. A single Address value object can be shared by both the Person and the Company. All the logic related to an Address would be in that one place and can be tested without having a Person or a Company.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A value object is an object that often is used as an attribute of another object. For example, a Name object (value object) might be an attribute of a Person. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A value object has no changing state and has no domain identity, it is not an &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798980.html&quot;&gt;Entity Object&lt;/A&gt;.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;In other words, their lifecycle is not tracked in permanent storage.&amp;nbsp;&amp;nbsp;For example, an address does not change, a person might change addresses, but the address remains the same. In other words, the person gets a &lt;EM&gt;new&lt;/EM&gt; address.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A car might have the attribute color. Color is a value object. The system does not track colors. The car’s color may change from Red to Blue, but Red never changes into a different color, it will always be Red&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Whether or not an object is a value object can depend on the domain. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Consequences&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Identifying that an object is not an &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798980.html&quot;&gt;Entity Object&lt;/A&gt; can simplify a design by making objects that are easily testable and not tied to what is ultimately a database that assigns identity. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Understanding them can help us see objects where at first we just saw primitive data types: e.g. Person with Zip code value object instead of type string&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Library Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3799001.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3799001.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:26:21 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;Library Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create a class that provides a list of functions related to a specific area of interest.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Over time we eventually write various functions related to specific area of interest like Encryption, String Manipulation, etc. Often these functions are not domain specific and could be used in other applications that share the same interests.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;When we want to group these functions together we create a Library. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;These classes are often written with reusability in mind outside of the domain (Maybe not for the whole world to reuse but a development team or teams.) Sometimes they are specific to the business domain and shared by many objects.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Developers can get lazy and start putting functions in libraries that belong in &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;business objects&lt;/A&gt;. It might be legitimate though to have a business object method turn around and call a more general method in a Library. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;An effort should be made to make the libraries as independent as possible.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Examples&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT color=#333399&gt;ExceptionLibrary &lt;/FONT&gt;could have common exception handling routines like throwing errors when something is null, or building a readable message for an exception. This is the kind of stuff that any application could use.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT color=#333399&gt;StringLibrary &lt;/FONT&gt;could have routines for getting random characters, reversing a string, or any more complex manipulations that the basic string type does not provide.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: User Interface Controller Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3799000.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3799000.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:23:56 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;User Interface Controller&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create an object that can reduce the number of calls made by a remote user interface client and convert required data into format acceptable by client. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Consider a web interface that lives on a web server but needs to work with an application that lives on a separate application server. Communication between the two is not quite lightening fast, yet we want the user to have a quick and responsive user interface. For example, when a user logins in we might want to check their security rights, get their current account information, get notification of any friends they might have on-line, and check to see if they have any answers to outstanding questions they may have asked. On a desktop application we would not think twice about the user interface making those four or more calls to get the information. We also would have no problem with the GUI retrieving the objects with that information.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;However, in the case of the web it can really benefit performance if the web client could make one call to a Web User Interface Controller across the network that will do all of that at once and return the results. Instead of serializing all the objects involved, we could just gain access to the one controller.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798970.html&quot;&gt;Data Transfer&amp;nbsp;Object&lt;/A&gt; is a useful mechanism for transferring the data from a single controller call.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Should be noted that a UI controller is specific to a user interface, if it wasn’t it would just be a normal &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/3/21/3594107.html&quot;&gt;application service&lt;/A&gt;.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Consequences&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Network activity is reduced and user interface speed is increased.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Objects in the business layer are not corrupted in order to deal with a disconnected user interface.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Set Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3798999.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3798999.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:19:43 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;Set Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create a collection that requires that all the objects it contains abide by one ore more requirements.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When we want to write a method against the items in a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798968.html&quot;&gt;Collection&lt;/A&gt; but find ourselves assuming that the objects all have a common denominator, it may be safer and just plain clearer to create a special collection called a Set. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Consider a business application with a Car object that contains a Tires collection. This&amp;nbsp;design is fragile because of all the assumptions being made about the collection. For example,&amp;nbsp;code could ask the Tires collection for the two front tires and it might bomb when it&amp;nbsp;finds three front tires in the collection. An appropriate solution is to create a Tire Set which is a collection of Tires with strict rules about its members. This Set would enforce that it can only be built with four tires, two front and two rear, and they have to all be the same size. Now methods that are specific to a Tire Set, like&amp;nbsp;&lt;FONT color=#333399&gt;GetTheTwoFrontTires() &lt;/FONT&gt;require no assumptions and will always work. Any methods of the plain Tires collection that make sense for the Tire Set can be made available through the Tire Set interface.&amp;nbsp;A Car object would be built with a Tire Set, not a general Tire collection.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Often items in a domain only require one set. However, when we have multiple sets of objects in a domain, it is common to append what the set it &lt;STRONG&gt;for&lt;/STRONG&gt;; e.g. TireSet&lt;STRONG&gt;For&lt;/STRONG&gt;Truck - makes it clear that &quot;These are Tires &lt;STRONG&gt;for&lt;/STRONG&gt; a Truck&quot;, TireSet&lt;STRONG&gt;For&lt;/STRONG&gt;Display, etc.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;There may be no way that a collection can enforce the rules about its members. However, when a Set is built in the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;business layer&lt;/A&gt;, the rules can be enforced and public code can safely assume those rules have been followed.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Consequences&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A more robust and obvious design.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Manager Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3798995.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3798995.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:07:46 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;Manager Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html&quot;&gt;Service Object&lt;/A&gt; that manages a process providing a clear interface to the steps available and necessary to complete the process.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When a step by step process must be followed to complete a business procedure, it benefits client coders if the interface to the process is provided in the form of an object that acts like a tour guide through the process. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Manager Objects are just &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/3/21/3594107.html&quot;&gt;application services&lt;/A&gt; that manage a step by step process as opposed to a process that is just kicked off and then completes.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A common mistake when writing manager code is turning the manager into a “god class” or “agent.” God classes are the result of procedural coding with anemic objects. God classes pull data from other objects to make decisions as opposed to letting objects make their own determinations based on their data. It is everything object-oriented design is not.&amp;nbsp;Good managers are like good managers in real life. Good managers trust us to do the right thing, but clearly direct us. Bad managers don’t trust us, meddle in our business, and end up making all the decisions.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;An Agent class is similar and it tends to arise from developers not personifying objects (making them smart and able to do things). An agent class manages work between two or more objects as opposed to giving the work to one of the objects. Some feel that creating business services that work with objects leads developers to create agent and god classes that do all the work. I read once that no one sets out to create a god class, but when certain designs are combined with rushed schedules and multiple developers the god classes will emerge over time anyway. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Finally, another misstep that I have fallen prey to before is over-engineering the manager. It is good to make things easy for our client code, but if we assume that our client code is completely ignorant of the process then we can end up jumping through way too many hoops to manage things that the client could. The manager then becomes a source of bugs and frustration brought on by questionable complexity. I have found that it is plenty helpful enough if a manager labels the steps of a process based on their order, allows for the creation of a final result object after the last method is called, and or holds on to basic state changes while it is being used. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;A quick example of a Manager Service managing state would be a QuizManager that is constructed with a Quiz and a Timestamp. The QuizManager would have methods for stepping through the Questions which would require it track the current question the client is on.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Service Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html</guid>
    <pubDate>Fri, 18 Jul 2008 12:01:55 -0500</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;&lt;U&gt;Service Object&lt;/U&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Intent&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create an object that provides services related to one or more objects or subsystems that abstracts processes away into a minimum amount of simpler calls to accomplish a goal.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Why&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Although we would like to believe we can create a complete object-oriented business application without anything that smells of procedural code, we often cannot. When client code knows that a process needs to happen but not &lt;EM&gt;how&lt;/EM&gt; or &lt;EM&gt;who&lt;/EM&gt; is involved in the process, we benefit from a service that can provide access to the process and hide the manipulation of objects behind the scenes to get the job done. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;FONT face=Arial&gt;Implementation Notes&lt;/FONT&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Service is a broad term, and in truth there are many different kinds of services. Technically any static method on an object&amp;nbsp;is a service. Service meth