From: Subject: Object Mentor - xpepisode.htm Date: Fri, 20 Aug 2004 13:00:02 +0300 MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0000_01C486B5.9B47E800"; type="text/html" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.objectmentor.com/resources/articles/xpepisode.htm Object Mentor - xpepisode.htm
=
800-338-6716

We=20 only sell one product: Excellence.
We are a proud sponsor of:
=20
home | search | contact us  
extreme=20 programming (XP) OO = mentoring=20 training=20
resources=20
customers=20 about = us=20 =
articles bookstore websites downloads members fun =
Winner of the 2002 Jolt Award!
=20
Agile Software Development: Principles, Patterns, and=20 Practices.
Click here to learn more. =
Debuting at Java ONE in June!

UML for Java Programmers.
Click here to=20 learn more.
=

Engineer Notebook: An Extreme Programming=20 Episode

by Robert = C. Martin and=20 Robert S. Koss


Figure=20 1=20

Figure 2 =

Note

About = the=20 Authors

           =             &= nbsp;          =20

This article = is derived=20 from a chapter of the forthcoming book Advanced = Principles,=20 Patterns and Process of Software Development, = Robert C.=20 Martin, Prentice Hall, 2001. Copyright =A9 2000 by = Robert C.=20 Martin, all rights reserved.=20

Design = and=20 programming are human activities; forget that and all = is=20 lost.

Bjarne=20 Stroustrup, 1991

 

In order to = demonstrate XP=20 (eXtreme Programming) practices, Bob Koss (RSK) and = Bob Martin=20 (RCM) will pair program a simple application while you = watch=20 like a fly on the wall. We will use test first design = and a=20 lot of refactoring to create our application. What = follows is=20 a faithful re-enactment of a programming episode that = the two=20 Bob's actually did.

RCM: "Will you = help me write=20 a little application that calculates bowling=20 scores?"

RSK: (Reflects = to himself:=20 The XP practice of pair programming says that I can't = say no,=20 when asked to help. I suppose that's especially true = when it=20 is your boss who is asking.) "Sure Bob, I'd be glad to = help."

RCM: "OK, Great. = What I'd=20 like to do is write an application that keeps track of = a=20 bowling league. It needs to record all the games, = determine=20 the ranks of the teams, determine the winners and = losers of=20 each weekly match, and accurately score each = game."

RSK: "Cool. I = used to be a=20 pretty good bowler. This will be fun. You rattled off = several=20 user stories, which one would you like to start=20 with."

RCM: "Let's = begin with=20 scoring a single game."

RSK: "Okay. What = does that=20 mean? What are the inputs and outputs for this=20 story?"

RCM: "It seems = to me that=20 the inputs are simply a sequence of throws. A throw is = just an=20 integer that tells how many pins were knocked down by = the=20 ball. The output is the data on a standard bowling = score card,=20 a set of frames populated with the pins knocked down = by each=20 throw, and marks denoting spares and strikes. The most = important number in each frame is the current game=20 score."

RSK: "Let me = sketch out a=20 little picture of this score card to give us a visual = reminder=20 of the requirements." (See Figure 1.)


Figure=20 1

RCM: "That guy = is pretty=20 erratic."

RSK: "Or drunk, = but it will=20 serve as a decent acceptance test."

RCM: "We'll need = others, but=20 let's deal with that later. How should we start? Shall = we come=20 up with a design for the system?"

RSK: "Well, = don't hate me,=20 but I wouldn't mind a UML diagram showing the problem = domain=20 concepts that we might see from the score card. That = will give=20 us some candidate objects that we can explore further = in=20 code."

RCM: (Putting on = his=20 powerful object designer hat) "OK, clearly a game = object=20 consists of a sequence of ten frames. Each frame = object=20 contains one, two, or three throws."

RSK: "Great = minds. That was=20 exactly what I was thinking. Let me quickly draw that, = but if=20 you tell Kent, I'll deny it." (See Figure = 2.)


Figure=20 2

Kent: "I'm always watching."

RSK: "Well, pick = a class ...=20 any class. Shall we start at the end of the dependency = chain=20 and work backwards? That will make testing = easier."

RCM: "Sure, why = not. Let's=20 create a test case for the Throw = class."

RSK: (Starts=20 = typing)

//TestThrow.java-------------------------------=
--
import junit.framework.*;=20

public class TestThrow extends TestCase
{
  public TestThrow(String name)
  {
    super(name);
  }
// public void test????
}

RSK: "Do you = have a clue=20 what the behavior of a Throw object should=20 be?"

RCM: "It holds = the number of=20 pins knocked down by the player."

RSK: "Okay, you = just said in=20 not so many words that it doesn't really do anything. = Maybe we=20 should come back to it and focus on an object that = actually=20 has behavior, instead of one that's just a data=20 store."

RCM: "Hmm. You = mean the=20 Throw class might not really exist?"

RSK: (Starts to = sweat. This=20 is my boss I'm working with.) "Well, if it doesn't = have any=20 behavior, how important can it be? I don't know if it = exists=20 or not yet. I'd just feel more productive if we were = working=20 on an object that had more than setters and getters = for=20 methods. But if you want to drive..." (slides the = keyboard to=20 RCM).

RCM: "Well, = let's move up=20 the dependency chain to Frame and see if there = are any=20 test cases we can write that will force us to finish=20 Throw." (Pushes the keyboard back to = RSK.)

RSK: (Wondering = if RCM is=20 leading me down a blind alley to educate me or if he = is really=20 agreeing with me) "Okay, new file, new test = case."

//TestFrame.java--------------------------------=
----
import junit.framework.*;

public class TestFrame extends TestCase
{
  public TestFrame( String name )
  {
    super( name );
  }

  //public void test???
}=20

RCM: "OK, that's = the second=20 time we've typed that. Now, can you think of any = interesting=20 test cases for Frame?"

RSK: "A frame = might provide=20 its score, the number of pins on each throw, whether = there was=20 a strike or a spare..."

RCM: "Too much = talk, not=20 enough code. Type!"

RSK: = (types)

//TestFrame.java------------------------------=
---
import junit.framework.*;

public class TestFrame extends TestCase
{
  public TestFrame( String name )
  {
    super( name );
  }

  public void testScoreNoThrows()
  {
    Frame f =3D new Frame();
    assertEquals( 0, f.getScore() );
  }
}=20

//Frame.java---------------------------------------
public class Frame
{
  public int getScore()=20
  {
    return 0;
  }
}

RCM: "OK, the = test case=20 passes. But Score is a really stupid function. = It will=20 fail if we add a throw to the frame. So let's write = the test=20 case that adds some throws and then checks the=20 = score."

//TestFrame.java---------------------------------

public void testAddOneThrow()
{
  Frame f =3D new Frame();
  f.add(5);
  assertEquals(5, f.getScore());
}

RCM: "That = doesn't compile.=20 There's no add method in = Frame."

RSK: "I'll bet = if you define=20 the method it will compile."

RCM:

//Frame.java----------------------------=
-----------
public class Frame
{
  public int getScore()
  {
    return 0;
  }

  public void add(Throw t)
  {
  }
}

RCM: (Thinking = out loud)=20 "This doesn't compile because we haven't written the=20 Throw class."

RSK: "Talk to = me, Bob. The=20 test is passing an integer, and the method expects a=20 Throw object. You can't have it both ways. = Before we go=20 down the Throw path again, can you describe its = behavior?"

RCM: "Wow! I = didn't even=20 notice that I had written f.add(5). I should = have=20 written f.add(new Throw(5)), but that's ugly as = hell.=20 What I really want to write is=20 f.add(5)."

RSK: "Ugly or = not, let's=20 leave aesthetics out of it for the time being. Can you = describe any behavior of a Throw object =97 = binary=20 response, Bob?"

RCM: = "101101011010100101. I=20 don't know if there is any behavior in Throw; = I'm=20 beginning to think a Throw is just an = int.=20 However, we don't need to consider that yet, since we = can=20 write Frame.add to take an = int."

RSK: "Then I = think we should=20 do that for no other reason than it's simple. When we = feel=20 pain, we can do something more = sophisticated."

RCM: = "Agreed."

//Frame.java--------------------------------=
-------
public class Frame
{
  public int getScore()
  {
    return 0;
  }

  public void add(int pins)
  {
  }
}

RCM: "OK, this = compiles and=20 fails the test. Now, let's make the test = pass."

//Frame.java---------------------------------------=

public class Frame
{
  public int getScore()
  {
    return itsScore;
  }

  public void add(int pins)
  {
    itsScore +=3D pins;
  }
  private int itsScore =3D 0;
}

RCM: "This = compiles and=20 passes the tests. But it's clearly simplistic. What's = the next=20 test case?"

RSK: "Can we = take a break=20 first?"


RCM: "That's = better.=20 Frame.add is a fragile function. What if you = call it=20 with an 11?"

RSK: "It can = throw an=20 exception if that happens. But who is calling it? Is = this=20 going to be an application framework that thousands of = people=20 will use and we have to protect against such things, = or is=20 this going to be used by you and only you? If the = latter, just=20 don't call it with an 11" (chuckle).

RCM: "Good = point, the tests=20 in the rest of the system will catch an invalid = argument. If=20 we run into trouble, we can put the check in later. = So, the=20 add function doesn't currently handle strikes or = spares. Let's=20 write a test case that expresses that."

RSK: "Hmmmm... = if we call=20 add(10) to represent a strike, what should=20 getScore return? I don't know how to write the=20 assertion, so maybe we're asking the wrong question. = Or we're=20 asking the right question to the wrong = object."

RCM: "When you = call=20 add(10), or add(3) followed by = add(7),=20 then calling getScore on the Frame is=20 meaningless. The frame would have to look ahead at = later=20 frames to calculate its score. If those later frames = don't=20 exist, then it would have to return something ugly = like -1. I=20 don't want to return -1."

RSK: "Yeah, I = hate the -1=20 idea too. You've introduced the idea of frames knowing = about=20 other frames. Who is holding these different frame=20 objects?"

RCM: "The = Game=20 object."

RSK: "So = Game depends=20 on Frame, and Frame in turn depends on=20 Game. I hate that."

RCM: = "Frames don't=20 have to depend upon Game; they could be = arranged in a=20 linked list. Each frame could hold pointers to its = next and=20 previous frames. To get the score from a frame, the = frame=20 would look backwards to get the score of the previous = frame=20 and look forwards for any spare or strike balls it=20 needs."

RSK: "Okay, I'm = feeling kind=20 of dumb because I can't visualize this. Show me some = code,=20 boss."

RCM: "Right. So, = we need a=20 test case first."

RSK: "For = Game or=20 another test for Frame?"

RCM: "I think we = need one=20 for Game, since it's Game that will = build the=20 frames and hook them up to each other."

RSK: "Do you = want to stop=20 what we're doing on Frame and do a mental long = jump to=20 Game, or do you just want to have a = MockGame=20 object that does just what we need to get Frame = working?"

RCM: "No, let's = stop working=20 on Frame and start working on Game. The = test=20 cases in Game should prove that we need the = linked list=20 of Frames."

RSK: "I'm not = sure how=20 they'll show the need for the list. I need = code."

RCM:

//TestGame.java----------------------=
--------------------
import junit.framework.*;

public class TestGame extends TestCase
{
  public TestGame(String name)
  {
    super(name);
  }

  public void testOneThrow()
  {
    Game g =3D new Game();
    g.add(5);
    assertEquals(5, g.score());
  }
}

RCM: "Does that = look=20 reasonable?"

RSK: "Sure, but = I'm still=20 looking for proof for this list of = Frames."

RCM: "Me too. = Let's keep=20 following these test cases and see where they=20 lead."

//Game.java----------------------------------
public class Game
{
  public int score()
  {
    return 0;
  }
 =20
  public void add(int pins)
  {
  }
}

RCM: "OK, this = compiles and=20 fails the test. Now let's make it = pass."

//Game.java----------------------------------
public class Game
{
  public int score()
  {
    return itsScore;
  }

  public void add(int pins)
  {
    itsScore +=3D pins;
  }
  private int itsScore =3D 0;
}

RCM: "This = passes.=20 Good."

RSK: "I can't = disagree with=20 it. But I'm still looking for this great proof of the = need for=20 a linked list of frame objects. That's what led us to=20 Game in the first place."

RCM: "Yeah, = that's what I'm=20 looking for too. I fully expect that once we start = injecting=20 spare and strike test cases, we'll have to build = frames and=20 tie them together in a linked list. But I don't want = to build=20 that until the code forces us to."

RSK: "Good = point. Let's keep=20 going in small steps on Game. What about = another test=20 that tests two throws but with no spare?"

RCM: "OK, that = should pass=20 right now. Let's try = it."

//TestGame.java--------------------------------------=
----

public void testTwoThrowsNoMark()
  {
    Game g =3D new Game();
    g.add(5);
    g.add(4);
    assertEquals(9, g.score());
}

RCM: "Yep, that = one passes.=20 Now let's try four balls, with no marks."

RSK: "Well, that = will pass=20 too. I didn't expect this. We can keep adding throws, = and we=20 don't ever even need a Frame. But we haven't = done a=20 spare or a strike yet. Maybe that's when we'll have to = make=20 one."

RCM: "That's = what I'm=20 counting on. However, consider this test = case:"

//TestGame.java------------------------------------=
------
public void testFourThrowsNoMark()
  {
    Game g =3D new Game();
    g.add(5);
    g.add(4);
    g.add(7);
    g.add(2);
    assertEquals(18, g.score());
    assertEquals(9, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
  }
  

RCM: "Does this = look=20 reasonable?"

RSK: "It sure = does. I forgot=20 that we have to be able to show the score in each = frame. Ah,=20 our sketch of the score card was serving as a coaster = for my=20 Diet Coke. Yeah, that's why I forgot."

RCM: (Sigh) "OK, = first let's=20 make this test case fail by adding the = scoreForFrame=20 method to = Game."

//Game.java---------------------------------=
-

public int scoreForFrame(int frame)
{
  return 0;
}

RCM: "Great, = this compiles=20 and fails. Now, how do we make it pass?"

RSK: "We can = start making=20 frame objects. But is that the simplest thing that = will get=20 the test to pass?"

RCM: "No, = actually, we could=20 just create an array of integers in Game. Each = call to=20 add would append a new integer onto the array. = Each=20 call to scoreForFrame will just work forward = through=20 the array and calculate the = score."

//Game.java----------------------------------
public class Game
{
  public int score()
  {
    return itsScore;
  }

  public void add(int pins)
    {
      itsThrows[itsCurrentThrow++]=3Dpins;
      itsScore +=3D pins;
    }

  public int scoreForFrame(int frame)
    {
    int score =3D 0;
    for ( int ball =3D 0;=20
      frame > 0 && (ball < itsCurrentThrow);=20
      ball+=3D2, frame--)
    {
      score +=3D itsThrows[ball] + itsThrows[ball+1];
    }
    return score;
  }
  private int itsScore =3D 0;
  private int[] itsThrows =3D new int[21];
  private int itsCurrentThrow =3D 0;
}

RCM: (Very = satisfied with=20 himself) "There, that works."

RSK: "Why the = magic number=20 21?"

RCM: "That's the = maximum=20 possible number of throws in a game."

RSK: "Yuck. Let = me guess, in=20 your youth you were a Unix hacker and prided yourself = on=20 writing an entire application in one statement that = nobody=20 else could decipher.

"scoreForFrame = needs to be=20 refactored to be more communicative. But before we = consider=20 refactoring, let me ask another question: Is = Game the=20 best place for this method? In my mind, Game is = violating Bertrand Meyer's SRP (Single Responsibility=20 Principle) [1].=20 It is accepting throws and it knows how to = score for=20 each frame. What would you think about a Scorer = object?"

RCM: (Makes a = rude=20 oscillating gesture with his hand) "I don't know where = the=20 functions live now; right now I'm interested in = getting the=20 scoring stuff to work. Once we've got that all in = place,=20 then we can debate the values of the = SRP.

"However, I see your = point about=20 the Unix hacker stuff; let's try to simplify that=20 loop."

public int scoreForFrame(int =
theFrame)
{
  int ball =3D 0;
  int score=3D0;
  for (int currentFrame =3D 0;=20
       currentFrame < theFrame;=20
       currentFrame++)
  {
    score +=3D itsThrows[ball++] + itsThrows[ball++];
  }

  return score;
}

RCM: "That's a = little=20 better, but there are side-effects in the = score+=3D=20 expression. They don't matter here because it doesn't = matter=20 which order the two addend expressions are = evaluated=20 in." (Or does it? It's possible that the two = increments could=20 be done before either array operations.)

RSK: "I suppose = we could do=20 an experiment to verify that there aren't any = side-effects,=20 but that function isn't going to work with spares and = strikes.=20 Should we keep trying to make it more readable or = should we=20 push further on its functionality?"

RCM: "The = experiment would=20 only have meaning on certain compilers. Other = compilers might=20 use different evaluation orders. Let's get rid of the = order=20 dependency and then push on with more test = cases."

public int scoreForFrame(int theFrame)
{
  int ball =3D 0;
  int score=3D0;
  for (int currentFrame =3D 0;=20
       currentFrame < theFrame;=20
       currentFrame++)
  {
    int firstThrow =3D itsThrows[ball++];
    int secondThrow =3D itsThrows[ball++];
    score +=3D firstThrow + secondThrow;
  }
 =20
  return score;
}

RCM: "OK, next = test case.=20 Let's try a spare."

public void =
testSimpleSpare()
{
  Game g =3D new Game();
}

RCM: "I'm tired = of writing=20 this. Let's refactor the test and put the creation of = the game=20 in a setUp = function."

//TestGame.java--------------------------------=
----------
import junit.framework.*;

public class TestGame extends TestCase
{
  public TestGame(String name)
  {
    super(name);
  }

  private Game g;

  public void setUp()
  {
    g =3D new Game();
  }

  public void testOneThrow()
  {
    g.add(5);
    assertEquals(5, g.score());
  }

  public void testTwoThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    assertEquals(9, g.score());
  }

  public void testFourThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    g.add(7);
    g.add(2);
    assertEquals(18, g.score());
    assertEquals(9, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
  }

  public void testSimpleSpare()
  {
  }
}

RCM: "That's = better, now=20 let's write the spare test case."

RSK: "I'll=20 drive."

public int scoreForFrame(int theFrame)
{
  int ball =3D 0;
  int score=3D0;
  for (int currentFrame =3D 0;=20
       currentFrame < theFrame;=20
       currentFrame++)
  {
    int firstThrow =3D itsThrows[ball++];
    int secondThrow =3D itsThrows[ball++];

    int frameScore =3D firstThrow + secondThrow;
    // spare needs next frames first throw
    if ( frameScore =3D=3D 10 )=20
      score +=3D frameScore + itsThrows[ball++];
    else
      score +=3D frameScore;
  }

  return score;
}

RCM: (Grabbing = the keyboard)=20 "OK, but I think the increment of ball in the=20 frameScore=3D=3D10 case shouldn't be there. = Here's a test=20 case that proves my point."

public =
void testSimpleFrameAfterSpare()
{
  g.add(3);
  g.add(7);
  g.add(3);
  g.add(2);
  assertEquals(13, g.scoreForFrame(1));
  assertEquals(18, g.score());
}

RCM: "Ha! See, = that fails.=20 Now if we just take out that pesky extra=20 increment..."

  if ( frameScore =3D=3D =
10 )=20
    score +=3D frameScore + itsThrows[ball];
	

RCM: "Uh, it = still fails....=20 Could it be that the score method is wrong? = I'll test=20 that by changing the test case to use=20 scoreForFrame(2)."

public void =
testSimpleFrameAfterSpare()
{
  g.add(3);
  g.add(7);
  g.add(3);
  g.add(2);
  assertEquals(13, g.scoreForFrame(1));
  assertEquals(18, g.scoreForFrame(2));
}

RCM: "Hmmmm.... That passes. The = score method=20 must be messed up. Let's look at it."

public =
int score()
{
  return itsScore;
}

public void add(int pins)
{
  itsThrows[itsCurrentThrow++]=3Dpins;
  itsScore +=3D pins;
}

RCM: "Yeah, = that's wrong.=20 The score method is just returning the sum of = the pins,=20 not the proper score. What we need score to do = is call=20 scoreForFrame with the current = frame."

RSK: "We don't = know what the=20 current frame is. Let's add that message to each of = our=20 current tests, one at a time, of course."

RCM: = "Right."

//TestGame.java------------------------------=
------------
  public void testOneThrow()
  {
    g.add(5);
    assertEquals(5, g.score());
    assertEquals(1, g.getCurrentFrame());
    }

//Game.java----------------------------------
  public int getCurrentFrame()
  {
    return 1;
  }
  

RCM: "OK, that = works. But=20 it's stupid. Let's do the next test = case."

public void testTwoThrowsNoMark()
{
  g.add(5);
  g.add(4);
  assertEquals(9, g.score());
  assertEquals(1, g.getCurrentFrame());
}

RCM: "That one's = uninteresting; let's try the = next."

public void testFourThrowsNoMark()
{
  g.add(5);
  g.add(4);
  g.add(7);
  g.add(2);
  assertEquals(18, g.score());
  assertEquals(9, g.scoreForFrame(1));
  assertEquals(18, g.scoreForFrame(2));
  assertEquals(2, g.getCurrentFrame());
}

RCM: "This one = fails. Now=20 let's make it pass."

RSK: "I think = the algorithm=20 is trivial. Just divide the number of throws by two, = since=20 there are two throws per frame. Unless we have a = strike ...=20 but we don't have strikes yet, so let's ignore them = here=20 too."

RCM: (Flails = around adding=20 and subtracting one until it = works)

public int getCurrentFrame()
{
  return 1 + (itsCurrentThrow-1)/2;
}

RCM: "That isn't = very=20 satisfying."

RSK: "What if we = don't=20 calculate it each time? What if we adjust a=20 currentFrame member variable after each=20 throw?"

RCM: "OK, let's = try=20 = that."

//Game.java----------------------------------
  public int getCurrentFrame()
  {
    return itsCurrentFrame;
  }

  public void add(int pins)
  {
    itsThrows[itsCurrentThrow++]=3Dpins;
    itsScore +=3D pins;
    if (firstThrow =3D=3D true)
    {
      firstThrow =3D false;
      itsCurrentFrame++;
    }
    else
    {
      firstThrow=3Dtrue;;
    }
  }

  private int itsCurrentFrame =3D 0;
  private boolean firstThrow =3D true;
}

RCM: "OK, this = works. But it=20 also implies that the current frame is the frame of = the last=20 ball thrown, not the frame that the next ball will be = thrown=20 into. As long as we remember that, we'll be = fine."

RSK: "I don't = have that good=20 of a memory, so let's make it more readable. But = before we go=20 screwing around with it some more, let's pull that = code out of=20 add and put it in a private member function = called=20 adjustCurrentFrame or something."

RCM: "OK, that = sounds=20 good"

  public void add(int pins)
  {
    itsThrows[itsCurrentThrow++]=3Dpins;
    itsScore +=3D pins;
    adjustCurrentFrame();
  }

  private void adjustCurrentFrame()
  {
    if (firstThrow =3D=3D true)
    {
      firstThrow =3D false;
      itsCurrentFrame++;
    }
    else
    {
      firstThrow=3Dtrue;;
    }
  }

RCM: "Now let's = change the=20 variable and function names to be more clear. What = should we=20 call itsCurrentFrame?"

RSK: "I kind of = like that=20 name. I don't think we're incrementing it in the right = place=20 though. The current frame, to me, is the frame number = that I'm=20 throwing in. So it should get incremented right after = the last=20 throw in a frame."

RCM: "I agree. = Let's change=20 the test cases to reflect that; then we'll fix=20 = adjustCurrentFrame."

//TestGame.java---------------=
---------------------------
  public void testTwoThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    assertEquals(9, g.score());
    assertEquals(2, g.getCurrentFrame());
  }

  public void testFourThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    g.add(7);
    g.add(2);
    assertEquals(18, g.score());
    assertEquals(9, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
    assertEquals(3, g.getCurrentFrame());
  }
//TestGame.java------------------------------------------
  private void adjustCurrentFrame()
  {
    if (firstThrow =3D=3D true)
    {
      firstThrow =3D false;
    }
    else
    {
      firstThrow=3Dtrue;
      itsCurrentFrame++;
    }
  }

  private int itsCurrentFrame =3D 1;
}

RCM: "OK, that's working. Now let's test=20 getCurrentFrame in the two spare = cases."

  public void testSimpleSpare()
  {
    g.add(3);
    g.add(7);
    g.add(3);
    assertEquals(13, g.scoreForFrame(1));
    assertEquals(2, g.getCurrentFrame());
  }

  public void testSimpleFrameAfterSpare()
  {
    g.add(3);
    g.add(7);
    g.add(3);
    g.add(2);
    assertEquals(13, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
    assertEquals(3, g.getCurrentFrame());
  }
  

RCM: "This = works. Now, back=20 to the original problem. We need score to work. = We can=20 now write score to call=20 = scoreForFrame(getCurrentFrame()-1).

  public void =
testSimpleFrameAfterSpare()
  {
    g.add(3);
    g.add(7);
    g.add(3);
    g.add(2);
    assertEquals(13, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
    assertEquals(18, g.score());
    assertEquals(3, g.getCurrentFrame());
  }

//Game.java----------------------------------
  public int score()
  {
    return scoreForFrame(getCurrentFrame()-1);
  }
  

RCM: "This fails = the=20 TestOneThrow test case. Let's look at = it."

  public void testOneThrow()
  {
    g.add(5);
    assertEquals(5, g.score());
    assertEquals(1, g.getCurrentFrame());
  }
  

RCM: "With only = one throw,=20 the first frame is incomplete. The score method = is=20 calling scoreForFrame(0). This is = yucky."

RSK: "Maybe, = maybe not. Who=20 are we writing this program for, and who is going to = be=20 calling score? Is it reasonable to assume that = it won't=20 get called on an incomplete frame?"

RCM: "Yeah. But = it bothers=20 me. To get around this, we have take the score = out of=20 the testOneThrow test case. Is that what we = want to=20 do?"

RSK: "We could. = We could=20 even eliminate the entire testOneThrow test = case. It=20 was used to ramp us up to the test cases of interest. = Does it=20 really serve a useful purpose now? We still have = coverage in=20 all of the other test cases."

RCM: "Yeah, I = see your=20 point. OK, out it goes." (Edits code, runs test, and = gets=20 green bar.) "Ahhh, that's better.

"Now, we'd better work = on the=20 strike test case. After all, we want to see all those=20 Frame objects built into a linked list, don't = we?"=20 (snicker).

  public void =
testSimpleStrike()
  {
    g.add(10);
    g.add(3);
    g.add(6);
    assertEquals(19, g.scoreForFrame(1));
    assertEquals(28, g.score());
    assertEquals(3, g.getCurrentFrame());
  }
  

RCM: "OK, this = compiles and=20 fails as predicted. Now we need to make it = pass."

//Game.java----------------------------------
public class Game
{
  public void add(int pins)
  {
    itsThrows[itsCurrentThrow++]=3Dpins;
    itsScore +=3D pins;
    adjustCurrentFrame(pins);
  }

  private void adjustCurrentFrame(int pins)
  {
    if (firstThrow =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        itsCurrentFrame++;
      else
        firstThrow =3D false;
    }
    else
    {
      firstThrow=3Dtrue;
      itsCurrentFrame++;
    }
  }

  public int scoreForFrame(int theFrame)
  {
    int ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      int firstThrow =3D itsThrows[ball++];
      if (firstThrow =3D=3D 10)
      {
        score +=3D 10 + itsThrows[ball] + itsThrows[ball+1];
      }
      else
      {
        int secondThrow =3D itsThrows[ball++];

        int frameScore =3D firstThrow + secondThrow;
        // spare needs next frames first throw
        if ( frameScore =3D=3D 10 )
          score +=3D frameScore + itsThrows[ball];
        else
        score +=3D frameScore;
      }=20
   =20
    }

    return score;
  }
  private int itsScore =3D 0;
  private int[] itsThrows =3D new int[21];
  private int itsCurrentThrow =3D 0;
  private int itsCurrentFrame =3D 1;
  private boolean firstThrow =3D true;
}

RCM: "OK, that = wasn't too=20 hard. Let's see if it can score a perfect = game."

  public void testPerfectGame()
  {
    for (int i=3D0; i<12; i++)
    {
      g.add(10);
    }
    assertEquals(300, g.score());
    assertEquals(10, g.getCurrentFrame());
  }
  

RCM: "Urg, it's = saying the=20 score is 330. Why would that be?"

RSK: "Because = the current=20 frame is getting incremented all the way to = 12."

RCM: "Oh! We = need to limit=20 it to 10."

  private void =
adjustCurrentFrame(int pins)
  {
    if (firstThrow =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        itsCurrentFrame++;
      else
        firstThrow =3D false;
    }
    else
    {
      firstThrow=3Dtrue;
      itsCurrentFrame++;
    }
    itsCurrentFrame =3D Math.min(10, itsCurrentFrame);
  }
RCM: "Damn, now it's=20 saying that the score is 270. What's going on?" =

 

RSK: "Bob, the = score=20 function is subtracting one from = getCurrentFrame, so=20 it's giving you the score for frame 9, not = 10."

RCM: What? You = mean I should=20 limit the current frame to 11 not 10? I'll try = it.

itsCurrentFrame =3D =
Math.min(11, itsCurrentFrame);

RCM: "OK, so now = it gets the=20 score correct, but fails because the current frame is = 11 and=20 not 10. Ick! this current frame thing is a pain in the = butt.=20 We want the current frame to be the frame the player = is=20 throwing into, but what does that mean at the end of = the=20 game?"

RSK: "Maybe we = should go=20 back to the idea that the current frame is the frame = of the=20 last ball thrown."

RCM: "Or maybe = we need to=20 come up with the concept of the last completed = frame?=20 After all, the score of the game at any point in time = is the=20 score in the last completed frame."

RSK: "A = completed frame is a=20 frame that you can write the score into, = right?"

RCM: "Yes, a = frame with a=20 spare in it completes after the next ball. A frame = with a=20 strike in it completes after the next two balls. A = frame with=20 no mark completes after the second ball in the=20 frame.

"Wait a minute.... We = are trying to=20 get the score method to work, right? All we = need to do=20 is force score to call scoreForFrame(10) = if the=20 game is complete."

RSK: "How do we = know if the=20 game is complete?"

RCM: "If=20 adjustCurrentFrame ever tries to increment=20 itsCurrentFrame past the 10th frame, then the = game is=20 complete."

RSK: "Wait. All = you are=20 saying is that if getCurrentFrame returns 11, = the game=20 is complete; that's the way the code works = now!"

RCM: "Hmm. You = mean we=20 should change the test case to match the = code?"

  public void testPerfectGame()
  {
    for (int i=3D0; i<12; i++)
    {
      g.add(10);
    }
    assertEquals(300, g.score());
    assertEquals(11, g.getCurrentFrame());
  }
  

RCM: "Well, that = works. I=20 suppose it's no worse than getMonth returning = zero for=20 January, but I still feel uneasy about it."

RSK: "Maybe = something will=20 occurr to us later. Right now, I think I see a bug. = May I?"=20 (Grabs keyboard.)

  public void =
testEndOfArray()
  {
    for (int i=3D0; i<9; i++)
    {
      g.add(0);
      g.add(0);
    }
    g.add(2);
    g.add(8); // 10th frame spare
    g.add(10); // Strike in last position of array.
    assertEquals(20, g.score());
  }
  

RSK: "Hmm. That = doesn't=20 fail. I thought since the 21st position of the array = was a=20 strike, the scorer would try to add the 22nd and 23rd=20 positions to the score. But I guess not."

RCM: "Hmm, you = are still=20 thinking about that scorer object, aren't you? = Anyway,=20 I see what you were getting at, but since score = never=20 calls scoreForFrame with a number larger than = 10, the=20 last strike is not actually counted as a strike. It's = just=20 counted at a 10 to complete the last spare. We never = walk=20 beyond the end of the array."

RSK: "OK, let's = pump our=20 original score card into the program."

 =
 public void testSampleGame()
  {
    g.add(1);
    g.add(4);
    g.add(4);
    g.add(5);
    g.add(6);
    g.add(4);
    g.add(5);
    g.add(5);
    g.add(10);
    g.add(0);
    g.add(1);
    g.add(7);
    g.add(3);
    g.add(6);
    g.add(4);
    g.add(10);
    g.add(2);
    g.add(8);
    g.add(6);
    assertEquals(133, g.score());
  }
  

RSK: "Well, that = works. Are=20 there any other test cases that you can think = of?"

RCM: "Yeah, = let's test a few=20 more boundary conditions. How about the poor schmuck = who=20 throws 11 strikes and then a final 9."

 =
 public void testHeartBreak()
  {
    for (int i=3D0; i<11; i++)
      g.add(10);
    g.add(9);=20
    assertEquals(299, g.score());
  }
  

RCM: "That = works. OK, how=20 about a 10th frame spare?"

  public =
void testTenthFrameSpare()
  {
    for (int i=3D0; i<9; i++)
      g.add(10);
    g.add(9);
    g.add(1);
    g.add(1);=20
    assertEquals(270, g.score());
  }
}

RCM: (Staring = happily at the=20 green bar) "That works too. I can't think of any more, = can=20 you."

RSK: "No, I = think we've=20 covered them all. Besides I really want to refactor = this mess.=20 I still see the scorer object in there=20 somewhere."

RCM: "OK, well, = the=20 scoreForFrame function is pretty messy. Let's = consider=20 it."

  public int scoreForFrame(int =
theFrame)
  {
    int ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      int firstThrow =3D itsThrows[ball++];
      if (firstThrow =3D=3D 10)
      {
        score +=3D 10 + itsThrows[ball] + itsThrows[ball+1];
      }
      else
      {
        int secondThrow =3D itsThrows[ball++];
 =20
        int frameScore =3D firstThrow + secondThrow;
        // spare needs next frames first throw
        if ( frameScore =3D=3D 10 )
          score +=3D frameScore + itsThrows[ball];
        else
          score +=3D frameScore;
      }=20

    }

    return score;
  }
  

RCM: "I'd really = like to=20 extract the body of that else clause into a seperate = function=20 named handleSecondThrow, but I can't because it = uses=20 ball, firstThrow, and secondThrow = local=20 variables."

RSK: "We could = turn those=20 locals into member variables."

RCM: "Yeah, that = kind of=20 reinforces your notion that we'll be able to pull the = scoring=20 out into its own scorer object. OK, let's give = that a=20 try."

RSK: (Grabs=20 keyboard.)

  private void =
adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        itsCurrentFrame++;
      else
        firstThrowInFrame =3D false;
    }
    else
    {
      firstThrowInFrame=3Dtrue;
      itsCurrentFrame++;
    }
    itsCurrentFrame =3D Math.min(11, itsCurrentFrame);
  }

  public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      firstThrow =3D itsThrows[ball++];
      if (firstThrow =3D=3D 10)
      {
        score +=3D 10 + itsThrows[ball] + itsThrows[ball+1];
      }
      else
      {
        secondThrow =3D itsThrows[ball++];

        int frameScore =3D firstThrow + secondThrow;
        // spare needs next frames first throw
        if ( frameScore =3D=3D 10 )
          score +=3D frameScore + itsThrows[ball];
        else
          score +=3D frameScore;
      }=20
    }

    return score;
  }
  private int ball;
  private int firstThrow;
  private int secondThrow;

  private int itsScore =3D 0;
  private int[] itsThrows =3D new int[21];
  private int itsCurrentThrow =3D 0;
  private int itsCurrentFrame =3D 1;
  private boolean firstThrowInFrame =3D true;
  

RSK: "I hadn't = expected the=20 name collision. We already had an instance variable = named=20 firstThrow. But it is better named=20 firstThrowInFrame. Anyway, this works now. So = we can=20 pull the else clause out into its own = function."

  public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      firstThrow =3D itsThrows[ball++];
      if (firstThrow =3D=3D 10)
      {
        score +=3D 10 + itsThrows[ball] + itsThrows[ball+1];
      }
      else
      {
        score +=3D handleSecondThrow();
      }=20
    }

    return score;
  }

  private int handleSecondThrow()
  {
    int score =3D 0;
    secondThrow =3D itsThrows[ball++];

    int frameScore =3D firstThrow + secondThrow;
    // spare needs next frames first throw
    if ( frameScore =3D=3D 10 )
      score +=3D frameScore + itsThrows[ball];
    else
      score +=3D frameScore;
    return score;
  }

RCM: "Look at = the structure=20 of scoreForFrame! In pseudocode, it looks = something=20 like this:"

if strike
  score +=3D 10 + nextTwoBalls();
else
  handleSecondThrow.

RCM: "What if we = changed it=20 to:"

if strike
  score +=3D 10 + nextTwoBalls();
else if spare
  score +=3D 10 + nextBall();
else
  score +=3D twoBallsInFrame()

RSK: "Geez! = That's pretty=20 much the rules for scoring bowling isn't it? OK, let's = see if=20 we can get that structure in the real function. First = let's=20 change the way the ball variable is being = incremented=20 so that the three cases manipulate it=20 independently."

  public int =
scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      firstThrow =3D itsThrows[ball];
      if (firstThrow =3D=3D 10)
      {
        ball++;
        score +=3D 10 + itsThrows[ball] + itsThrows[ball+1];
      }
      else
      {
        score +=3D handleSecondThrow();
      }=20
    }

    return score;
  }

  private int handleSecondThrow()
  {
    int score =3D 0;
    secondThrow =3D itsThrows[ball+1];

    int frameScore =3D firstThrow + secondThrow;
    // spare needs next frames first throw
    if ( frameScore =3D=3D 10 )
    {
      ball+=3D2;
      score +=3D frameScore + itsThrows[ball];
    }
    else
    {
      ball+=3D2;
      score +=3D frameScore;
    }
    return score;=20
  }
  

RCM: (Grabs = keyboard.) "OK,=20 now let's get rid of the firstThrow and=20 secondThrow variables and replace them with = appropriate=20 functions."

  public int =
scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      firstThrow =3D itsThrows[ball];
      if (strike())
      {
        ball++;
        score +=3D 10 + nextTwoBalls();
      }
      else
      {
        score +=3D handleSecondThrow();
      }=20
    }

    return score;
  }
 =20
  private boolean strike()
  {
    return itsThrows[ball] =3D=3D 10;
  }

  private int nextTwoBalls()
  {
    return itsThrows[ball] + itsThrows[ball+1];
  }
  

RCM: "That step = works; let's=20 keep going."

  private int =
handleSecondThrow()
  {
    int score =3D 0;
    secondThrow =3D itsThrows[ball+1];

    int frameScore =3D firstThrow + secondThrow;
    // spare needs next frames first throw
    if ( spare() )
    {
      ball+=3D2;
      score +=3D 10 + nextBall();
    }
    else
    {
      ball+=3D2;
      score +=3D frameScore;
    }
    return score;=20
  }

  private boolean spare()
  {
    return (itsThrows[ball] + itsThrows[ball+1]) =3D=3D 10;
  }

  private int nextBall()
  {
    return itsThrows[ball];
  }

RCM: "OK, that = works too.=20 Now let's deal with = frameScore."

  private int handleSecondThrow()
  {
    int score =3D 0;
    secondThrow =3D itsThrows[ball+1];

    int frameScore =3D firstThrow + secondThrow;
    // spare needs next frames first throw
    if ( spare() )
    {
      ball+=3D2;
      score +=3D 10 + nextBall();
    }
    else
    {
      score +=3D twoBallsInFrame();
      ball+=3D2;
    }
    return score;=20
  }

  private int twoBallsInFrame()
  {
    return itsThrows[ball] + itsThrows[ball+1];
  }
  

RSK: "Bob, you = aren't=20 incrementing ball in a consistent manner. In = the spare=20 and strike case, you increment before you calculate = the score.=20 In the twoBallsInFrame case, you increment = after=20 you calculate the score. And the code depends = upon this=20 order! What's up?"

RCM: "Sorry, I = should have=20 explained. I'm planning on moving the increments into=20 strike, spare, and = twoBallsInFrame. That=20 way they'll disappear from the scoreForFrame = function,=20 and the function will look just like our=20 pseudocode."

RSK: "OK, I'll = trust you for=20 a few more steps, but remember, I'm = watching."

Kent: "So am=20 I."

RCM: "OK, now = since nobody=20 uses firstThrow, secondThrow, and=20 frameScore anymore, we can get rid of = them."

  public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      if (strike())
      {
        ball++;
        score +=3D 10 + nextTwoBalls();
      }
      else
      {
        score +=3D handleSecondThrow();
      }=20
    }

    return score;
  }

  private int handleSecondThrow()
  {
    int score =3D 0;
    // spare needs next frames first throw
    if ( spare() )
    {
      ball+=3D2;
      score +=3D 10 + nextBall();
    }
    else
    {
      score +=3D twoBallsInFrame();
      ball+=3D2;
    }
    return score;=20
  }
  

RCM: (The = sparkle in his=20 eyes is a reflection of the green bar.) "Now, since = the only=20 variable that couples the three cases is ball, = and=20 since ball is dealt with independently in each = case, we=20 can merge the three cases together."

  =
public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      if (strike())
      {
        ball++;
        score +=3D 10 + nextTwoBalls();
      }
      else if ( spare() )
      {
        ball+=3D2;
        score +=3D 10 + nextBall();
      }
      else
      {
        score +=3D twoBallsInFrame();
        ball+=3D2;
      }
    }

    return score;
  }
  

RSK: (Peter = Lorrie Gasp)=20 "Master... Master... Let me do it. Please, let = me do=20 it."

RCM: "Ah, Igor, = you would=20 like to move the increments?"

RSK: "Yes, = master. Oh=20 yes master." (Grabs keyboard.)

  =
public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      if (strike())
        score +=3D 10 + nextTwoBalls();
      else if (spare())
        score +=3D 10 + nextBall();
      else
        score +=3D twoBallsInFrame();
    }

    return score;
  }

  private boolean strike()
  {
    if (itsThrows[ball] =3D=3D 10)
    {
      ball++;
      return true;
    }
    return false;
  }

  private boolean spare()
  {
    if ((itsThrows[ball] + itsThrows[ball+1]) =3D=3D 10)
    {
      ball +=3D 2;
      return true;
    }
    return false;
  }

  private int nextTwoBalls()
  {
    return itsThrows[ball] + itsThrows[ball+1];
  }

  private int nextBall()
  {
    return itsThrows[ball];
  }

  private int twoBallsInFrame()
  {
    return itsThrows[ball++] + itsThrows[ball++];
  }

RCM: "Well = done=20 Igor!"

RSK: "Thank you=20 master."

RCM: "Look at = that=20 scoreForFrame function. That's the rules of = bowling=20 stated about as succinctly as possible."

RSK: "But, Bob, = what=20 happened to the linked list of Frame objects?"=20 (snicker, snicker)

RCM: (Sigh) "We = were=20 bedevilled by the daemons of diagramatic overdesign. = My God,=20 three little boxes drawn on the back of a napkin, = Game,=20 Frame, and Throw, and it was still too=20 complicated and just plain wrong."

RSK: "We made a = mistake=20 starting with the Throw class. We should have = started=20 with the Game class first!"

RCM: "Indeed! = So, next time=20 let's try starting at the highest level and work=20 down."

RSK: (Gasp) "Top = Down=20 Design!??!?! Could DeMarco have been right all=20 along?"

RCM: = "Correction: Top Down=20 Test First Design. Frankly, I don't know if = this is a=20 good rule or not. It's just what would have helped us = in this=20 case. So next time, I'm going to try it and see what=20 happens."

RSK: "Yeah, OK. = Anyway we=20 still have some refactoring to do. The ball = variable is=20 just a private iterator for scoreForFrame and = its=20 minions. They should all be moved into a different=20 object."

RCM: "Oh, yes, = your=20 Scorer object. You were right after all. Let's = do=20 it."

RSK: (Grabs = keyboard and=20 takes several small steps punctuated by tests to = create the=20 = following.)

//Game.java----------------------------------
public class Game
{
  public int score()
  {
    return scoreForFrame(getCurrentFrame()-1);
  }

  public int getCurrentFrame()
  {
    return itsCurrentFrame;
  }

  public void add(int pins)
  {
    itsScorer.addThrow(pins);
    itsScore +=3D pins;
    adjustCurrentFrame(pins);
  }

  private void adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        itsCurrentFrame++;
      else
        firstThrowInFrame =3D false;
    }
    else
    {
      firstThrowInFrame=3Dtrue;
      itsCurrentFrame++;
    }
    itsCurrentFrame =3D Math.min(11, itsCurrentFrame);
  }
 =20
  public int scoreForFrame(int theFrame)
  {
    return itsScorer.scoreForFrame(theFrame);
  }

  private int itsScore =3D 0;
  private int itsCurrentFrame =3D 1;
  private boolean firstThrowInFrame =3D true;
  private Scorer itsScorer =3D new Scorer();
}

//Scorer.java-----------------------------------
public class Scorer
{
  public void addThrow(int pins)
  {
    itsThrows[itsCurrentThrow++] =3D pins;
  }

  public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      if (strike())
        score +=3D 10 + nextTwoBalls();
      else if (spare())
        score +=3D 10 + nextBall();
      else
        score +=3D twoBallsInFrame();
    }

    return score;
  }

  private boolean strike()
  {
    if (itsThrows[ball] =3D=3D 10)
    {
      ball++;
      return true;
    }
    return false;
  }

  private boolean spare()
  {
    if ((itsThrows[ball] + itsThrows[ball+1]) =3D=3D 10)
    {
      ball +=3D 2;
      return true;
    }
    return false;
  }

  private int nextTwoBalls()
  {
    return itsThrows[ball] + itsThrows[ball+1];
  }

  private int nextBall()
  {
    return itsThrows[ball];
  }

  private int twoBallsInFrame()
  {
    return itsThrows[ball++] + itsThrows[ball++];
  }

  private int ball;
  private int[] itsThrows =3D new int[21];
  private int itsCurrentThrow =3D 0;

}

RSK: "That's = much better.=20 Now Game just keeps track of frames, and = Scorer=20 just calculates the score. The SRP rocks!"

RCM: "Whatever. = But it is=20 better. Did you notice that the itsScore = variable is=20 not being used anymore?"

RSK: "Ha! You're = right.=20 Let's kill it." (Gleefully starts erasing = things.)

  public void add(int pins)
  {
    itsScorer.addThrow(pins);
    adjustCurrentFrame(pins);
  }
  

RSK: "Not bad. = Now should we=20 clean up the adjustCurrentFrame = stuff?"

RCM: "OK, let's = look at=20 it."

  private void =
adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        itsCurrentFrame++;
      else
        firstThrowInFrame =3D false;
    }
    else
    {
      firstThrowInFrame=3Dtrue;
      itsCurrentFrame++;
    }
    itsCurrentFrame =3D Math.min(11, itsCurrentFrame);
  }
  

RCM: "OK, first = let's=20 extract the increments into a single function that = also=20 restricts the frame to 11. (Brrrr. I still don't like = that=20 11.)"

RSK: "Bob, 11 = means end of=20 game."

RCM: "Yeah. = Brrrr." (Grabs=20 keyboard, makes a couple of changes punctuated by=20 tests.)

  private void =
adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if( pins =3D=3D 10 ) // strike
        advanceFrame();
      else
        firstThrowInFrame =3D false;
    }
    else
    {
      firstThrowInFrame=3Dtrue;
      advanceFrame();
    }
  }

  private void advanceFrame()
  {
    itsCurrentFrame =3D Math.min(11, itsCurrentFrame + 1);
  }
  

RCM: "OK, that's = a little=20 better. Now let's break out the strike case into its = own=20 function." (Takes a few small steps and runs tests = between=20 each.)

  private void =
adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if (adjustFrameForStrike(pins) =3D=3D false)
        firstThrowInFrame =3D false;
    } =20
    else
    {
      firstThrowInFrame=3Dtrue;
      advanceFrame();
    }
  }

  private boolean adjustFrameForStrike(int pins)
  {
    if (pins =3D=3D 10)
    {
      advanceFrame();
      return true;
    }
    return false;
  }
  

RCM: "That's = pretty good.=20 Now, about that 11."

RSK: "You really = hate that=20 don't you."

RCM: "Yeah, look = at the=20 score function:"

  public int =
score()
  {
    return scoreForFrame(getCurrentFrame()-1);
  }
  

RCM: "That -1 is = odd. It's=20 the only place we truly use getCurrentFrame, = and yet we=20 need to adjust what it returns."

RSK: "Damn, = you're right.=20 How many times have we reversed ourselves on = this?"

RCM: "Too many. = But there it=20 is. The code wants itsCurrentFrame to represent = the=20 frame of the last thrown ball, not the frame we are = about to=20 throw into."

RSK: "Sheesh, = that's going=20 to break lots of tests cases."

RCM: "Actually, = I think we=20 should remove getCurrentFrame from all the test = cases=20 and remove the getCurrentFrame function itself. = Nobody=20 really uses it."

RSK: "OK, I get = your point.=20 I'll do it. It'll be like putting a lame horse out of = its=20 misery." (Grabs = keyboard.)

//Game.java----------------------------------
  public int score()
  {
    return scoreForFrame(itsCurrentFrame);
  }

  private void advanceFrame()
  {
    itsCurrentFrame =3D Math.min(10, itsCurrentFrame + 1);
  }
  

RCM: "Oh for = crying out=20 loud. You mean to tell me that we were fretting over=20 that. All we did was change the limit from 11 = to 10 and=20 remove the -1. Cripe."=20

=20

RSK: "Yeah, = Uncle Bob, it=20 really wasn't worth all the angst we gave it."=20

=20

RCM: "OK, looks = like we are=20 done. Let's just read through the whole program and = see if=20 it's as simple and communicative as it can be." =

//Game.java----------------------------------
public class Game
{
  public int score()
  {
    return scoreForFrame(itsCurrentFrame);
  }

  public void add(int pins)
  {
    itsScorer.addThrow(pins);
    adjustCurrentFrame(pins);
  }

  private void adjustCurrentFrame(int pins)
  {
    if (firstThrowInFrame =3D=3D true)
    {
      if (adjustFrameForStrike(pins) =3D=3D false)
        firstThrowInFrame =3D false;
    }
    else
    {
      firstThrowInFrame=3Dtrue;
      advanceFrame();
    }
  }

  private boolean adjustFrameForStrike(int pins)
  {
    if (pins =3D=3D 10)
    {
      advanceFrame();
      return true;
    }
    return false;
  } =20

  private void advanceFrame()
  {
    itsCurrentFrame =3D Math.min(10, itsCurrentFrame + 1);
  }

  public int scoreForFrame(int theFrame)
  {
    return itsScorer.scoreForFrame(theFrame);
  }

  private int itsCurrentFrame =3D 0;
  private boolean firstThrowInFrame =3D true;
  private Scorer itsScorer =3D new Scorer();
}

//Scorer.java-----------------------------------
public class Scorer
{
  public void addThrow(int pins)
  {
    itsThrows[itsCurrentThrow++] =3D pins;
  }

  public int scoreForFrame(int theFrame)
  {
    ball =3D 0;
    int score=3D0;
    for (int currentFrame =3D 0;=20
         currentFrame < theFrame;=20
         currentFrame++)
    {
      if (strike())
        score +=3D 10 + nextTwoBalls();
      else if (spare())
        score +=3D 10 + nextBall();
      else
        score +=3D twoBallsInFrame();
    }

    return score;
  }

  private boolean strike()
  {
    if (itsThrows[ball] =3D=3D 10)
    {
      ball++;
      return true;
    }
    return false;
  }

  private boolean spare()
  {
    if ((itsThrows[ball] + itsThrows[ball+1]) =3D=3D 10)
    {
      ball +=3D 2;
      return true;
    }
    return false;
  }

  private int nextTwoBalls()
  {
    return itsThrows[ball] + itsThrows[ball+1];
  }

  private int nextBall()
  {
    return itsThrows[ball];
  }

  private int twoBallsInFrame()
  {
    return itsThrows[ball++] + itsThrows[ball++];
  }

  private int ball;
  private int[] itsThrows =3D new int[21];
  private int itsCurrentThrow =3D 0;
}

RCM: "OK, that = looks pretty=20 good. I can't think of anything else to do."=20

=20

RSK: "Yeah, it's = pretty.=20 Let's look over the tests for good measure."=20

=

//TestGame.java------------------------------------------
import junit.framework.*;

public class TestGame extends TestCase
{
  public TestGame(String name)
  {
    super(name);
  }

  private Game g;

  public void setUp()
  {
    g =3D new Game();
  }

  public void testTwoThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    assertEquals(9, g.score());
  }

  public void testFourThrowsNoMark()
  {
    g.add(5);
    g.add(4);
    g.add(7);
    g.add(2);
    assertEquals(18, g.score());
    assertEquals(9, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
  }

  public void testSimpleSpare()
  {
    g.add(3);
    g.add(7);
    g.add(3);
    assertEquals(13, g.scoreForFrame(1));
  }

  public void testSimpleFrameAfterSpare()
  {
    g.add(3);
    g.add(7);
    g.add(3);
    g.add(2);
    assertEquals(13, g.scoreForFrame(1));
    assertEquals(18, g.scoreForFrame(2));
    assertEquals(18, g.score());
  }

  public void testSimpleStrike()
  {
    g.add(10);
    g.add(3);
    g.add(6);
    assertEquals(19, g.scoreForFrame(1));
    assertEquals(28, g.score());
  }

  public void testPerfectGame()
  {
    for (int i=3D0; i<12; i++)
    {
      g.add(10);
    }
    assertEquals(300, g.score());
  }

  public void testEndOfArray()
  {
    for (int i=3D0; i<9; i++)
    {
      g.add(0);
      g.add(0);
    }
    g.add(2);
    g.add(8); // 10th frame spare
    g.add(10); // Strike in last position of array.
    assertEquals(20, g.score());
   }

  public void testSampleGame()
  {
    g.add(1);
    g.add(4);
    g.add(4);
    g.add(5);
    g.add(6);
    g.add(4);
    g.add(5);
    g.add(5);
    g.add(10);
    g.add(0);
    g.add(1);
    g.add(7);
    g.add(3);
    g.add(6);
    g.add(4);
    g.add(10);
    g.add(2);
    g.add(8);
    g.add(6);
    assertEquals(133, g.score());
  }

  public void testHeartBreak()
  {
    for (int i=3D0; i<11; i++)
      g.add(10);
    g.add(9);=20
    assertEquals(299, g.score());
  }

  public void testTenthFrameSpare()
  {
    for (int i=3D0; i<9; i++)
      g.add(10);
    g.add(9);
    g.add(1);
    g.add(1);=20
    assertEquals(270, g.score());
  }
}

RSK: "That = pretty much=20 covers it. Can you think of any more meaningful test=20 cases?"=20

=20

RCM: "No, I = think that's the=20 set. There aren't any there that I'd be comfortable = removing=20 at this point."=20

=20

RSK: "Then we're = done."=20

=20

RCM: "I'd say = so. Thanks a=20 lot for you help."=20

=20

RSK: "No = problem, it was=20 fun."=20

=20

Note

[1] = Bertrand Meyer.=20 Object-Oriented Software Construction (Prentice = Hall,=20 1999).=20

=20


About=20 the Authors

Robert C. Martin = has been a=20 software professional since 1970. He is president of = Object=20 Mentor Inc., a firm of highly experienced experts that = offers=20 high level object-oriented software design consulting, = training, and development services to major = corporations=20 around the world. In 1995, he authored the = best-selling book:=20 Designing Object Oriented C++ Applications using the = Booch=20 Method, published by Prentice Hall. In 1997, he was = chief=20 editor of the book: Pattern Languages of Program = Design 3,=20 published by Addison Wesley. In 2000, he was editor of = the=20 book More C++ Gems, published by Cambridge Press. From = 1996 to=20 1998, he was the editor-in-chief of the C++ Report. He = has=20 published dozens of articles in various trade journals = and is=20 a regular speaker at international conferences and = trade=20 shows. He is currently working in the area of = lightweight=20 productive processes and is a strong advocate and = supporter of=20 Extreme Programming.=20

Dr. Robert S = Koss has been=20 programming since 1973, starting in Fortran, migrating = to C,=20 then to C++, and lately to Java, Smalltalk, and = Python. He has=20 been a senior consultant at Object Mentor Inc. for the = last=20 two years, where his duties include writing and = teaching=20 courses, mentoring clients, and participating in the=20 development of projects that are outsourced to the = company. He=20 has developed many systems in a variety of areas, from = real-time embedded controllers to large database = systems. He=20 is also a strong proponent of lightweight processes = and a very=20 vocal advocate of Extreme Programming.


=
privacy statement | terms=20 of use =A9 Copyright 1994 - 2003 Object = Mentor,=20 Inc.
------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/omlogo R0lGODlhVABQAPf/AOnx+t7n8bO2utMfKhwVENAgKomBeetqW+mEc8fS3bogJuA7NeLq84ksHIxO NcXO1fvPtZqZlePq9NXc5LLC0eHo8uLo8mp2doSbreJIPdgkLOTq8peuw7ychZQoHnIoGIl2a8PD xeXn6uLz+5tuWLJMPNLW2pskIMogKKofI3BhVmpWSMUgJ42Jg+JNQamopuju9t3l7629zOXs9MzX 4uXr8+n1/eh6aODn8M4gKo8eHXJLOd8+NKMeItYxL9dVRbBbRqkkI/aul99BNpONh+ft+NYhKuFF POZcTMMhJ5KouvOUgMEgJ9dnVdo0Md05MuTp9I2WmJaSjdQrLbEfJNkpLdouLsGHadUlLeFEOswg KNB4X8lZSOrw982rkOZWROz1/L3L2uBCOHqKk6ersJykqcggJ3ODh4igtOJLP62DaltQRLRpU9kt L+JQQtsxMKh0X+fu9mRjW9YgLNxvXc4hKVIlFrYgJbe9w9/o8eXr9ndyaudaSunv+LXG1ZoeIL7F yuzy+eNRQqqws+RNQeVUQ902MWg3J/H1+sdMO7rG0uVSRHB8etlLQsM1LOA/NtgmK946NJs1KIuL h6OgnbXE07+Tdsw7MKC0xcwgK4yGf4aNjOTs99jg6uhVRcF4WtIhK90yMbg+M//0xstmVObu9Yxc Q+zz+mVxbtni7M4tLN08M0QcEYc8Jb3K1uDl6fzgva2/0N4uL2BraOPr9Ns+OLbH2OVKQOhYRtco LLLD1NaNd9s3MeXu+OHq88IpKdvk734gGe74/fm+pOTq79o8NdAkKtQjK36Rnd42NOfv+MsjKehf T7jJ2cwhKVllYM8hKuJHQObt9Obt9ebs9Oft9Oft9ebs9bPD0uNUQoGIhKq4wsmQer4gJteEa9os LN4tLOlYSae5ytbi6bDA0dPR0EQ7M7+/vulKP35rXuCRgKI4LeJHPbKwuqRBMr8nKL8xKNvf5bSx r+NYSOLp8ssoKsy5rbfO0ufs9tEiK+ZAOowtHdvi7efSxoGVogAAACH5BAEAAP8ALAAAAABUAFAA AAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNqhEiHi6gSID8C2UiSIxdH3e5QWUklRY+X PU5IGlmyJkEEP+ox6aagJ8+edxSoTOHyz591NG1qpGOlgJkk3aJK7UlV6FCiRv+4U3rxRi0jRjI9 ZUK2LNmoVYW2LGq0BFeJCI7MMVKljhkzLJKw2MvibhImf6eqJfrS6My3Dg+0gWQFSx0tKO7m1XtX st4kevMyGdwjq1bECxtpsMLLyTFQAwrUyYFiL14WKJzhNYOiduxlTxW0fHnCMGiEjeY4WSXmSKRQ uQaAMgIqh5bKKOrUpr06R75cbYwtY3KH8IkTOjxw//tNsFiVVTyOEMow5EkoJ0+SHbOeD1qOHLKd tYaNIpMxY1hYMcUy3bl0ggfhjUdeI+DwwEMWabiQwRFZFBdNMlO8kUsB9klHW2R33QfNFG28kUwo xijg3T467EOeG5A88mAGNKYxYRppiEHcI1hg0dx0toFYwBxVPBHJE0/Ikg8Lap2wTwMuIkYHJDw8 kkUGEqbhBo2EuJBGFpH4iMV9sQUJojMFGGHFKrzwEoksGhiDlwJOBuPAW+rIYoiV7NxCSIRuLLKI luxUAU0dBdyXSSYoaMGofnehUMAAuTyxiiFIGtKGM0mY0c0JDQSTVE21gDPElRG64Gchg2bwyBR1 VP+naCb35ZBJHbLRlsMxbzzxyBBDrLKKE6Cw0A0Ld3jQwAdK3aBBetFgmaUguLhxRBs5yFrrtrU+ 1igoU6zyiBhiPMKmIZAUsBkTKXhgp01OhJIFO9G4sKUYWi6SQRtaoHmfatzalyiHBRRwjBMQsiMj m1bMoa4CTFBxQgrBqFESHXNYeYSWLogxxBHsrFIFFgMXAEoVbSRXcKI5DFxrAU4I8gUhFQb7xhxz JBHUHScEoUMrJX3jRHEZpDrhG21gocGGOQxQhQsHHMCMGJD8W/C/xxxTRRaCCJJGNEcAG8likOhG RUw9VLwRAkbwUFyqLixSzJBO+5BPAVV4goAQQiz/ccACqQlcsBG+PnKLG16DnYWMkbwBzjJEHQie KRvNE+O8LmS+yBHGaDHAAMmsAkoBj9wwDCywDLPEIhqsnCjoafyJI44THlHuI7yEUkV3PXjgwR/M alSFIUOIUbS9hDjhDDS5QPKEE5O6sAQEo4wCwRJIpFvw57k8koEbmXvp5S1gD8HDE7zIAnlMHpwQ DAkZ3dD2jDjq2zkokGgAyXwD3ILA6alDACGMsLI5aOAJ7OBY+MIHtnItgBdW0ICKqOC7d2HkB5BY xamOtwgx5KNl2xvYAg6wBL75bQHNKdgcnpCGrrkBcS7sWhooZD5evAES7FJAEJQVvIs4wQqRcBs7 /7okhilk62XQuFsusnCAG9zgABkgWa00MARcfCEbgsjGFwqRjUIIwg0zzIL5nmCFXLArBRJbVkY0 0Cu3bYwdU0BBPo4BjZXl4g3GKIAG9pSFZBCwjgPAghPSEA5c4KIQX7jiFgXhJdvJ6HlVQMFanPQB ylmEbb0aV58WMJ98OOxfRcpF08ACCSPMYXTHSMYRCsGHcBRyi4kshBfdEA12lIsHNqxLSu4QhGXd ySJNUBMvqjQvQxBwUqkxWRVCcQzX0eWHb0gDEqbJDGYggQ9b9MQVseiCBp7PCW8wFFnM0Es7mOMi jVATfHhwKl5oYA49MuWkNFCF0ZUsF7x4Qhb4wP8MflazmrjwhBWvCD52ZIEHw/ph61iwkyDsgwDn tMgPBmAFJ/BCg2LgBVieMASSbe+TruPVMNMgqGryYZrhSOQiJZSFgw6rjHMYgLHKSQACXOQHdHnD OnnwhgEYIRewKtnoQDi4KlihDU6IxBAIsQhPLKKVhjyk12z5yFB8w5Rz8JQH7FBTm0rUaW94wzCf QDKQsuysLWvZAHA2F0jkwgp7OsIiCulUQtxCH/qIxImqgNUBoICXH2AFKyAagRBUZKK5+EZFhTWF gqHGddy6mutS49M5WIEH4PSBZqcwBVWooh6/gIcjLlGFAaioBzo4hBz2sAcDkIEM7WiHAM7xABP/ vMIhPzAYJL4h1vMhymSOPeK2JEtU4EKiFkBgwyeW+4krONcSluhAB7yAAFWcDbWmiIIUImCCGmxg A9SwRhGoQY0adKEhdKiDT99KmicsQwtWs2e27APC+tYKFMcIRSMMcI8R+Ne/NgiwDYRB4H4kwiVp U0EEWiAPRIABAF3oQx/iAAMKn7ch6h2ABmShU14sAzbwbdlyQGHPlaV1WwfzRBM0MQEwKEMZAOiD MuJgDWtMwxo2EAEQivIBEEShBSEAQxykQY1qVEMa1agxDByyDGg4zaiGMEQ9+mIGLawGFLx9gxUg kUyWtUwLeLvFAUhBhHEAYAYzKAUMpkENaVhD/xrTUIYw4PAH1B5CE0SQggnAcGNpIJka15jGNOKA iIZcwnMaAAUWQnFD2fQFvgOAhFgNYYVjGKFW0DhGMt9QiAOwIQK06AOaa/BmacAAyXAGQwf28Ydg 7EAKLaAEMQAAZ0ELuhrUGPQpGkIKSYHCyhowwjFyEZnYFBCub/hG61qWX+TgcxFIgAMZZjyDGli7 BkmehpuvAQZ7tEIHH1ABrOXRhS4IutR+9vM0AuEQX4toDrvt0eg+N6Q2UPob9cQCJNogLiQ9Ah0/ AAEeAhGHalt7BqYO9DSuYYNyfPsQBpACEc4Bhj7YWNtwzrg0LsyQSyAqvnSppxHeSaTcgSXRWP94 wyNsR64j6IMLBngAAKaB5pqTV9vTqAYAquGAYKxACtvdM5u1XQ2iX5zjC6EDC4rbsnwwZy6fYyMW 1pqaXXkvgexghyyAsAkTnOLa5K1BtWstaBvAwQ5yAPoLcHAKP9uY7NqewZIdwgJn1Eo2xqb39uyJ GtagAAu5cMICViELVZAgCiYAgHdnQI1qN17QRJ6BMIhAAAVL4RyB6EOtNS6NIaf5IYmgMmT0IimW gZk1zgBzwfACQiOUUhQgiMAETkELWkhj1GN/uzTAgAdWrCACESiHMNw8jQpbIw40jsM0aDGDh6iD CU+pDVSW3q9I5cD6aaWNFhCNghIYgBKvAAD/A2pf7ZojPN3KeIU5fh6BeAij6NSgMAyOb+NrF9oh XGBCXmgDmNg8BTONsn+xsX19oUdGcAemoA0v4Au9wAAOKHa4B4GMZwMqsAZE8AL4MHPVUHMSKHbU sAHs9hC/0CmdMhtP8RN1Zyz69xeYsXTFIgkgMAkCAACcMH4MsAGMB14QKHY1MHlrwGAuFneMJ4Hl twFIxxCkoH+A8SEogBZ3sII80Q2bcQclyAJU4ACaAGQAUHu0cIMOiINo1niAdgrnsAJAxmdsJnaC dm1gKAFHyBCJoBdkUXecMhRU4BNUoRIQ0xMekA6TQAQyx4Xj14W0QHPmNwNdYAIq0AImIAwI/0de M4APNXAN1SYBEgAFFWANEvELO6EAUWEsCPYSKXAHpEgUaLQSKdAKBqAJUjAB4mcBFSAB9JAH9EAP 01AEEkALNaAHetAL8ZAOLRADgTAD2pZrJmACwzgDDAAFmNh8EbEL7zAVpMg+vVFnPYBGhTGKOrAD k/B94ccAFoAD9CABOCCO/DAB08AAligBnEAMEQcApZBrx0cNeAAIYEAPtEAPFUAPvuALE+ENgCGF usE+vuM733GNRnECPdBj3fgC09ALElABsUgLFYADepAAiqAMXFh7pUAJEQAGjKdtAPAKZaAIiOCA +mgBDOCPE7EF70AZOhMT+zCTNNk+f3AgH/+wA1loAAJgA3oABbC4ARRZAUUACNvQC4Q4fjNQDiFw ZmlmDQAwAVHgCmDggAwgkeUYghKxCyMoGXcgk1ACJTX5AQypCZpwDjYgARYQlFCQBxUAAAKgBMsn iAzQC6UwdtoWCA8wBmEQCEJ5lRUZAFo5EYmgf55yNgcyk2G5D4G1AtrQAln4ADagjxU5jhLZBWTg DwHACV24lrnYhQ5IjIEwCHzZBRswfmsJi31wEYnwDgylGwZSkL5jB3YQg5pgAIxoAxIpkeOommUw Bp2gDAxADzhgAfQABbUXmspQA1FQmtdgg7WIA9SAEd4gCvo3FIXRA0FgB6ywiLdpAO3XB5T/iZVu qQdRcAYJAAYUSQ/GCQUSMIgboAwmwAjIYAtxUIMoWZkaAQRBgIoxsUODtQbfSQQl6Qt6wJ67iQOx CAWbwAgycAozUHsSaQG5aJWnIACzgAG6QIwOmI/lWAEbkQ4OIAm98QFcBVERFwFkIAN+kADgWJkI Gos4oA0XwAExEAfjl5K16Av0wABFsAmzgAaxkAcNmJ8VSRKoIAcrsANcxQqoUAbbwKLN4Ae6kABD uY/5KJF60AmMgApoQANbmKVYKZGcMAEXgApKIA44IJz56ZYlcQZnigqaMAjN0Ay2YAt+gA0UgA00 oAdYqY4KagFFMAFdigEU0AeW6JYKipVF/zkLF5CmwKCRoNmFvjCYGVEJmEAOfmALlaAL2FAJn/qp E8AJu7mbx9kHCdCl/oAJMYCL5IkDeYADAEAGz8AIHIAJnSB+VomP9GCpGREG5KALFDCse/qpFOAH qeCn5bioFNoHD3CmyKAENNAHmFgBsRqrFdALm/AMZ3CrnVAEY0qLODB3JREGsUCsw4oN6uoKMUCO Y7qbAAAI0IoGiiCesJgHeRAAAdALCXABzzAGHMABE1AExZmSFRAA1aAU5oqu6koBDyCLpZqgF4oK szAGaCAOlhiO+qqvADAIz/AM/nCr6AirH3qw18AVCSAD6DqsCaCWEYuvOAAGgECxZ4AGHNqQCuB6 sAEQAzEAAP8ApCGLCTQwDfoKDPyArzFAD28RBio7rORAATQwlMxaiwGwa//ACBeABtIqnvhatASB CQE7tEbbCcAQAHmwAQn7FglwrhTwtBPAAMtqqhIQAORaBhiAAZUAA7PYtQFgEORAA11gbcRAHgOR suSgqalQkTArkbmYB+QqEEpgo76wscDAAIT7EAlADrHQDMCwrNhaAQ7ouAahCJ3QBaVQbpcbETQQ C67ADzFQjjEQAOW4AbmYujWRAAnQueOoi13gq7b7u8AbvMI7vMRbvAUREAA7 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/spacer.gif R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAQAICRAEAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/omi 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 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.agileuniverse.com/images/2004tag.jpg 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 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/outerBottom R0lGODlhJgAmAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAmACYA AAiGALEJHEiwoMGDCBMqXMiwocOHECNKnAhgosSKFiFizOhwI0eGADx+TBhyJEiRJg2GRJly4MqW CFeybCkTpsqXNgnKnGlyZ06XPn/uLJlzKE+ORo9aTKr0YlKbTJtqjEozqtSGVol+zIozI9euFL9q dSp27MOyQc+iTXtyLVuSbpnCjZuVYEAAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/innerBottom R0lGODlhGgASAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAaABIA AAhLAAEIHEiwoMGC2A4qXAggIcOHAx1CfIhN4kSFFS8yrGhRI0GOHT02BCnyI8iQF09mLKlypceW HF/CjDlx5kmINlVuzAnTIM+fAAICADs= ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/leftCarret R0lGODlhEAAUAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAQABQA AAg7AAEIHEiwoMGDCBMqHIitYUOEDiMejOgQIkVsFi9mlDjxIsaOGkFS3MhRZEWSJ00+TOhxYUuX JRcODAgAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/rightCarret R0lGODlhEAAUAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAQABQA AAg9AAEIHEiwoMGDCBMSxMaQoUKBDSM+jNhQIUWHCC9iPKgxoUZsGTtyFGnwY0iKJ1GOVFny4kqJ L0E+nCkwIAA7 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/outerTop R0lGODlhJgAmAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAmACYA AAiJAAEIHEiwoMGDBrEpxIawoUOBCyMqfEgRosSLDCs2xMhR40GOID0SBElSJACSKEWiTKlxJcuH LldSjCnTIc2aCG/iTKjzJc+eIT8CLflzaMeiRi8iTSqxIFOiA58GtSgV48iqVqNiVUp1a0StXr+e DNt0LNmFXc+aPTuR7Ve3aOHKnUu3rl2FAQEAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/banner/innerTop R0lGODlhGgASAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAaABIA AAhFALEJHEiwoEGCAA4qLAigocOFBx1KfAhx4MSLCStixAhx40aFHj1GDPmRIcmSFk+ixKZSpMCW LmHGlMmR5kebNXHqJBkQADs= ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/books/pppBookCover.jpg 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 SpUqH1PEmel4V//Z ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/images/books/UMLFJPCover.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAHbAWcDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD42f8A 1K/U0ynv/ql+pplAF2JSBk9+ajuwSRgE0kbtEQr4wealaZBg7sg0hop7W/umja3oat/aI/X9KPPj 7NQBU2P/AHTRtf8Aumrfnx+tAnj9aeoFTa3oaNr/AN01cM8frSefH6n8qNRFTY/900bH/umrfnx9 M/pR58fr+lLUZU2P/dNG1/7pq558fqfyo8+P1/SnqBT2v6Gja/oauefH6n8qTz4/X9KNRFTY3ofy pRG5OApq2Z48daPOjOBuo1DQqmKQfwmrsasEXKnpTTJGP4hVhbjgYUYxSYx6bGP+rP5VahsvMXcA oqqLhCemPersN+iDAPX2poZGtpKg4Q1PbwyBSCpzn0q9DfwuAOn4Vdt5YZFyADTsNIzraM5AKHPq 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 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/resources/articles/images/publications/bowling1 R0lGODlhWAJGAPcAAAAAAP////7+/vz8/Pv7+/n5+ff39/X19fPz8/Dw8O7u7uzs7Ovr6+jo6Ofn 5+Xl5eLi4uDg4N/f39zc3Nra2tjY2NbW1tTU1NPT09HR0c7Ozs3NzcvLy8jIyMfHx8TExMLCwsHB wb6+vry8vLq6urm5ube3t7S0tLOzs7CwsK+vr62traqqqqmpqaenp6WlpaOjo6GhoZ6enp2dnZqa mpmZmZaWlpWVlZOTk5GRkY6OjoyMjIuLi4iIiIeHh4WFhYODg4CAgH5+fnx8fHp6enh4eHd3d3V1 dXJycnBwcG9vb2xsbGpqamhoaGZmZmVlZWNjY2FhYV9fX11dXVtbW1lZWVZWVlVVVVJSUlFRUU9P T01NTUpKSkhISEZGRkVFRUNDQ0BAQD4+Pjw8PDs7Ozg4ODc3NzU1NTMzMzExMS8vLywsLCsrKygo KCYmJiUlJSIiIiAgIB8fHx0dHRoaGhkZGRcXFxUVFRMTExEREQ8PDwwMDAoKCggICAYGBgQEBAIC AgEBAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIIALAAAAABYAkYA AAj/AAMIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUoUZxE8a9goXcq0qdI1Zsqocep0jZ02VJWqKVMmadM1dd54 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 AQEAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/resources/articles/images/publications/bowling2 R0lGODlhnAFMAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Z mf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8A Zv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZ M8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wA AJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm /5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/ zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZm mWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNm MzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/ AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz /wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAnAFMAAAI/wABCBxI sKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bN mzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZsw2v qV3Ltq3bt3Djyp1Lt67bl3bz6t3Ldy/evoADC67L8dpXwy4Rd1XMkjHah461Rk45GWvlk5cfJ8xc lTNJz1NBixSteSBpqKc/pna6umNrtK+XxtY4O2ltjLfH5ja6u2Jvor8nBvc6PGhxiMd/Jne4PGtz ns8XRtc5fXNp5Ic/m1ZLsDrO4ZfXdv+/Djn7aMSK05vfyP2geoHeQ69XDQC96fvEC9dn+J48//kg 2Qcffot5lFl7A/r3X34jCbhfggW6tuCDCioUn03POdgfV+Ah1N+FUYFIU4bbMSbiTB0miB6CFFbo IYAqnSiTjC26aBCNMNGII1482vgigy3tmFiPPt4II2VHoiSkbUli1qRJSyLVHFvflRReSFTmFN2V qrXV2XnwRUlggyxCaGBP04lX0HIOSpVcmWGK56WaWZ6ppIlYdsddnXKmB6d+d46XZ310tkcngWL+ 2GWcaxpm6IqP0hfjnljK6Z6KA24o4aSOjgZhp59iWqOWlW5XoqMrxumlgYO1+qagqor/iqqaXboq mKcUgpprpvslquiihIYZbKSE/gnonZQGCOt7AuqKK7LO2qneh4gqRyaCc6Y6LK2bfsbtqOzBWmyz Kn577LWOsRmqiSxqSt2TtHEZIZi/FjnmVjrCq529a+rboL/P8msmvkRyWLDAvip5sGQL25uwk0MC 2ZjA4hIc8bwTUzwwwxcb3DHCAA+K8UoPC1WylQ1blrKPJ+8bZMjKagyuyh9z/LLMLf9bs3Mr25hz wCTDLKnGP4uc8cgxyjzzVflKHDTOQtuJNJJQO5201VQTHXW3Ht+sNdYKgw0x0baWbXZef52t9tqr Bsn222oXBvfcZadN9923Job33n4pMO3334AHLvjghBdu+OGIJ6744ow37vjjkEcu+eSUV2755Zhn rvnmnHfu+eegh755QAA7 ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.objectmentor.com/resources/articles/images/spacer.gif R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAQAICRAEAOw== ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: text/css; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.objectmentor.com/includes/site.css A:link { COLOR: #4060c0; TEXT-DECORATION: none } A:visited { COLOR: #4060c0; TEXT-DECORATION: none } A:hover { COLOR: #000088; TEXT-DECORATION: underline } A:hover { COLOR: #000088; TEXT-DECORATION: underline } .generalLinks { FONT-SIZE: 0.8em; COLOR: #ffffff } A.biglink:link { FONT-WEIGHT: bold; FONT-SIZE: medium; COLOR: #4060c0; FONT-FAMILY: = sans-serif } A.biglink:visited { FONT-WEIGHT: bold; FONT-SIZE: medium; FONT-FAMILY: sans-serif } A.whitelink:link { FONT-WEIGHT: bold; FONT-SIZE: xx-small; COLOR: #ffffff; FONT-FAMILY: = sans-serif } A.whitelink:visited { FONT-WEIGHT: bold; FONT-SIZE: xx-small; COLOR: #ffffff; FONT-FAMILY: = sans-serif } .bookTitle { FONT-WEIGHT: bold; COLOR: #000080; FONT-STYLE: normal } .bookCredits { FONT-SIZE: 0.8em; COLOR: #000080; FONT-STYLE: italic } .newsBlock { FLOAT: right; MARGIN-LEFT: 5px } .news { FONT-WEIGHT: bold; COLOR: #f00000 } .portalLink { FONT-STYLE: normal; FONT-FAMILY: verdana; TEXT-DECORATION: underline } A.portalLink:hover { TEXT-DECORATION: none } ------=_NextPart_000_0000_01C486B5.9B47E800 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://127.0.0.1:1035/js.cgi?pa&r=24464 var blockedReferrer =3D 'blockedReferrer'; NS_ActualWrite=3Ddocument.write; // Popup Blocker --> RanPostamble=3D0; NS_ActualOpen=3Dwindow.open; orig_setTimeout =3D window.setTimeout; function NS_NullWindow(){this.window;} function nullDoc() { this.open =3D NS_NullWindow; this.write =3D NS_NullWindow; this.close =3D NS_NullWindow; } function NS_NewOpen(url,nam,atr){ if((nam!=3D'' && nam=3D=3Dwindow.name) || nam=3D=3D'_top'){ return(NS_ActualOpen(url,nam,atr));} obj=3Dnew NS_NullWindow(); obj.focus =3D NS_NullWindow; obj.blur =3D NS_NullWindow; obj.opener =3D this.window; obj.document =3D new nullDoc(); return(obj); } function NS_NullWindow2(){this.window;} function NS_NewOpen2(url,nam,atr){ if((nam!=3D'' && nam=3D=3Dwindow.name) || nam=3D=3D'_top'){ return(NS_ActualOpen(url,nam,atr));} return(new NS_NullWindow2()); } function op_stop() { NS_ActualOpen2=3Dwindow.open; = window.open=3DNS_NewOpen2; } function op_start() { window.open=3DNS_ActualOpen2; } function noopen_ST(one,two) { = return(orig_setTimeout("op_stop();"+one+";;op_start();",two)); } function noopen_load() {=20 op_stop(); if(orig_onload) orig_onload(); op_start(); } function noopen_unload() { op_stop(); if(orig_onunload) orig_onunload(); = op_start(); } function postamble() {=0A= =0A= if(!RanPostamble) { RanPostamble=3D1; orig_onload =3D window.onload; orig_onunload =3D window.onunload; window.onunload =3D noopen_unload; window.onload =3D noopen_load; window.open=3DNS_ActualOpen; } } window.setTimeout =3D noopen_ST; window.open=3DNS_NewOpen; ------=_NextPart_000_0000_01C486B5.9B47E800--