# Seminararbeit: Benötige Hilfe zu Schnittstellen



## escoo (25. Mai 2011)

Hallo,
vorab: wir müssen dieses Semester eine Seminararbeit in Java schreiben, dazu habe ich folgendes bekommen: Shop-Anwendung für Handyzubehör.

Dazu mussten wir ihm ein Spezifikationsdokument abgeben, in dem grob beschrieben wird, was das Programm tun wird und welchen Inhalt es haben wird. Meins sieht folgendermaßen aus:

****************************************************************************

*
Thema:  Shop-Anwendung für Handyzubehör*

Einleitung:
Diese Anwendung soll eine Verwaltungs-Software für einen Handyshop sein. Der Verkäufer soll damit zu verkaufende Artikel anlegen können, welche in einer Art Datenbank mit ihren verschiedenen Merkmalen, wie Name, Art des Artikels, Lagerbestand, Preise, usw. gespeichert und verwaltet werden können.
Außerdem soll ebenfalls eine Verkaufs-Verwaltung integriert werden, in der der Verkäufer die vom Kunden gewünschten Artikel suchen und verkaufen kann. Hierbei wird kontrolliert, ob noch Artikel vorrätig sind, wenn ja der Lagerbestand angepasst und eine Rechnung mit dem Preis generiert wird.
Ebenfalls soll eine Kunden-Verwaltung integriert werden, in der Kunden angelegt, gelöscht und bearbeitet werden können. Beim Verkauf von Artikeln, sollen diese dem Kunden in sein Profil zugeteilt werden.

*Ausführung:*

Artikel-Verwaltung
Hier können Artikel angelegt und bearbeitet werden.
Artikel anlegen:
Artikelnummer: wird automatisch je nach Art generiert und dem Artikel zugewiesen
Art des Artikels: Akku, Datenkabel, Schutzhülle, KFZ-Halterung, …
-> Je nach Art des Artikels verschiedene Merkmale
Hersteller
Modell
Artikelname: Art + Hersteller + Modell
Lagerbestand
Preis Einkauf, Preis Verkauf
Lagerfach
Artikel bearbeiten:
Artikel suchen -> Entweder Suchfeld, oder Durchklicken durch die verschiedenen Arten, Hersteller, usw.
Alle Merkmale des gefundenen Artikels bearbeiten
Artikel löschen

Verkaufs-Verwaltung 
Ebenfalls Suchfunktion, jedoch keine Möglichkeit Eigenschaften zu ändern
Artikel kaufen: Artikel wird dem Kunden eingetragen, gekaufte Menge vom Lagerbestand abgezogen (evtl. mit Hilfe von Warenkorb)
Rechnung generieren mit Daten des Kunden und der gekauften Artikel


Kunden-Verwaltung:
Kunde anlegen:  Name, Vorname, Adresse, Kundennummer (wird automatisch generiert und zugewiesen)
Kunden suchen: nach Name, Adresse, Kundennummer
-> Informationen anzeigen (z.b. bereits gekaufte Artikel)
-> Kunden bearbeiten (z.b. ändern der Anschrift)
-> Kunden löschen
****************************************************************************

Nun habe ich es heute zurückbekommen mit den Anmerkungen:

"Schnittstellen definieren, gegen die programmiert wird, z.B.:
GUI -> iKunde <- Kunde: Klasse
Schnittstelle zur Sicherung/Speicherung:
iSicherung <- Klasse Dateisicherung

Dazu 2-3 Methoden (nicht Quellcode) mit Beschreibung, was sie tun sollen."

*Nun mein Problem: ich habe es heute erst zurückbekommen und morgen ist der Abgabetermin, d.h. wenn ich das bis morgen nicht habe, darf ich nicht an der Prüfung teilnehmen.*
Jetzt habe ich leider echt keine Ahnung, wie ich das definieren soll, welche Methoden die Interfaces enthalten sollen und wie so etwas überhaupt aussieht, da ich noch nicht beim Thema Interfaces angekommen bin.

Es sollen nur 2-3 Schnittstellen, die man in das Programm implementieren wird mit "gutem Namen" definiert werden, dazu eine Beschreibung was diese tun sollen + 2-3 Methoden pro Schnittstelle ebenfalls mit einer Beschreibung, was diese tun sollen. 

Kann mir da bitte jemand weiterhelfen ?

Danke schonmal im voraus

mfg


----------



## ARadauer (25. Mai 2011)

> Schnittstelle zur Sicherung/Speicherung:
> iSicherung <- Klasse Dateisicherung



Hier benutzt man gerne das DAO Pattern (Data Access Object) mit typischen CRUD Operationen also Create Read update delete... man definiert ein Interface das beschreibt was die Klasse macht. Irgend eine andere Klasse benutzt dann dieses Interface um zb im Falle eines DAOs Daten zu laden. Der Vorteil ist, das die benutzende Klasse nix über die konkrete Implementierung wissen muss (also wo die daten zb herkommen) 

So könnte so ein Interface aussehen...


```
public interface CustomerDao {

	public void saveCustomer(Customer customer);
	
	public Customer loadCustomerById(long id);
	
	public List<Customer> loadAllCustomers();
	
	public boolean deleteCustomer(Customer customer);
	
}
```
was eine SaveCustomer Methode macht, kannst du dir selber denken ;-)


----------



## escoo (25. Mai 2011)

Danke schonmal,
den Code habe ich verstanden, das Prinzip noch nicht, dafür habe ich aber noch Zeit, hauptsache ich kann irgendwas zu Papier bringen und ihm abgeben.

Aber was ist damit gemeint: Das GUI programmiert gegen die Schnittstelle iKunde?
der Will irgendwie 2 Schnittstellen
1. eine bei der die GUI "gegen die Schnittstelle" iKunde programmiert und 
2. eine für die Komplette Datensicherung, also nicht nur für Kunden, sondern auch für Artikel usw, also eine Schnittstelle, die mir mein Komplettes Programm in eine Datei speichert, und diese beim nächsten Start wieder läd.

Bin warscheinlich deswegen überfragt, weil ich von den Interfaces noch nix verstehe :/


----------



## SlaterB (25. Mai 2011)

stell dir vor, die Klasse Kunde wäre noch gar nicht implemiertiert, lösche sie testweise komplett aus deinem Projekt,
einige andere Klassen werden Fehler zeigen, auch die GUI

die GUI muss aber deine konkrete Klasse Kunde nicht unbedingt kennen, falls es nur darum geht den Namen abzufragen, 
es reicht ein Interface mit einer Methode getName(),
die GUI bekommt Objekte vom Typ dieses Interfaces (erstellt wurden sie natürlich zu einer bestimmten Klasse, das ist der GUI aber egal), ruft die bekannte Methode auf und fertig

falls es später mal eine andere Klasse Kunde2 gibt, so muss diese nur auch das Interface implementieren und kann genauso an die GUI übergeben werden

so, das zum Sinn von Interfaces, der in Lehrbüchern oft etwas untergeht,
wie man das konkret implementiert ist dann leicht nachzulesen
Galileo Computing :: Java ist auch eine Insel – 5.13 Schnittstellen


----------



## ARadauer (25. Mai 2011)

escoo hat gesagt.:


> Danke schonmal,
> den Code habe ich verstanden, das Prinzip noch nicht, dafür habe ich aber noch Zeit,


ja ich weiß, der Grund ist, dass Interfaces ein Problem lößt, dass dir als Anfänger noch nicht bewusst ist. Aber das wird schon...



> Aber was ist damit gemeint: Das GUI programmiert gegen die Schnittstelle iKunde?
> der Will irgendwie 2 Schnittstellen
> 1. eine bei der die GUI "gegen die Schnittstelle" iKunde programmiert und


iKunde.. is natürlich Blödsinn, kommt das vom Lehrer? Was soll das sein? Kunde würde ich eher das Fachobjekt nennen und nicht irgend eine Backend Service Klasse. eher IKundenService

Also stell dirs so vor diese Service Schicht beschreibt eher was der Benutzer macht Artikel Suchen, Artikel Kaufen, Benutzer Namen ändern.

Die Sicherungs Schicht (DAOs) darunter, wird von der Service schicht benutzt und macht eher "low level" Themen. laden, speichern, löschen.

Bei einfachen Dingen, wie Datenwartungen, kann es sein, dass diese Schichten oft sehr ähnlich sind und die Service Schicht einfach an die DAOs die Aufrufe weiterreicht...



> 2. eine für die Komplette Datensicherung, also nicht nur für Kunden, sondern auch für Artikel usw, also eine Schnittstelle, die mir mein Komplettes Programm in eine Datei speichert, und diese beim nächsten Start wieder läd.


ich würde dann aber auf jeden Fall ein DAO für jedes Fachobjekt machen (KundenDAO, ArtikelDAO,...)


----------



## escoo (25. Mai 2011)

ja dieses IKunde kommt vom Prof.
Habe ich das so dann richtig verstanden:
Die GUI interagiert mit dem Interface, das Interface mit den Klassen, und da die GUI nicht direkt die Klassen ansprechen kann, geschieht das über das Interface.

Wie würde das da dann z.B. grob gefasst funktionieren?:
Ich klicke mich durch die Benutzeroberfläche um einen neuen Kunden anzulegen, sobald ich alles ausgefüllt habe, soll der Kunde als neues Objekt angelegt und gespeichert werden?


----------



## SlaterB (25. Mai 2011)

grob gesagt steht in meinem vorherigen Post alles beschrieben,
wobei Objekterstellung naturgemäß die einzige Stelle ist, die nicht allein mit einem Interface funktioniert,
zumindest der Rest der GUI kann aber abstrakter aufgebaut werden


----------



## ARadauer (25. Mai 2011)

escoo hat gesagt.:


> Die GUI interagiert mit dem Interface, das Interface mit den Klassen, und da die GUI nicht direkt die Klassen ansprechen kann, geschieht das über das Interface.



Mhn das Interface interagiert nicht wirklich mit den Klassen. Sondern die Klassen implementieren das Interface...


----------



## escoo (25. Mai 2011)

Danke euch bisher schonmal, habe mich die letzten Stunden auch mit diesen Interfaces beschäftigt, bin aber ehrlich gesagt immer noch überfragt, was ich denn in dieses Dokument schreiben kann, damit der Prof morgen zufrieden ist 

Würden denn hier für mein komplettes Projekt 2 DAO Interfaces reichen, also eine für Kunde und eine für Artikel? Oder sollen die jetz nur zur Datensicherung sein? Muss ich nicht für z.B. Artikel ein Interface schreiben wie z.B. 

```
public interface ArticleEdit {

     public void setPriceSale ();
     public void setPriceBuy ();
     // ...
}
```

Man kann das doch einfach standard durch die Setter der jeweiligen Klasse machen?

könnte mir jemand vielleicht ein kleines Interface Beispiel für die Klasse Kunde schreiben mit 2-3 wichtigen Methoden, die da reinkommen? Ich bin mittlerweile echt am verzweifeln.


----------



## SlaterB (26. Mai 2011)

es gibt keine wichtigen Methoden, sondern jede einzelne die verwendet wird, und sei es getName(), kommt in das Interface,
evtl. nicht alle Methoden sondern nur ein Teil, wenn ein bestimmtes Programm nur einen Teil benötigt
(dieser Programmteil kann dann die Interface-Sicht nutzen, andere eben nicht)

hast du denn überhaupt schon eine Klasse Kunde mit Methoden oder ist das alles theoretisch?


----------



## escoo (26. Mai 2011)

Das ist bisher nur alles theoretisch, deswegen diese Dokument


----------



## SlaterB (26. Mai 2011)

also in einem Text, außer in einem Lehrbuch zu Schnittstellen bzw. Fragen/ Antworten hier im Forum, 
habe ich noch nie irgendwo über Aufzählung einzelner Methoden oder Interface/ Klasse gelesen oder geschrieben,

schreib meinetwegen wie bisher quasi schon besprochen "die GUI arbeitet mit Kunden über das Interface IKunde, welches alle benötigten Methoden wie getName() vorgibt", mehr kann ich nicht beitragen,

wenn solche Aufgaben tatsächlich über Prüfungen entscheiden dann wäre es Zeit, eine richtige Schule/ Uni zu suchen,
aber solche Sprüche helfen dir im Moment wohl auch nicht weiter..


----------

