[Java] Umsetzen eines Programmes

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Smokers, 18. September 2011 .

  1. 18. September 2011
    Umsetzen eines Programmes

    Hallöchen,

    ich hab nochmal eine grundlegende Verständnissfrage.
    Ich möchte mir ein kleines Programm schreiben was meine Semesternoten festhält und den aktuellen Durchschnitt errechnet.

    Dazu dachte ich an eine kleine Java Applikation.
    Klassentechnisch ist das ganze ja eigentlich relativ mau,... schließlich brauch man nur die Klasse Semester und die Klasse Modul.

    Die Klasse Semester umfasst dabei sowas wie die Semester Bezeichnung sowie eine Menge von Modulen, die dem Semester zugeordnet sind und wiederum einen Modulnamen beinhalten, sowie die Wertung(ECTS) und die erreichte Note.

    Jedoch reicht das ja für den Aufbau einer Applikation in Java nicht.
    Ich brauche dazu noch eine Klasse die das JFrame erweitert, und dort muss ich das Fenster "zusammenbauen".

    Weiterhin frage ich mich, wo die Funktionen wie "neues Semester hinzufügen" abgelegt werden muss,
    schließlich wird dort ein neuer Tab im JTabbedPane erzeugt, welcher eine Tabelle enthält die mit Modulen gefüllt werden kann etc pp.

    Wie trenne ich also diese bloße generierung der GUI von den Daten die in meinen Klassen Semester und Modul gespeichert werden.

    Wie handle ich zB die JTable mit den Modulen ?! Wo wird die Tabelle gespeichert / definiert? In der Klasse "Semester" ?

    Ich hoffe es ist nochmal einigermaßen klar wie ich das meine und was mein Problem beim Verständnis ist.

    lg
     
  2. 18. September 2011
    AW: Umsetzen eines Programmes

    das stinkt ja quasi schon nach MVC.
    Model View Controller – Wikipedia

    ich weiß nicht in wie weit du damit schon vertraut bist, aber im grunde löst dieses pattern genau deine probleme.

    http://blog.bigbasti.com/tutorial-model-view-controller-mvc-struktur-in-java-projekten-nutzen/
     
  3. 18. September 2011
    AW: Umsetzen eines Programmes

    Auf die Schnelle würde ich es folgendermaßen modellieren:

    {bild down}

    // Ein Excel-Sheet mit deinen Anforderungen lässt sich wesentlich schneller erstellen ;-)
     
  4. 18. September 2011
    AW: Umsetzen eines Programmes

    Hey!

    Abgesehen davon sollte jedes ordentliche Programm, das in einer objektorientierten Sprache geschrieben wird und ein Interface besitzt, dieses Pattern implementieren. Swing benutzt ja sogar selbst intern das MVC Pattern

    Du musst die GUI (View) Klassen von den Anwendungslogik/Datenhaltung (Model) Klassen trennen und durch Kontrollklassen (Controller) verknuepfen. Dein Programm sollte also mindestens drei Klassen haben. Wenn du aber hoehere Anforderungen hast und es gut modellierst und aufteilst, koennen es schnell ein Dutzend werden.

    Der Umfang deines Projekts scheint nicht so gross zu sein. Mit einer weniger gut durchdachten Architektur wirst du sicherlich auch zum Ziel kommen

    In dem Model deiner Applikation (d.h. z.B. Studium) werden die Daten gespeichert.
    JTable besitzt ein Model (TableModel). Du schreibst eine Klasse, die TableModel erweitert. In dieser Klasse werden die Daten, die von dem JTable in der GUI angezeigt werden, in einer bestimmten Form gespeichert (siehe API). Immer wenn sich Daten im Model deiner Applikation aendern (z.B. hinzufuegen) kannst du ueber das Observer Pattern die Daten des JTable ueber das TableModel der GUI aktualisieren. Dies kann direkt passieren oder ueber den Controller - es gibt hier verschiedene Meinungen. Deine Applikation haelt praktisch die Daten redundant im Speicher (einmal intern im Model, einmal zur Anzeige im TableModel).

    Mfg,

    Kolazomai
     
  5. 18. September 2011
    AW: Umsetzen eines Programmes

    Wichtig ist dabei, dass sowohl Model als auch View lediglich mit dem Controller kommunizieren.
    Jedenfalls wenn man es strikt einhalten möchte.

    Wenn man es anders betrachtet, könnte man es auch so implementieren, dass das TableModel Teil des Controllers ist und das Model kennt z.B. Semester. Bei Aufrufen auf dem TableModel-Objekt sieht dieses dann immer beim Model nach. Dadurch hätte man dann auch keine Redundanz.
     
  6. 19. September 2011
    AW: Umsetzen eines Programmes

    Warum denn so kompliziert?
    vom Grundprinzip her reicht doch schon eine Klasse die JFrame importiert etc und die eingetragenen Noten o.ä. abspeichert.

    Das kann man alles in eine Klasse quetschen, es geht doch hier NUR um die Durchschnittserrechnung FÜR DICH SELBST oder?
    Machst du so ein Programm fürs Studium an sich? Man kann auch einen PQ Rechner in 20 Objekte unterteilen, für solche Kleinst-Aufgaben halte ich es für übertrieben ein Klassenkonstrukt zu nutzen

    Sowieso: MACHS BESSER MIT EXCEL
     
  7. 19. September 2011
    AW: Umsetzen eines Programmes

    Ich unterstelle einfach mal, das jedem bewusst sein sollte, das es mit Excel natürlich einfacher und schneller geht. Aber da Smokers die Fragen schon so genau stellt, kann man wohl davon ausgehen, dass es ihm auch zu einem Teil ums schreiben des Programms an sich geht. Und hier trennt sich die Spreu vom Weizen vor allem durch eine durchdachte Struktur. Sich bestimmte Pattern anzueignen kann zu Lernzwecken (also wenn das Studium sowieso Informatik o.ä. ist) ja auch ganz praktisch sein. Natürlich kann man auch alles in eine einzigen Klasse schreiben, aber darum geht es hier wohl eher nicht.
     
  8. 19. September 2011
    AW: Umsetzen eines Programmes

    Ja also das es in Excel leichter geht, wusste ich natürlich ;P
    Ich will es aber a) in Java
    b) als Programm zwar für mich, aber dennoch "gut" umgesetzt.Und MVC scheint da ja angebracht zu sein.

    Bisher hab ich es soweit umgesetzt bzw hab mich an das Tutorial das murdoc gepostet hat gehalten:

    ModuleController
    Private Paste - Pastie

    ModuleModel
    Private Paste - Pastie

    ModuleView
    Private Paste - Pastie




    Ist das erstmal soweit richtig gedacht?Also ich dachte zumindest,das das die ModuleView jetzt also die Eingabemaske des Moduls ist.
    Allerdings stocke ich jetzt bei SemesterView .
    Ich weiß gerade nicht wie ich das TableModel erweitern muss,sodass dann als Tabelleninhalt alle Module gelistet werden.

    Außerdem :

    private HashSet<ModuleModel> modules; oder müsste es nicht private HashSet<ModuleController> modules; heißen?
    Also was beinhaltet denn mein SemesterModel, die Models der Module oder die dazugehörigen Controller?
     
  9. 19. September 2011
    AW: Umsetzen eines Programmes

    Wenn du noch eine Datenbank hast, brauchst du eine extra Schicht (Controller). Entweder ein normaler Mapper und du programmierst die Datenbank Abfragen selber oder du verwendest die Java Persistence API (Application-managed).

    Mit der JPA kannst du die Beziehungen direkt modellieren und brauchst dir keine weiteren Gedanken machen.

    Code:
     @OneToMany(mappedBy="semester",targetEntity=Semester.class,fetch=FetchType.EAGER)
     private List<Module> moduleliste;
     
  10. 19. September 2011
    AW: Umsetzen eines Programmes

    Hallo!

    Warum benutzt du nicht die von Fanatic gezeichnete Architektur, die auch das MVC-Pattern benutzt?

    View = GUI
    Controller = (Controller +) Beobachter
    Model = Studium + Semester + Modul

    Jedes Mal wenn sich das Model aendert (z.B. neues Semester), wird der Beobachter aktiv. Der holt sich dann die neuen Daten aus dem Model und gibt sie der GUI zur Anzeige.
    Alternativ kannst du die View direkt das Model beobachten lassen und dann von dort aus die Daten aus dem Model ziehen.

    Wie und mit welchen Klassen du konkret die GUI gestaltest sollte unabhaengig von der Gestaltung der Controller und des Models sein. Es scheint also, dass du auf einem falschen Pfad bist, wenn du fuer jede Klasse jetzt Model, View und Controller erstellst, obwohl es auch so funktionieren wuerde.

    Fuehre dir beim Modellieren immer das Ziel von MVC vor Augen: Die View und der Controller sollte austauschbar sein ohne dass das Model oder andere Komponenten geaendert werden muessen. In dem Moment in dem du diese Bedingung verletzt, hast du einen Fehler gemacht.

    Mfg,

    Kolazomai
     
  11. 20. September 2011
    AW: Umsetzen eines Programmes

    So wie ich MVC verstehe, gehört z.B. der Code des ersten Listeners in deinem Controller (Private Paste - Pastie) eindeutig in das View, da dieser speziell für die erstellte Swing-Oberfläche geschrieben wurde.

    Ich beziehe mich im folgenden auf diese Quelle hier: Java SE Application Design With MVC

    Das Model sollte neben den Gettern und Settern auch Methoden ähnlich den Folgenden besitzen:
    Code:
    public abstract class AbstractModel
    {
     [...]
    
     public void addPropertyChangeListener(PropertyChangeListener listener) {
     propertyChangeSupport.addPropertyChangeListener(listener);
     }
    
     public void removePropertyChangeListener(PropertyChangeListener listener) {
     propertyChangeSupport.removePropertyChangeListener(listener);
     }
    
     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
     propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
     }
    }
    
    Der Controller kann dann für jedes Model das er hält, sich selbst als Listener eintragen. Immer wenn eine Änderung durchgeführt wird, kann er sie dann zum Model propagieren. Guck dir dazu folgenden Code an:
    Code:
    public abstract class AbstractController implements PropertyChangeListener {
    
     private ArrayList<abstractviewpanel> registeredViews;
     private ArrayList<abstractmodel> registeredModels;
    
     public AbstractController() {
     registeredViews = new ArrayList<abstractviewpanel>();
     registeredModels = new ArrayList<abstractmodel>();
     }
    
     public void addModel(AbstractModel model) {
     registeredModels.add(model);
     model.addPropertyChangeListener(this);
     }
    
     public void removeModel(AbstractModel model) {
     registeredModels.remove(model);
     model.removePropertyChangeListener(this);
     }
    
     public void addView(AbstractViewPanel view) {
     registeredViews.add(view);
     }
    
     public void removeView(AbstractViewPanel view) {
     registeredViews.remove(view);
     }
    
    [B] public void propertyChange(PropertyChangeEvent evt) {
     for (AbstractViewPanel view: registeredViews) {
     view.modelPropertyChange(evt);
     }
     }[/B]
    }
    
    Zusatzlich müssen natürlich noch Methoden zum ändern des Models enthalten sein.

    Das View muss die im Controller genutzte PropertyChange-Methode enthalten. Diese kann dann z.B. eine Swing-Oberfläche mit den aktuellen Werten speisen. Durch abstrakte Klassen und identifizierung der Model-Felder über enums oder Strings entsteht trotzdem keine Kopplung. Weiterhin kannst du dann dem Model den Controller entweder direkt übergeben (so wird es auch in dem Dokument von Oracle gemacht) um das Model ändern zu können oder wieder das Observer-Pattern nutzen und im Controller die entsprechenden Listener schreiben. Diese sollten aber wie gesagt nichts mit dem View zu tun haben.
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.