5 Objektorientiertes Design
5 Objektorientiertes Design
5 Objektorientiertes Design
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
82 3 <strong>Objektorientiertes</strong> <strong>Design</strong><br />
ge der erlaubten Zustände ist jedoch wesentlich geringer. Das gilt im Speziellen für<br />
dieses Beispiel und lässt sich auf viele Fälle in der Praxis übertragen.<br />
Die Klasse GridPosition bietet zwei Business-Methoden, die Objektverhalten<br />
beschreiben – dies sind addOffset(int, int) und setSamePos(int). Zur Demonstration<br />
von Inkonsistenzen im Objektzustand sind öffentliche set()-Methoden<br />
für die Attribute x und y definiert.<br />
public final class GridPosition<br />
{<br />
private static final int GRID_SIZE = 10;<br />
// Invariante: x,y liegen immer auf einem Raster der Größe 10<br />
private int x = 0;<br />
private int y = 0;<br />
GridPosition()<br />
{<br />
}<br />
public void addOffset(final int dx, final int dy)<br />
{<br />
// Vorbedingung: x, y auf einem beliebigen Rasterpunkt<br />
checkOnGrid(x,y);<br />
x += snapToGrid(dx);<br />
y += snapToGrid(dy);<br />
}<br />
// Nachbedingung: x + (dy \% 10), y + (dy % 10) auf einem Rasterpunkt<br />
checkOnGrid(x,y);<br />
public void setSamePos(final int pos)<br />
{<br />
// Vorbedingung: x, y auf einem beliebigen Rasterpunkt<br />
checkOnGrid(x,y);<br />
x = snapToGrid(pos);<br />
y = snapToGrid(pos);<br />
}<br />
// Nachbedingung: x = y = (pos % 10) auf einem Rasterpunkt<br />
checkOnGrid(x,y);<br />
private static void checkOnGrid(final int x, final int y)<br />
{<br />
if (x % GRID_SIZE != 0 || y % GRID_SIZE != 0)<br />
throw new IllegalStateException("invalid position, not on grid");<br />
}<br />
private int snapToGrid(final int value)<br />
{<br />
return value - value % GRID_SIZE;<br />
}<br />
public int getX() { return x; }<br />
public int getY() { return y; }<br />
}<br />
// Zur Demonstration von Problemen<br />
public void setX(final int x) { this.x = x; }<br />
public void setY(final int y) { this.y = y; }