What we want to do here is
remove the duplication of code. What we see is lots of code that does
not use any local variable or methods which are exclusive to the owning
class. We see the potential for a new class to eliminate the
redundancy. We can try it and see if we like it. But first we run the
unit tests to be sure we are at 100% to start. First I can extract out
the boiler switch check into a separate class. We can then remove the
boiler switch check from the simulator. |
|
package
simulator.r16;
public class BoilerSwitchCheck extends Object implements Switches
{private
boolean boilerIsOn = false;
public
void checkBoilerSwitch(SimulationInterface aGUI)
{if
(wasJustSwitchedOn()) turnOnBoiler(aGUI);
if
(wasJustSwitchedOff()) turnOffBoiler(aGUI);}
private
void turnOnBoiler(SimulationInterface aGUI)
{aGUI.boilerOn();
boilerIsOn
= true;}
private
void turnOffBoiler(SimulationInterface aGUI)
{aGUI.boilerOff();
boilerIsOn
= false;}
private
boolean wasJustSwitchedOn()
{return
isSwitchedOn() && boilerIsOff();}
private
boolean wasJustSwitchedOff()
{return
isSwitchedOff() && boilerIsOn;}
private
boolean isSwitchedOff()
{return
(PIA.register & BoilerSwitch) == 0;}
private
boolean isSwitchedOn()
{return
!isSwitchedOff();}
private
boolean boilerIsOff()
{return
!boilerIsOn;};}
|
Now let's run those same unit
tests again. They run just fine so we refactored out the new class
correctly. We can refactor out the relief valve check and the warmer
switch check as well. Our simulator is now reasonably simple. |
|
package
simulator.r17;
public class Simulator extends Thread
{SimulationInterface
gui;
private
BoilerSwitchCheck boiler = new BoilerSwitchCheck();
private
ReliefValveCheck reliefValve = new ReliefValveCheck();
private
WarmerSwitchCheck warmer = new WarmerSwitchCheck();
public
Simulator (SimulationInterface aGUI)
{super();
gui
= aGUI;}
public
void run()
{while
(true)
{boiler.checkBoilerSwitch(gui);
reliefValve.checkReliefValve(gui);
warmer.checkWarmerSwitch(gui);
sleepOneTenthSecond();};}
private
void sleepOneTenthSecond()
{try
{sleep(100);}
catch
(InterruptedException exception)
{};};}
|
Let's run the unit tests for
this simplified simulator class. We pass the test. Now we have a
different problem to solve. We have three classes almost alike. Can we
create a single super class to hold most of the common code? I will
leave that to you. |
|