\begin{slide}{Diskussion zur Lokalität}

Die Klasse \emph{Counter} enthält zwei Bestandteile:
\begin{itemize}
\item Zähler (Stand und Änderung)
\item Anzeige (Ein- und Ausgabe)
\end{itemize}
Diese hängen \emph{zu eng} zusammen.

\emph{Beweis:} versuchen Sie,
alles, was zur Darstellung gehört.
in eine separate Klasse \emph{Display} zu verschieben ---
gelingt nicht, weil \verb|setState| eine Display-Methode aufruft.

\end{slide}
\begin{slide}{Wer--Wen?}

Man muß für Counter und Display entscheiden, \emph{wer wen} benutzt 

Falls \glqq Display benutzt Counter\grqq\ 
(und andersherum nicht),
dann kann Counter nicht das Display aktualisieren.

für Counter neue Methode \verb|String form ()|,
die aktuellen Zählerstand als String repräsentiert.
diese wird im ActionListener aufgerufen (direkt nach \verb|step|)

\end{slide}

\begin{slide}{Refaktoring: Klassen teilen}

\begin{itemize}
\item
  Klasse Counter umbenennen in Display
  (Klassennamen anclicken, dann Refactor $\to$ Rename)
\item
  neue Klasse Counter anlegen (File $\to$ New $ \to$ Class),
  dorthin Attribute \verb|int state| bewegen
  und alle Methoden, die dazugehören
\end{itemize}


\end{slide}

\begin{slide}{Refaktorisieren: Schnittstelle einfügen}

Dem Display ist es jetzt wirklich egal,
was der Counter rechnet. Schnittstelle deklarieren,
die nur die benötigten Methoden enthält.

In Counter: Refactor $\to$ Extract Interface,
neuer Name: Stepper, welche Methoden? (zwei Stück)

Noch eine andere Implementierung \verb|Texter| für Stepper hinzufügen,
soll der Reihe nach die Zeichenketten
\verb|"x", "xx", "xxx", ...| anzeigen.
(File $\to$ New $\to$ Class, implements Stepper)

In Display deklarieren/aufrufen:
\begin{verbatim}
Stepper c = // new Counter ();
          = new Texter ();
\end{verbatim}

\end{slide}
