Design Ein Interface (=Schnittstelle / Definition) beschreibt, welche

Werbung
Interface
So werden Interfaces gemacht
Design
Ein Interface (=Schnittstelle / Definition) beschreibt, welche
Funktionalität eine Implementation nach Aussen anzubieten hat.
Die dahinter liegende Algorithmik wird aber der Implementation
überlassen.
Interface
So werden Interfaces gemacht
Design
Ein Interface (=Schnittstelle / Definition) beschreibt, welche
Funktionalität eine Implementation nach Aussen anzubieten hat.
Die dahinter liegende Algorithmik wird aber der Implementation
überlassen.
Analog
Ein Interface ist die Formale (in Java geschrieben) Beschreibung
des UseCase.
Interface
So werden Interfaces gemacht
Design
Ein Interface (=Schnittstelle / Definition) beschreibt, welche
Funktionalität eine Implementation nach Aussen anzubieten hat.
Die dahinter liegende Algorithmik wird aber der Implementation
überlassen.
Analog
Ein Interface ist die Formale (in Java geschrieben) Beschreibung
des UseCase.
Es ist nicht das ’Wie’, sondern das ’Was’, welches interessiert.
Interface
So werden Interfaces gemacht
Example
Für unser Beispiel soll eine Definition für ein Behältnis (=Box)
entstehen:
Goal
Was muss eine Box können, damit sie eine Box ist?
etwas in sie hineintun können (=insert)
Interface
So werden Interfaces gemacht
Example
Für unser Beispiel soll eine Definition für ein Behältnis (=Box)
entstehen:
Goal
Was muss eine Box können, damit sie eine Box ist?
etwas in sie hineintun können (=insert)
etwas aus ihr herausholen können (=remove)
Interface
So werden Interfaces gemacht
Example
Für unser Beispiel soll eine Definition für ein Behältnis (=Box)
entstehen:
Goal
Was muss eine Box können, damit sie eine Box ist?
etwas in sie hineintun können (=insert)
etwas aus ihr herausholen können (=remove)
schauen, ob die Box leer ist (=isEmpty)
Interface
So werden Interfaces gemacht
Interface Boxable
3 public interface Boxable {
25 }
Interface
So werden Interfaces gemacht
Interface Boxable
3 public interface Boxable {
4
/* *
5
* Diese Methode erlaubt das Hinzufuegen Kopie der
Referenz auf ein Exemplar einer beliebigen
Klasse (= Object ) .
6
*
7
* @param item Diese Variable erhaelt eine
Referenzkopie auf ein beliebiges Object
8
* @throws Exception Falls die ( Vor -) Bedingungen
nicht so sind , wie wir sie brauchen .
9
*/
10
public void insert ( Object item ) throws Exception ;
25 }
Interface
So werden Interfaces gemacht
Interface Boxable
3 public interface Boxable {
10
public void insert ( Object item ) throws Exception ;
12
/* *
13
* Diese Methode gibt eine Kopie der Referenz eines
Exemplares einer beliebigen Klasse (= Object )
zurueck , welches vorher mit { @link # put () }
bekanntgegeben wurde
14
*
15
* @return die Referenz auf das Object .
16
* @throws Exception Falls die ( Vor -) Bedingungen
nicht so sind , wie wir sie brauchen .
17
*/
18
public Object remove () throws Exception ;
25 }
Interface
So werden Interfaces gemacht
Interface Boxable
3 public interface Boxable {
10
public void insert ( Object item ) throws Exception ;
18
public Object remove () throws Exception ;
20
/* *
21
* Diese Methode gibt an , ob das Boxable keine
Referenz traegt (= frei ist )
22
* @return false falls eine Referenz vorhanden ist ,
sonst true
23
*/
24
public boolean isEmpty () ;
25 }
Interface
So werden Interfaces gemacht
Implementation von Boxable (SimpleBox)
3 /* *
4 * Diese Auspraegung (= Implementierung ) von { @link
Boxable } kann genau ein
5 * Element verwalten . Falls versucht wird mehrere
Elemente aufzunehmen , wird
6 * eine Exception geworfen . Falls versucht wird KEIN
Element (=
7 * < code > null </ code >) aufzunehmen , wird eine Exception
geworfen .
8 *
9 * Falls versucht wird ein Element abzugeben , obwohl
kein Element vorhanden ist ,
10 * wird eine Exception geworfen .
11 */
12 public class SimpleBox implements Boxable {
39 }
Interface
So werden Interfaces gemacht
Implementation von Boxable (SimpleBox)
12 public class SimpleBox implements Boxable {
14
/* * An diesem Ort wird das Item verwaltet */
15
private Object item ;
17
@Override
18
public Object remove () throws Exception {
24
}
26
@Override
27
public void insert ( Object item ) throws Exception {
34
}
35
@Override
36
public boolean isEmpty () {
38
}
39 }
Interface
So werden Interfaces gemacht
Implementation von Boxable (SimpleBox)
12 public class SimpleBox implements Boxable {
14
/* * An diesem Ort wird das Item verwaltet */
15
private Object item ;
17
@Override
18
public Object remove () throws Exception {
19
if ( isEmpty () )
20
throw new Exception ( " SimpleBox ist leer " ) ;
21
Object item = this . item ;
22
this . item = null ;
23
return item ;
24
}
27
public void insert ( Object item ) throws Exception {
34
}
36
public boolean isEmpty () {
38
}
39 }
Interface
So werden Interfaces gemacht
Implementation von Boxable (SimpleBox)
12 public class SimpleBox implements Boxable {
14
/* * An diesem Ort wird das Item verwaltet */
15
private Object item ;
18
public Object remove () throws Exception {
24
}
26
@Override
27
public void insert ( Object item ) throws Exception {
28
if (! isEmpty () )
29
throw new Exception (
30
" Es ist nicht moeglich KEIN Element in die
SimpleBox zu legen " ) ;
31
if ( this . item != null )
32
throw new Exception ( " SimpleBox ist bereits voll "
);
33
this . item = item ;
34
}
36
public boolean isEmpty () {
38
}
39 }
Interface
So werden Interfaces gemacht
Implementation von Boxable (SimpleBox)
12 public class SimpleBox implements Boxable {
14
/* * An diesem Ort wird das Item verwaltet */
15
private Object item ;
18
public Object remove () throws Exception {
24
}
27
public void insert ( Object item ) throws Exception {
34
}
35
@Override
36
public boolean isEmpty () {
37
return item == null ;
38
}
39 }
Interface
So werden Interfaces gemacht
Organisation in Packages
Ein Package dient zur logischen Ordnung von Java-Einheiten. Das
Arbeiten mit Packages entspricht dem Arbeiten mit einer
Verzeichnisstrucktur.
Interface
So werden Interfaces gemacht
Organisation in Packages
Eine mögliche Package Struktur in einem Projekt sieht wie folgt
aus:
ch.bfh.sws.java.mas2009
+-box
| +-api
| | +-Box.java
| +-implementation
|
+-SimpleBox.java
|
+-ShuffleBox.java
|
+-StackBox.java
|
+-QueueBox.java
+-TestBox.java
Interface
So werden Interfaces gemacht
Classname
Bei einer solchen Struktur wird jeder Klassenname ein-eindeutig:
1 package ch . bfh . sws . java . mas2009 . box . implementation ;
5 public class SimpleBox implements Box {
7 }
Interface
So werden Interfaces gemacht
Classname
Bei einer solchen Struktur wird jeder Klassenname ein-eindeutig:
1 package ch . bfh . sws . java . mas2009 . box . implementation ;
5 public class SimpleBox implements Box {
7 }
Fully Qualified Name
ch.bfh.sws.java.mas2009.box.implementation.SimpleBox.java
Interface
So werden Interfaces gemacht
Developping by Interface
Es ist üblich, dass nicht anhand einer Klasse programmiert wird,
sondern anhand eines Interfaces. Dies ermöglicht es dem
Programm mit jder beliebigen Implementation des Interfaces
umzugehen (=late binding)
Interface
So werden Interfaces gemacht
7 /* *
8 * Der BoxManager hat die Faehigkeit , mit einer
beliebigen Box zu arbeiten
9 *
10 */
11 public class BoxManager {
13
/* *
14
* Eine Box wird mit maximal 5 Elementen bestueckt .
15
* @param box Eine Referenz auf ein beliebiges
Exemplar , dessen Plan das Interface Box
implementiert .
16
* @throws Exception Falls keine Box mitgegeben wird
.
17
*/
18
public void fill ( Box box ) throws Exception {
20
...
30
}
54 }
Interface
So werden Interfaces gemacht
11 public class BoxManager {
18
public void fill ( Box box ) throws Exception {
22
if ( box == null ) throw new Exception ( " Es wurde keine
Box mitgegeben " ) ;
23
try {
24
for ( int i = 0; i < 5; i ++) {
25
box . insert ( new String ( " Item : " + i ) ) ;
26
}
27
} catch ( Exception e ) {
28
System . out . println ( e . getMessage () ) ;
29
}
30
}
54 }
Interface
So werden Interfaces gemacht
11 public class BoxManager {
18
public void fill ( Box box ) throws Exception {
20
...
30
}
31
/* *
32
* Eine Box wird komplett entleert und deren Inhalt
als String auf der Konsole angezeigt .
34
* @param box Eine Referenz auf ein beliebiges
Exemplar , dessen Plan das Interface Box
implementiert .
35
* @throws Exception Falls keine Box mitgegeben wird
.
36
*/
37
public void empty ( Box box ) throws Exception {
39
...
53
}
54 }
Interface
So werden Interfaces gemacht
11 public class BoxManager {
18
public void fill ( Box box ) throws Exception {
20
...
30
}
37
public void empty ( Box box ) throws Exception {
41
if ( box == null ) throw new Exception ( " Es wurde keine
Box mitgegeben " ) ;
42
while (! box . isEmpty () ) {
43
try {
44
System . out . println ( box . remove () ) ;
45
} catch ( Exception e ) {
46
System . out . println ( " Das darf aber nicht
passieren !: " + e . getMessage () ) ;
47
}
48
}
53
}
54 }
Interface
So werden Interfaces gemacht
Developping by Interface
Und was, wenn doch mal etwas genau von einer speziellen
Implementierung verlangt wird?
Interface
So werden Interfaces gemacht
17 public class SimpleBox implements Box {
20
...
49
/* *
50
* Spezielle Methode von SimpleBox
51
*/
52
public void mightyMethod () {
53
System . out . println ( " I am the mightiest ! " ) ;
54
}
55 }
Interface
So werden Interfaces gemacht
11 public class BoxManager {
20
...
31
/* *
32
* Eine Box wird komplett entleert und deren Inhalt
als String auf der Konsole angezeigt .
33
* Falls die Box eine SimpleBox ist , wird deren
spezielle Methode noch ausgefuehrt .
34
* @param box Eine Referenz auf ein beliebiges
Exemplar , dessen Plan das Interface Box
implementiert .
35
* @throws Exception Falls keine Box mitgegeben wird
.
36
*/
37
public void empty ( Box box ) throws Exception {
39
...
49
if ( box instanceof SimpleBox ) {
50
SimpleBox sb = ( SimpleBox ) box ;
51
sb . mightyMethod () ;
52
}
53
}
54 }
Interface
So werden Interfaces gemacht
Test by simplicity
3 /* *
4 * Definition eines beliebigen Schlosses
5 */
6 public interface Lock {
19
public void lock ( String secretKey ) throws Exception ;
33
public void unlock ( String secretKey ) throws
Exception ;
41
public boolean isLocked () ;
42 }
Interface
So werden Interfaces gemacht
Test by simplicity
6 public interface Lock {
7
/* *
8
* Fuer das Locking wird ein Schluessel in Form
eines Strings benutzt .
9
*
10
* @param secretKey
11
*
Der Schluessel mit dem das { @link Lock }
verschlossen wird .
12
* @throws Exception
13
*
<ul >
14
*
<li > Falls KEIN Schluessel (= < code > null </ code >)
mitgegeben wurde </ li >
15
*
<li > Falls das { @link Lock } bereits anderweitig
geschlossen wurde .
16
*
</ li >
17
*
</ ul >
18
*/
19
public void lock ( String secretKey ) throws Exception ;
42 }
Interface
So werden Interfaces gemacht
Test by simplicity
6 public interface Lock {
21
/* *
22
* Fuer das Unlocking wird der Schluessel benoetigt ,
welcher beim { @link Lock # lock ( String ) } zum
Zuge kam .
23
*
24
* @param secretKey
25
*
Der Schluessel mit dem das { @link Lock }
geoeffnet wird .
26
* @throws Exception
27
*
<ul >
28
*
<li > Falls das { @link Lock } bereits anderweitig
geoeffnet wurde .
29
*
<li > Falls der Schluessel falsch ist </ li >
30
*
</ li >
31
*
</ ul >
32
*/
33
public void unlock ( String secretKey ) throws
Exception ;
Interface
So werden Interfaces gemacht
Test by simplicity
6 public interface Lock {
35
/* *
36
* Statusabfrage
37
*
38
* @return < code > true </ code > , falls das { @link Lock }
verschlossen ist , sonst
39
*
< code > false </ code >
40
*/
41
public boolean isLocked () ;
42 }
Interface
So werden Interfaces gemacht
Test by simplicity
Implementation zum Testen (Der Kryptogloge ist in den Ferien)
Interface
So werden Interfaces gemacht
Interfaces defined by Interfaces
Es ist auch möglich, eine Beziehung zwischen mehreren Interfaces
zu erstellen:
6 /* *
7 * A { @link Safe } can do the things a { @link Box } can
and is able to
8 * protect itself with the abilities of a { @link Lock }
9 */
10 public interface Safe extends Box , Lock {
11 }
Interface
So werden Interfaces gemacht
Use Interfaces
Die Implementation kann dann ausschliesslich auf Interfaces
basieren:
Interface
So werden Interfaces gemacht
Use Interfaces
7
8
9
11
12
13
14
15
16
52
54
public class DefaultSafe implements Safe {
private Lock lock ;
private Box box ;
public DefaultSafe ( Lock lock , Box box ) throws
Exception
{
if ( lock == null || box == null ) throw new Exception ( " Not
all composits provided " ) ;
this . lock = lock ;
this . box = box ;
}
...
}
Interface
So werden Interfaces gemacht
Use Interfaces
7
8
9
18
19
20
21
22
52
54
public class DefaultSafe implements Safe {
private Lock lock ;
private Box box ;
@Override
public Object remove () throws Exception {
if ( this . lock . isLocked () ) throw new Exception ( " Safe
locked " ) ;
return this . box . remove () ;
}
...
}
Herunterladen