    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: The Pet Project (part 4)</title>
        <link>https://members.accu.org/index.php/articles/491</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Design of applications and programs + Overload Journal #37 - May 2000</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c67/">Design</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c167/">37</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c67-167/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c67+167/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;The Pet Project (part 4)</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 26 May 2000 17:50:57 +01:00 or Fri, 26 May 2000 17:50:57 +01:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a></h2>
</div>
<p>I had initially intended to write three articles on my
experiences with my pet project (Monopoly &reg;) but, as you can
see, the trilogy has become a tetralogy.</p>
<p>In parts two and three a number of points were left 'until the
next article'. I'm now hoping to wrap things up and talk about
these remaining points, which relate to:</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>Object construction;</p>
</li>
<li>
<p>Class design;</p>
</li>
<li>
<p>Model-View-Controller pattern;</p>
</li>
<li>
<p>Visitor pattern;</p>
</li>
<li>
<p>UML.</p>
</li>
</ol>
</div>
<p>As you will see they cover a lot of discordant territory and
topics do not necessarily have the nice clean wrap-up I was hoping
for<sup>[<a name="d0e42" href="#ftn.d0e42" id="d0e42">1</a>]</sup>.
I hope the reasons for this become evident toward the end of the
article.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e46" id="d0e46"></a>Object
Construction</h2>
</div>
<p>Part two raised the issue of constructing objects of class
<tt class="classname">Site</tt> and <tt class=
"classname">ColourGroup</tt>. It stated that the following
constructors would not be possible:</p>
<pre class="programlisting">
class AssetSite {
public:
  AssetSite (ColourGroup&amp;, etc&hellip;);
};
class ColourGroup  {
public:
  ColourGroup (AssetSite&amp;, AssetSite&amp;);
// Utility, Mayfair &amp; OldKentRd
  ColourGroup (AssetSite&amp;, AssetSite&amp;,
                 AssetSite&amp;); 
// Most BuildingSites
  ColourGroup (AssetSite&amp;, AssetSite&amp;,
             AssetSite&amp;, AssetSite&amp;); 
// Stations
};
</pre>
<p>because an asset site cannot be created until its colour group
exists, and vice versa.</p>
<p>There can also be other problems related to construction, one of
which is related to the chance and community chest cards. Imagine
the following classes in the Monopoly implementation:</p>
<div class="variablelist">
<dl>
<dt><span class="term"><tt class="classname">Card</tt></span></dt>
<dd>
<p>abstract class for chance and community chest cards;</p>
</dd>
<dt><span class="term"><tt class=
"classname">CardPack</tt></span></dt>
<dd>
<p>a list of <tt class="classname">Card</tt>s;</p>
</dd>
<dt><span class="term"><tt class=
"classname">CardSite</tt></span></dt>
<dd>
<p>a site on the board that, when a player lands on the site, picks
a card from an <tt class="classname">CardPack</tt> list and
requests that <tt class="classname">Card</tt> to perform an action
on behalf of the current player. (See part 2, figure 3)</p>
</dd>
</dl>
</div>
<p>Now one example of a card is &quot;Advance to Trafalgar Square. If
you pass Go collect &pound;200&quot;. This type of class was represented
by the <tt class="classname">MoveRoundCard</tt>, (which derives
from <tt class="classname">Card</tt>). Let us assume it has the
following constructor:</p>
<pre class="programlisting">
MoveRoundCard (Site&amp; siteToAdvanceTo);
</pre>
<p>Let us also assume the <tt class="classname">CardSite</tt> has
the constructor:</p>
<pre class="programlisting">
CardSite (CardPack&amp; thePack);
</pre>
<p>Now in what order do we construct these objects? Well, we have
to construct the <tt class="classname">trafalgarSquare</tt> site
before the <tt class="classname">advanceToTrafalgarSquare</tt>
card, as it will get referenced in the card's constructor. Also we
have to create the <tt class="classname">CardPack</tt> before the
site's as the packs get referenced in the <tt class=
"classname">CardSite</tt>'s constructor. We end up therefore with
the following construction sequence:</p>
<pre class="programlisting">
// CardPacks
// Sites
// Cards
// Add cards into their cardPack.
</pre>
<p>Well it work's, but I find the whole thing ugly, because you
refer to <tt class="classname">CardPack</tt>s, then <tt class=
"classname">Site</tt>s, then <tt class="classname">Card</tt>s and
finally back to <tt class="classname">CardPack</tt>s again. There
is a lot of jumping around and that kind of code gives me an uneasy
feeling in the stomach.</p>
<p>When you start considering assigning <tt class=
"classname">TitleDeed</tt> objects to their <tt class=
"classname">Site</tt> and/or vice-versa, handing out pre-dealt
<tt class="classname">TitleDeed</tt>s to <tt class=
"classname">Player</tt>s, adding <tt class="classname">Player</tt>s
onto their starting <tt class="classname">Site</tt>, relating
<tt class="classname">TitleDeed</tt>s to a <tt class=
"classname">ColourGroup</tt> etc, the whole construction of objects
at the start of a <tt class="classname">Monopoly</tt> game gives me
nightmares.</p>
<p>I have no immediate answers to this, just a few thoughts that
feel like they might be considered. (Maybe someone has already
tackled a similar problem and would like to write up their
experiences).</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e172" id="d0e172"></a>Using the
Builder pattern</h3>
</div>
<p>The Design Patterns book, ref [<a href="#GoF">GoF</a>],
describes the intent of the Builder pattern as: &quot;To separate the
construction of a complex object from its representation so that
the same construction process can create different
representations.&quot;</p>
<p>It seems a laudable intent just to &quot;separate the construction of
a complex object from its representation&quot;, regardless of the fact
it has different representations or not.</p>
<p>I have not yet experimented with the use of the Builder pattern
so cannot really comment further but, although Builder keeps the
construction process separate, it does not undo any of the
complexity of the construction process.</p>
<p>A Builder pattern will probably get considered in my UML version
- see later comment - and we will see then how successful it
is.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e186" id="d0e186"></a>Default
constructors</h3>
</div>
<p>It has already been mentioned about the dilemma of construction
of <tt class="classname">ColourGroup</tt>s and <tt class=
"classname">AssetSite</tt>s. What happens when we have default
constructors for these classes? We must fix-up attributes or
associations after the object's construction.</p>
<p>So we might have:</p>
<pre class="programlisting">
AssetSite oldKentRd;
AssetSite whitechapel;

ColourGroup darkBrownColourGroup;

oldKentRd.name = &quot;Old Kent Road&quot;;
oldKentRd.colourGroup = 
                darkBrownColourGroup;
whitechapel.name = &quot;Whitechapel&quot;;
whitechapel.colourGroup =
               darkBrownColourGroup;

darkBrownColourGroup.Add (oldKentRd);
darkBrownColourGroup.Add (whitechapel);
</pre>
<p>I will not go on at this point. As you can see it is getting
long winded. It could be made a little simpler by using an
<tt class="methodname">Initialise</tt> method rather than do
attributes one by one. Anyhow my gut feeling still is not happy
with this approach so I will dismiss it in the belief that there
must be a better way.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e206" id="d0e206"></a>Decoupling</h3>
</div>
<p>The original coupling came about because, when landing on a
<tt class="classname">Site</tt> an <tt class=
"classname">Action</tt><sup>[<a name="d0e216" href="#ftn.d0e216"
id="d0e216">2</a>]</sup> was required, e.g. when landing on an
<tt class="classname">AssetSite</tt> the <tt class=
"classname">Action</tt> required is to collect rent on behalf of
the <tt class="classname">Site</tt>'s owner. In this case the
<tt class="classname">Site</tt> needs to know about all the other
<tt class="classname">Site</tt>s in the same colour group because
if they are all owned by the same owner then the rent may get
doubled.</p>
<p>If the <tt class="classname">Action</tt> of rent collection is
handled differently then the <tt class="classname">Site</tt> may
not need any knowledge of the colour group. We will be looking at
this further in this article when the <tt class=
"classname">Visitor</tt> pattern is discussed. It will also get
considered during the UML design.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e246" id="d0e246"></a>Class
design</h3>
</div>
<p>In the original implementation the <tt class=
"classname">AssetSite</tt> class actually has two uses. In one
instance it was used for a site that had visitors and, when a
player lands on the site some action occurs (collecting rent). In
the other instance they represented an <tt class=
"classname">Asset</tt> owned by a player.</p>
<p>We can deal with the first use quite quickly, as we have already
briefly mention decoupling and the possibility of executing the
<tt class="classname">Action</tt> in a different manner. Hopefully
it will resolve itself that - in addition to a <tt class=
"classname">Site</tt> not requiring knowledge of its <tt class=
"classname">ColourGroup</tt> - it may not need to know about its
visiting <tt class="classname">Player</tt>s.</p>
<div class="figure"><a name="d0e271" id="d0e271"></a>
<div class="mediaobject c2"><img src=
"/var/uploads/journals/resources/Separating%20the%20TitleDeed.png" align="middle" alt=
"Separating the TitleDeed asset from the site."></div>
<p class="title c3">Figure 1. Separating the TitleDeed asset from
the site.</p>
</div>
<p>Figure one shows one possibility of separating an <tt class=
"classname">AssetSite</tt> and <tt class=
"classname">TitleDeed</tt>. What advantages could this bring? Well
houses and hotels are assets, a player's cash is an asset and even
a get out of jail free card could be a useful asset at some stage.
This is shown in figure two.</p>
<div class="figure"><a name="d0e285" id="d0e285"></a>
<div class="mediaobject c2"><img src=
"/var/uploads/journals/resources/Further%20assets.png" align="middle" alt=
"Further assets"></div>
<p class="title c3">Figure 2. Further assets</p>
</div>
<p>This would be useful when tallying a player's assets from a
<tt class="classname">std::set&lt;Asset*&gt;</tt> for example,
where it is not necessary to worry about the type of the asset,
merely its value.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e296" id=
"d0e296"></a>Model-View-Controller</h3>
</div>
<p>One of the issues I did not like with the original
implementation was how information regarding the current state of
play was stored and which parts dealt with the control of the
game.</p>
<p>Basically the current state of a game was held in a number of
global variables, which were accessed by whichever class needed the
information.</p>
<p>The purpose of model-view-controller is to separate the data
from user control and views of that data.</p>
<div class="figure"><a name="d0e305" id="d0e305"></a>
<div class="mediaobject c2"><img src=
"/var/uploads/journals/resources/Simple%20Model-View-Controller.png" align="middle" alt=
"Simple Model-View-Controller relationships"></div>
<p class="title c3">Figure 3. Simple Model-View-Controller
relationships</p>
</div>
<p>Initially it seems logical to wrap the global data into a class
(<tt class="classname">MonopolyDocument</tt> for example) that is
responsible for not only holding the game state, but also saving
and restoring the data to / from a file. This defines the model for
the game.</p>
<p>Any view of the game simply reads the data from the document.
This is probably a case for the Observer pattern, whereby the views
are observers of the <tt class="classname">MonopolyDocument</tt>
subject (see ref [<a href="#GoF">GoF</a>]).</p>
<p>Control of that data seems a little more complicated. It could
be performed through a <tt class="classname">GameManager</tt>,
which is responsible for keeping the data in the <tt class=
"classname">MonopolyDocument</tt> in a consistent state. Any
menu-item clicks or button pushes correspond to a call of a
<tt class="classname">GameManager</tt> method. But this is not as
simple as it sounds - let us take a look at the action required
when a player lands on a community chest or chance site. When this
occurs the current player must obey the instructions on the
card.</p>
<p>For most cards this is easily handled, but sometimes the player
must make a choice (buy or sell the &quot;Get out of Jail free&quot; card).
In all cases it is necessary to display the card to the actual
player so they know what is happening.</p>
<p>So what is responsible for creating the view of the card? If the
<tt class="classname">GameManager</tt> is truly separated from
views then it should not create the window. The game might be
running as a console application, Windows application or even an
Internet application so who knows how the card gets displayed to
the player? Also, as can be seen from figure 3, the view and
controller classes are completely separated.</p>
<p>But this would mean that each of the states - a) picking up the
card, b) choosing a response<sup>[<a name="d0e344" href=
"#ftn.d0e344" id="d0e344">3</a>]</sup>, c) performing the action
and d) replacing the card - would have to be known by and recorded
in the document. This seems a bit extreme.</p>
<div class="figure"><a name="d0e348" id="d0e348"></a>
<div class="mediaobject c2"><img src=
"/var/uploads/journals/resources/Another%20view%20of%20the%20Model-View-Controller.png"
align="middle" alt=
"Another &quot;view&quot; of the Model-View-Controller relationships"></div>
<p class="title c3">Figure 4. Another &quot;view&quot; of the
Model-View-Controller relationships</p>
</div>
<p>Ref [<a href="#GoF">GoF</a>] indicates that each View has an
instance of a Controller (figure 4). The reason given is so that
views can give different responses simply by using different
controllers. This is not quite the situation we are looking at, but
it may be the Strategy pattern (the interaction between Controller
/ View) may help in performing the action required when landing on
a <tt class="classname">CardSite</tt>.</p>
<p>Yet again I shall leave any further decision making here until
it gets reconsidered during my UML design.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e364" id="d0e364"></a>The Visitor
pattern</h3>
</div>
<p>In the second article I described what happens when a player
lands on a site or picks up a chance / community chest card. The
site and card<sup>[<a name="d0e369" href="#ftn.d0e369" id=
"d0e369">4</a>]</sup> classes have a virtual function (called
Action) which gets called. That function is then responsible for
carrying out the required action. This means that the sites end up
having intimate knowledge of pretty much all the other classes in
the program. The Visitor pattern helps eliminate this highly
coupled state of affairs. (The pattern is described in refs
[<a href="#GoF">GoF</a>] and [<a href=
"#Vlissides">Vlissides</a>]).</p>
<p>Using the Visitor pattern the site passes responsibility back to
a third-party - a <tt class="classname">SiteManager</tt> say. The
<tt class="classname">SiteManager</tt> can then perform the action
required, probably via the aforementioned <tt class=
"classname">GameManager</tt>.</p>
<p>So the sequences of events becomes:</p>
<div class="figure"><a name="d0e392" id="d0e392"></a>
<div class="mediaobject c2"><img src=
"/var/uploads/journals/resources/Using%20the%20Visitor%20pattern.png" align="middle" alt=
"Using the Visitor pattern"></div>
<p class="title c3">Figure 5. Using the Visitor pattern</p>
</div>
<p>In this way <tt class="classname">Site</tt>s need only know
about the <tt class="classname">SiteManager</tt> class. The
<tt class="classname">SiteManager</tt> will know what actions need
be called on from the <tt class="classname">GameManager</tt> on
behalf of the particular type of <tt class="classname">Site</tt>.
The <tt class="classname">SiteManager</tt>'s <tt class=
"methodname">Visit</tt> function is specific for different site
types, so we have:</p>
<pre class="programlisting">
class SiteManager {
public:
  SiteManager ();
  void Visit (GoSite&amp;);
  void Visit (BuildingSite&amp;);
  void Visit (CardSite&amp;);
// etc
};
</pre>
<p>Each concrete <tt class="classname">Site</tt> class must
implement the <tt class="methodname">Accept</tt> function, e.g.</p>
<pre class="programlisting">
void CardSite::Accept (SiteManager&amp; sm){
  sm.Visit (*this);
}
</pre></div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e433" id="d0e433"></a>Pause for
thought</h3>
</div>
<p>Up to this point I have been discussing ideas of how things
might be done. This is very much how the original game was produced
all those many years ago. An idea was settled on, which seemed to
fit together, and the programming started.</p>
<p>It is design - of a sort, but the only rationale behind the
choice of classes was that they seemed correct and that I was able
to produce a working implementation of the game.</p>
<p>Some of the things I did not like about that design have been
mentioned here, but this does not mean that the alternatives are
better - just different.</p>
<p>References <a href="#Cargill">Cargill</a>, <a href=
"#Meyers">Meyers</a>, and <a href="#Meyers2">Meyers2</a> discuss
various aspects of these issues and put forward solutions for
relatively simple examples to help illustrate their point.</p>
<p>With this Pet Project applying those solutions is not always
straightforward because of other interactions required between the
classes. However, the benefits of simply trying out the solutions
are:</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>Better understanding of advantages and disadvantages of design
solutions;</p>
</li>
<li>
<p>Ability to produce better and cleaner designs for new projects
right from their start.</p>
</li>
</ol>
</div>
<p>Unfortunately, and unlike this project, real-life time-scales
and budgets often compromise some design decisions. But one is at
least able to gauge the knock-on effects of any compromises
made.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e464" id="d0e464"></a>UML</h3>
</div>
<p>So we have done design (of a sort - as mentioned), but it has
not been formal. The original implementation ended up with far too
much coupling between the classes, and even some of the &quot;solutions&quot;
discussed will not necessarily give the cleanest design and I would
like to aim for the best and simplest design<sup>[<a name="d0e469"
href="#ftn.d0e469" id="d0e469">5</a>]</sup>.</p>
<p>As you can see above, a lot of decision making has been left
until the UML design is performed - as if UML is some kind of
Utopia that will magically iron out all the problems discussed so
far. I cannot say for certain if it will, but the purpose of The
Pet Project is to be used as a real project to see how new
languages, methodologies, techniques etc can be used both
effectively and pragmatically.</p>
<p>Ref [<a href="#Martin">Martin</a>] gives a very interesting case
study for the design of a Building Security Manager. I have started
to use this same approach for Monopoly and am documenting each step
and each decision being made during the design. I have tried to
step back to square one and start the whole thing off from scratch,
without any pre-conceived ideas on classes required and what their
interactions will be. I will find it interesting to see what
differences exist in the final design and implementation when
compared to the dive-in approach I have taken so far.</p>
<p>Initially the UML Toolkit (ref [<a href=
"#Eriksson-">Eriksson-</a>]) version of Rational Rose V4.0 was
used, but its limitations in the number of use-cases and classes
allowed were quickly reached. A couple of trial editions of other
UML tools, UML-Magic and, very recently, WithClass<sup>[<a name=
"d0e485" href="#ftn.d0e485" id="d0e485">6</a>]</sup>. To date I
have yet to find one that gives me all the facilities I am after in
such a design tool - so perhaps I'll have to write one - unless
someone can recommend a better one.</p>
<p>I intend to submit my UML design to Overload when it is
complete, but given the number of years I have being playing with
C++ I guess you should not hold your breath - I might be playing
with UML until I retire.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e491" id="d0e491"></a>Addendum</h2>
</div>
<p>I noticed a footnote Francis made on the &quot;Pet Project&quot; article,
regarding encapsulating the STL container in a class that provided
the reference based interface. I had a think about this and
initially thought this was an interesting idea. Then I thought it
would be creating &quot;yet another&quot; list class. It would seem a shame
to have a further list class when <tt class=
"classname">std::list</tt> provide all the functionality required,
except for value based objects rather than reference based
ones.</p>
<p>But, as a result of the comment, it then occurred to me that it
would be useful to have a class whose sole responsibility is to
make a value out of a reference. I came up with the following,
which I believe achieves the purpose. I have quickly checked it out
but still need to think about some of the common gotcha's. Also I
am not aware if <tt class="methodname">operator=</tt> is required
in any of the STL container functionality, though I guess it would
do no harm to provide it.</p>
<pre class="programlisting">
template&lt;class T&gt;
class Ref {
public:
  Ref (T&amp; aT) : myT (&amp;aT) { }
  Ref (Ref const&amp; aRef) : myT (aRef.myT) { }
  ~Ref () { }
  Ref&amp; operator= (Ref const&amp; aRef) 
  { myT = aRef.myT; return *this; }
  operator T&amp;() { return *myT; }
private:
  Ref ();
private:
  T* myT;
};
</pre>
<p>So now, if you have the following reference based class:</p>
<pre class="programlisting">
class Player // Ref based class
{
public:
  Player () { }
  ~Player () { }
private:
  Player (Player const&amp;);
  Player&amp; operator= (Player const&amp;);
};
</pre>
<p>and the following:</p>
<pre class="programlisting">
typedef std::list&lt;Ref&lt;Player&gt; &gt; PlayerList;
</pre>
<p>It can be used as such:</p>
<pre class="programlisting">
{
  Player p;
  PlayerList playerList;
  playerList.push_back (p);
  Player&amp; pRef (playerList.back());
  playerList.pop_back ();
}
</pre>
<p>It also has the advantage that it can be used with any of the
STL containers.</p>
<p>I keep asking myself if I have missed something - I'm sure there
is a gotcha in there somewhere.</p>
<div class="sidebar">
<p class="title c3">Caution</p>
<p>Monopoly is only being used here to exemplify coding techniques.
Readers are expected to fully respect the intellectual property
rights of the owners of Monopoly. Writing software to duplicate
that game is a breach of those rights.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e527" id="d0e527"></a>References</h2>
</div>
<div class="bibliomixed"><a name="GoF" id="GoF"></a>
<p class="bibliomixed">[GoF] <span class="citetitle"><i class=
"citetitle">Design Patterns - Elements of reusable
software</i></span>, Gamma et al; Addison Wesley; ISBN
0-201-63361-2</p>
</div>
<div class="bibliomixed"><a name="Cargill" id="Cargill"></a>
<p class="bibliomixed">[Cargill] <span class="citetitle"><i class=
"citetitle">C++ Programming Style</i></span>, Tom Cargill; Addison
Wesley; ISBN 0-201-56365-7</p>
</div>
<div class="bibliomixed"><a name="Meyers" id="Meyers"></a>
<p class="bibliomixed">[Meyers] <span class="citetitle"><i class=
"citetitle">Effective C++</i></span>, Scott Meyers; Addison Wesley;
ISBN 0-201-56364-9</p>
</div>
<div class="bibliomixed"><a name="Meyers2" id="Meyers2"></a>
<p class="bibliomixed">[Meyers2] More Effective C++, Scott Meyers;
Addison Wesley; ISBN 0-201-63371-X</p>
</div>
<div class="bibliomixed"><a name="Martin" id="Martin"></a>
<p class="bibliomixed">[Martin] <span class="citetitle"><i class=
"citetitle">Designing Object Oriented C++ Applications Using the
Booch Method</i></span>, Robert Martin; Prentice Hall; ISBN
0-13-203837-4</p>
</div>
<div class="bibliomixed"><a name="Vlissides" id="Vlissides"></a>
<p class="bibliomixed">[Vlissides] <span class=
"citetitle"><i class="citetitle">Pattern Hatching - Design Patterns
Applied</i></span>, John Vlissides; Addison Wesley; ISBN
0-201-43293-5</p>
</div>
<div class="bibliomixed"><a name="Eriksson-" id="Eriksson-"></a>
<p class="bibliomixed">[Eriksson-] <span class=
"citetitle"><i class="citetitle">UML Toolkit</i></span>, Eriksson
and Penker; Wiley; ISBN 0-471-19161-2</p>
</div>
</div>
</div>
<div class="footnotes"><br>
<hr class="c4" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e42" href="#d0e42" id=
"ftn.d0e42">1</a>]</sup> So if anyone knows how to tie up some
loose ends - well, I look forward to the article</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e216" href="#d0e216" id=
"ftn.d0e216">2</a>]</sup> See part 2 for mention of how the Action
method is used.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e344" href="#d0e344" id=
"ftn.d0e344">3</a>]</sup> In the case of the &quot;Get out of Jail free&quot;
card</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e369" href="#d0e369" id=
"ftn.d0e369">4</a>]</sup> From now on I'll just mention the Site
class, but the same applies to Cards as well.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e469" href="#d0e469" id=
"ftn.d0e469">5</a>]</sup> However the metrics &quot;best&quot; and &quot;simple&quot;
are measured!</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e485" href="#d0e485" id=
"ftn.d0e485">6</a>]</sup> Comes with Borland C++ Builder
Professional V5.0</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
