# Großes Programm - Wie Strukturieren?



## ghost (30. Aug 2004)

Ich muß ein großes ( längeres, umfangreicheres ) Programm erstellen. Meine Frage ist nun, wie strukturiere ich das am Besten?


----------



## Thorsten (30. Aug 2004)

Wie groß? Also im Bereich 0 - 3000 Zeilen (alle Klassen zusammen),
oder richtig groß ... so im Bereich > 100000?


----------



## foobar (30. Aug 2004)

Was denn für ein Programm? Webinterface? Desktopanwendung? verteillte Anwendung? Was soll das System denn leisten?


----------



## ghost (30. Aug 2004)

Wieviele Zeilen es werden, weiß ich noch nicht ( aber es werden schon einige  ).
Das Programm wird ne Schnittstelle zu MySQL ( Verbindung aufbauen/beenden, Eingaben, Select, ... ).
Thanks für die schnelle Antwort!


----------



## Beni (30. Aug 2004)

Weil ist selbst gerade ein grosses Programm schreibe (>100 Klassen), geb ich dir einfach mal meine Erfahrungen wieder. Ich hab keine Ahnung, was du schreiben willst, aber vielleicht kannst du was davon brauchen.


 Versuch die Probleme getrennt zu lösen. (z.B. Der Speicheralgorithmus benötigt keine Informationen über das Icon des Hauptfensters...)
Dann zerfällt das Projekt eigentlich in kleinere Projekte, und es wird einfacher Fehler zu finden, oder Neues einzufügen.
 Ich hab eine Zentrums-Klasse geschrieben. Jedes Objekt besitzt eine Referenc auf das Zentrum (das wird direkt über den Konstruktor gesetzt). Das Zentrum wiederum besitzt Referencen auf die wichtigen Objekte des Programmes, z.B. das Hauptfenster. (oder auf Unterzentren, z.B. das Zentrum das sich mit den Dateien beschäftigt).
Auf diese Weise kann man von überall im Programm an jede beliebige Stelle kommen, ohne dass man viel Zusätzliches schreiben müsste.
 Lieber ein Interface zuviel als zuwenig. 
 Vergiss nicht die Dokumentation(Beispiel von meinem Prog). Du musst ja nicht jede Methode beschreiben, aber die wichtigsten Interfaces sind nützlich...
 Versuch immer den kleinsten Nenner zu verwenden. Muss die MenuBar wissen dass sie ein "ExtraFileLoadMenuItem" besitzt, oder muss sie nur wissen, dass da ein "MenuItem" hineinkommt?
 Und versuch das ganze dynamisch zu halten, z.B. lieber ein Vector anstelle eines Arrays zu benutzen. Wenn Du immer von einer unbestimmten Anzahl "Dingen" ausgehst, kannst du später einfacher neue Dinge hinzufügen/entfernen. Wenn du auch noch einen Haufen "addXX" und "removeXX"-Methoden machst, kannst du das sogar während dem laufenden Programm abändern.
 Und scheu dich nicht, ausgiebig nach Fehler zu suchen. Für die letzte Datenstruktur die ich herstellte, hab ich kurzerhand ein Programm geschrieben das nur fürs Debuggen gedacht ist. Es bringt einige Erleichterung, wenn man einen Teil der Fehler schon erkennt, bevor sie im grossen Progi sind.


----------



## Isaac (30. Aug 2004)

Beni hat im Endeffekt schon fast alles gesagt. Nur noch eine Sache die ich in meinen eigenen Programmen immer gerne vergesse weil es einfacher ist.

Probleme werden immer dort gelöst wo sie auch hingehören. Niemanls sollte z.b. ein "Datei Öffnen" Algo in der Klasse "Menubar" sein. 


Wie gesagt, ich mache das in meinen eigenen kleinen Sachen immer gerne aber es ist das Fubar'ste was man machen kann.


----------



## foobar (30. Aug 2004)

Hier auch ein paar Tips von mir:

 Verbringe ausreichend Zeit mit der Analyse und Design-Phase !!!!!!!
 Schreibe keine Sqlstatements direkt in deine Klasse, sondern separiere sie in eine oder mehrere externe Files (z.b. XML)
 Benutze RessourceBundles um dein System zu internationalisieren
 Verwende einen Logger für Zugriffe und Exceptions,  daß kann dir viel Zeit beim debuggen sparen
 Überlege dir Konventionen für die Benennung der Variablen und Methoden ( Prefixe, Camelcase). Dadurch wird alles einheitlicher und leichter verständlich für dritte.
 Verwende eine eigene Exceptionhierarchie, dann kannst du auf bestimmte Exceptions unterschiedlich reagieren oder auch alle auf einmal, mit Hilfe der Oberklasse, abfangen.
 Verwende Design Patterns !!
 Kapsel deine Klassen nach dem Motto: So viel wie nötig, so wenig wie Möglich.
 Fasse deine Klassen sinnvoll in Packages zusammen.
Es gibt noch viel mehr zu beachten, aber daß soll erstmal reichen.


----------



## ghost (31. Aug 2004)

@All: THANKS!

Ihr meint also ( wenn ichs richtig verstanden hab ???:L  ), das ich alle "Teile" (z.B.: Verbindung zu MySQL, Eingabemasken, ... ) als extra Klassen schreiben soll und die dann entsprechend ( wenn nötig ) lade ( basieren auf einer "Grundlegenden" main - Klasse ).... Oder ?    :bahnhof:


----------



## Beni (31. Aug 2004)

Kurz gesagt... "ja"


----------



## Guest (31. Aug 2004)

Noch kürzer: MVC


----------



## ghost (1. Sep 2004)

Bezüglich eurer Hilfe hätt ich noch ein paar Fragen   

1. Was heißt MVC?
2. Müssen die Klassen im selben Ordner sein?
3. Wie heißt die Syntax für den Klassenaufruf bzw. das laden einer klasse?
4. Müssen die import Befehle bei der entsprechenden Klasse angegeben werden oder muß man sie beim Hauptteil (static void main ... ) angeben?
5. Auf was für "Probleme" kann / werde ich wohl stoßen?  :bahnhof:


----------



## Illuvatar (1. Sep 2004)

1. Model - View - Control - Prinzip (Trennen in GUI, Event und Control-Klassen)
2. Nein, die Ordnerstruktur muss wie die Packagestruktur sein
3. Wie meinst du das?
	
	
	
	





```
Object o = new Object();
```
4. Da wo du die Klassen brauchst...
5. Viele, viele Fehler... frag dann einfach nochmal in nem neuen Thread, wenn du welche hast.

hehe, erster  8)


----------



## Beni (1. Sep 2004)

1. Model-View-Control: eine Klasse ist für die Darstellung zuständig, eine für das Speichern der Daten, eine für das Bearbeiten. Z.B. Hashtable-JButton-ActionListener...

2. Um Himmelswillen nein!  8) Klassen die thematisch Zusammengehören (z.B. GUI, Speichern/Laden, ...) würd ich in ein Package zusammenstecken, das wird wesentlich übersichtlicher.

3. Wie meinst du das? "new Blabla" oder "import package.Blabla;" oder  :bahnhof: 

4. Die Import-Befehle werden ausserhalb der Klasse geschrieben:

```
package beispiel;

import beispiel.plapper.*;

public class Blupp{
  ...
}
```

5. Auf sehr viele  , die Frage kann ich dir unmöglich beantworten. Nur soviel:
a) Scheu dich nicht, auchmal was zu löschen. Wenn was falsch designed ist, muss man den Mut haben, einen Teil des Programmes radikal umzustruckturieren.
b) Versuch immer ein Algorithmus nach dem anderen zu schreiben, und _teste_ die Dinger sehr gut und ausgiebig. Je früher du einen Fehler erkennst, desto einfacher ist er zu reparieren.


----------



## ghost (1. Sep 2004)

Bezüglich meinen Fragen sollte ich wohl besser noch anmerken, das meine bisherigen Java - Programme immer nur aus einer einzigen Datei bestanden haben. Nun bin ich etwas verwirrt  ???:L   wie man das mit verschiedenen Dateien ( Klassen / Packages ) macht bzw. wie man dieselbigen erstellt!?!?!?

Ich hätte da     :roll:  noch zwei Fragen:
1. Gibts irgendwo im Netz ein Beispiel-Programm (Quellcode)
2.  Kennt jemand ein E-Book, Buch das sich mit so nem Thema beschäftigt ( damit ich nicht immer hier so blöde Fragen stellen muß... )?


----------



## Beni (1. Sep 2004)

Uii, bei Büchern und Beispielen kenn ich mich nicht aus. Aber guck mal im Forum unten, da gibts eine Rubrik mit Büchern. (P.S. falls du ein tolles Beispiel findest, poste den Link dazu :wink: )

Packages und Ordner sind eigentlich dasselbe.
Wenn du eine Datei hast die so aussieht:

```
package blupp;

import blupp.sirup.*;

public class Schlürf{ ...
```
Dann muss sie in einem Ordner "blupp" liegen. Und du hast durch den import-Befehl Zugriff auf alle Klassen/Dateien die im Package/Ordner "blupp\sirup" sind.


----------



## foobar (1. Sep 2004)

Bücher zu diesen Themen gibt es viele:
- Java XML Programming
- Design Patterns
-  J2EE Patterns


----------



## ghost (3. Sep 2004)

Ich probiere momentan an diesem package / klassen -Zeug rum. Leider funzt es irgendwie nicht.
Die Klasse ist als verbindung.java bzw. .class im connection - Ordner ( im Java Ordner ) gespeichert. Die Applikation liegt in nem Nebenordner. Wenn ich jetzt versuche die Klasse mit dem import - Befehl zu laden krieg ich immer nen Haufen Fehler ( Fehler die ohne den import nicht kommen, da sie eigentlich keine sind ). Woran liegt das?


```
//import java.connection.*;;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.sql.*;

public class Main extends JFrame{
```


```
package connection;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class verbindung{
```

2. Ich hab eine Port - Abfrage im Programm. Der Port ist als int definiert und kann anscheinend nicht mit getText ausgelesen werden. Kann ich den Port jetzt ohne Probleme als String deklarieren oder gibts da eine andere Möglichkeit?

3. Was muß ich beachten wenn ich gemäß oben genanntem Bsp. Variablen von einer Klasse in der anderen benutzen möchte?

DAAAANKKKKEEEEE


----------



## Beni (3. Sep 2004)

Also wenn der Code zu deiner Main-Klasse genau so aussieht, wie du ihn gepostet hast, dann muss die Main.java/class in demselben Ordner wie der Ordner "connection" liegen. Packages verhalten sich ja genau so wie Verzeichnisse auf der Festplatte, also müssen sie auch relativ zueinander richtig liegen.

zu 2: Also wenn er als int definiert ist, wieso verwendest du dann nicht einfach einen int  :wink: . Ansonsten: man kann Integer in Strings umwandeln (String.valueOf...), überleg dir nur zuerst, ob das in diesem Fall Sinn macht.

zu 3: Sorry, versteh nicht ganz wie du das meinst  :bahnhof:


----------



## foobar (3. Sep 2004)

> Der Port ist als int definiert und kann anscheinend nicht mit getText ausgelesen werden. Kann ich den Port jetzt ohne Probleme als String deklarieren oder gibts da eine andere Möglichkeit?


Was meinst du mit getText?
int in String umwandeln, macht man am besten so:

```
int i = 100;
String s = i+"";
```



> Was muß ich beachten wenn ich gemäß oben genanntem Bsp. Variablen von einer Klasse in der anderen benutzen möchte


1. Getter für Variablen schreiben
2. Klasse importieren
3. mit Hilfe der Getter auf die Variablen zugreifen.


----------



## ghost (3. Sep 2004)

Ich hab jetzt den Ordner connection in dem Ordner mit dem Main - Programm. Jetzt meldet er mir aber "Package connection does not exists"?!?!?!?
Ich vermute mal das das Problem der Classpath ist, doch leider weiß ich nicht wie ich ihn richtig setzten muß ( dieverse Versuche sind fehlgeschlagen )
[ Folgende Ordner - Platzierung: c:\projekt\java\connection 
in java befindet sich das Main - Programm, in connection die Klasse.
1. Wie muß ich die classpath setzen
2. von welchem Verzeichnis aus muß ich ihn setzen ( d.h. muß ich in Dos in einem bestimmten Verzeichnis stehen, wenn ich den classpath änderen will )?]

Thanks


----------

