Programmiergerüst entwerfen

Coldstorm

Gesperrt
Hi,
ich bin relativ neu bei Java, nun wartet in meiner Schule das erste größere Gruppenprojekt auf mich.
Die Klasse besteht aus etwa 20 Schülern, wo immer ca. 3 in einer Gruppe sind und für ihr Unterprojekt verantwortlich sind.
Ich bin in der Gruppe, der dafür verantwortlich ist, eine zentrale Schnittstelle zu designen. Ich muss ein Klassendiagramm für das Framework designen (implementieren muss es dann jemand anders, damit der Lerneffekt höher ist, wenn man was falsch gemacht hat...).
Die Projekte der anderen sind z.B. 4 Gewinnt, Schach, Teamspeak, ICQ, Schiffe versenken und so weiter.
Die einzelnen Benutzer können sich am Framework anmelden und dann gegeneinander spielen.
Einer kann immer nur ein Spiel oder halt Fenster öffnen!!
Noch ein paar wichtige Sachen:
Es ist eine Client-Server-Anwendung. Es muss festgestellt werden, welche IP-Adressen/Benutzer angemeldet sind und wer mit wem kommuniziert. Das Framework gibt die Schnittstelle vor für die Kommunikation mit dem Server.
Bei Datenbankzugriff wird Query übergeben von den anderen Projekten, man bekommt dann was zurück.
Methoden können/müssen teilweise überladen werden.
Es wird ein Framework programmiert, das für ALLE Unterprojekte funktioniert.
Der Spielstand muss irgendwie gespeichert werden...
Das bildet eine Schnittstelle zu den einzelnen Unterprojekten. Ihm wird ein JPanel übergeben. Das wird dann anschließend in ein InternalFrame geladen
Die anzupassenden Schnittstellen werden alle(außer für VOIP, das läuft direkt) vom Framework geliefert.
Ich hab zwar schon einen kleinen Versuch, wie ich ein Klassendiagramm designen soll, aber das bringt euch wohl ned viel...
Wäre toll wenn wir jemand helfen könnte das zu designen. Ich bin auch schon über eine kleine Hilfe dankbar wie z.B. welche Klassen brauche ich und wieviel Interfaces...


Vielen Dank im Voraus
 
Zuletzt bearbeitet:

DosCoder

Erfahrenes Mitglied
Hi,
pushen solltest du hier strengstens vermeiden, denn dadurch werden die Antworten umso kürzer, spärlicher und unhöflicher ausfallen!

Nun zu deinem Problem:
1. Speichern der Spielstände:
Wie wäre es mit einer XML-Datei?
2. Du brauchst zumindest eine Server- und eine Klientklasse(1), die miteinander kommunizieren. Dies geschieht entweder über Sockets und ein eigens entworfenes Protokoll oder mit Hilfe von RMI (näher möchte ich nicht darauf eingehen). Wieviele nKlassen du genau brauchst kann man nicht sagen, da hat jeder seine eigenen Techniken. (Ich bevorzuge viele sehr kleine Klassen, aber das ist Geschmackssache).

(1)Das 4GewinntProgramm, dein Schach usw. müssen natürlich über ein Objekt dieser Klasser verfügen.

Ciao
DosCoder
 

Coldstorm

Gesperrt
So...ich hab hier mal einen kleinen Entwurf gemacht, natürlich ist er noch ned komplett, aber in der Art hab ich mir das irgendwie vorgestellt...
Bitte sagt mir, was da falsch ist oder was noch dazugehört alles...passen die Klassen/Interfaces und die Beziehungen?
 

DosCoder

Erfahrenes Mitglied
Hi, irgendwie versteh ich deinen Entwurf nicht. Ich habe mal einen gemacht, so wie ich mir das vorstellen würde (ich habe ihn nur schnell mit Inkscape hingeklatscht).

Du hast verschiedene Panels, eines für jedes Spiel/jeden Aufgabenbereich.Diese alle haben wiederum ein Objekt der Klasse Network. Diese Klasse verbindet sich mit dem Server(über Sockets), empfängt und schickt Nachrichten.
Außerdem gibt es noch die Schnittstelle NetworkControlable. Sie wird von jedem Panel implementiert. Network hat ein Object von dieser Schnittstelle. Die Schnittstelle ist dazu da, dass wenn Network Nachrichten empfängt, es diese auch ans Panel weiterleiten kann.
Die Datenbank ist auf der Serverseite. Im Anmeldebildschirm gibt man also das Passwort und den Benutzernamen ein, dies wird dann über Network an den Server gesendet, der dies dann mit der Datenbank abgleicht und eine Erlaubnis/Verweigerung zurück schickt.
Diese Technik legt nahe, dass du ein eigenes Protoll brauchst, denn wie soll der Server zwischen Anmeldung und Chat unterscheiden? Überleg dir einfach ein eindeutiges Protokoll, sodass der Server weiß, was er zu tun hat. Dieses Protokoll müssen dann ALLE Programmierer verwenden.

Auf das Diagramm der Serverseite habe ich verzichtet, da du im Grunde nur den Server brauchst, der beliebig viele Runnables in einer Liste verwaltet und eine Verbindung zur Datenbank aufbaut.

Ciao
DosCoder
 

Anhänge

  • uml.jpg
    uml.jpg
    56,7 KB · Aufrufe: 66
Zuletzt bearbeitet:

Coldstorm

Gesperrt
Dankeschön...das hilft mir schon um einiges weiter.
Nun überlege ich, wie ich das dann mit den Methoden mache, damit es nicht redundant ist...welche Methoden muss ich denn unbedingt in die Klasse Network schreiben, bzw. welche müssen von den Panels überschrieben werden?
Und der SQL-String muss in die Network-Klasse, damit die einzelnen Panels ihre eigene Datenstruktur haben können, die Methode wird dann überschrieben oder?
 

DosCoder

Erfahrenes Mitglied
Hi,
die Klasse Network sieht wohl so aus (Ich bin zu faul, nochmal den Ink zu öffnen, daas hier soll also UML-Diagrammen nahe kommen, die Beziehung der Klassen haste ja schon):

Java:
public class Network{
 Socket socket;
 NetworkControlable nca;
   
  public void sendMessage();
  public void anmelden();
  public void startListening(); //In dieser Methode wird ein neuer Thread gestartet, um gleichzeitig  hören und sprechen zu können
  public void setNCA ();
}

Die Schnittstelle NetworkControlable:
Java:
public Interface NetworkControlable{
   
  public void newIncomingMessage(String message);
}

und das Panel-Grundgerüst:
Java:
public class GamePanel extends JPanel implements NetworkControlable{

   Network network;

  // neben dem Code zu Spielen/Chaten sonst igendwas kommt hier noch die Implentierung rein:
  @Override public void newIncomingMessage{
    //was du mit der Message machst, kommt auf das jeweilige Panel an
   }
}

Der Server:
Java:
public class Server{
  ArrayList<ClientHandler> clients
  Datenbankverbindung datanbank
  
  public void hearForClients()
  public void main(String[] args);

}

Da ich nicht weiß, wie ihr das mit der Datenbank macht, habe ich hier einfach mal irgendwas geschrieben(Zeile 3) :)
Desweiteren muss ein ClientHandler natürlich auch auf den Server zugreifen können, aber diese Technik solltest du dir jetzt mal selbst überlegen. (Tipp: NetworkControlable)

Ciao
DosCoder
 
Zuletzt bearbeitet:

Coldstorm

Gesperrt
das ist sehr nett, dass ihr mir helft...
Ich hab mich nochmal mit den anderen zusammengesetzt und paar Schlüsse gefasst, wie die anderen sich das auch vorstellen. Leider passt das Konzept dann nicht mehr so...
Ich will also ein Programmiergerüst für die anderen designen(implementieren NICHT), das sie dann verwenden. Außerdem benötige ich eine Datenbank(z.B. für den Login, Online-Status, aktuelle Verbindung zwischen den Usern usw, Server-Routine, die jede Minute schaut, wer online ist).

So hier mal der Entwurf für das Gerüst
Ich hoffe ihr versteht alles, was gemeint ist: Es gibt einen Login am Anfang(Logins etc. in Datenbank gespeichert), dann erscheint ein Hauptfenster, wo bestimmte User drin sind, die online User werden angezeigt. Klickt auf den User mit Rechtsklick kann man auswählen, ob man mit ihm Schach, 4 Gewinnt, SchiffeVersenken, Chatten, Teamspeak oder sonst was machen möchte...
Die ganzen Spiele erben dann vom Interface Plugin, designen muss ich das nicht, das machen die Gruppen dann selber.
Interface Plugin hat Methode , um einen anderen User aufzufordern und eine Methode um Spielstand in Datenbank zu speichern.
Außerdem ist im Entwurf rechts der Server aufgelistet, da werden zwischen Klasse Server und NetworkConnection Binärdaten ausgetauscht. Die Klasse NetworkConnection schickt und empfängt diverse Anfragen.
Irgendwo brauche ich noch eine Methode setQuery(String query), wo am besten? Bei NetworkConnection?
Meine Fragen hierzu : Welche Methoden brauche ich noch, stimmt der Entwurf so weit? Von Beziehungen und so...


Hier der Datenbankentwurf und Bemerkung und Fragen...

Ich hoffe ihr könnt mir weiterhelfen, es ist wichtig für mich.
Dann schon mal vielen Dank.

Herzliche Grüße

Coldstorm
 

Coldstorm

Gesperrt
Kann mir jemand helfen? Ich will hier nicht pushen, aber das ist wirklich wichtig für mich...es reichen auch von mir aus nur drei Sätze aus, danke...
 

DosCoder

Erfahrenes Mitglied
Hi, hatte die letzen Tage keine Zeit...
Das Diagramm passt soweit, bis auf die Schnittstelle Login, die ich nicht verstehe.
Jedes einzelne Spiel implementiert Plugin, ist das richtig?
Warum steuert dann das Hauptfenster das Plugin? Es wäre sinnvoller, das Plugin als Memebervariable gleich in NetworkConnection aufzunehmen.
Das Hauptfenster bleibt dann außenvor, es fungiert nur als Träger für die Spiele Panels.
Der Login ist ja praktisch nichts anderes als auch ein "Spiel" im Programm, es kann also ein eigenes Panel sein das ebenso mit NetworkConnection über Plugin verfügt.

Eine Anmerkung noch:
Es ist sinnvoll, an die Klasse NetworkConnection nur mit Singleton-Technologie heranzukommen, da es wenig zweckmäßig ist, in einem Programm mehrere Objekte zu haben, die mit dem Server kommunizieren. Das mit der Technologie sage ich deswegen, da du das ja auch im Diagramm erkennbar machen musst( privater Konstruktor, Memebervariable instance, öffentlich Methode getInstace).

Ciao
DosCoder
 
Zuletzt bearbeitet: