# einzelne Methoden einer Klasse auslagern



## MrMilti (18. Jun 2009)

Hallöchen, heut hab ich mal eine saudämliche Frage:


Ich schreib derzeit an einem kleinen Programm, dass so langsam größer und größer... sprich unübersichtlicher wird. Jetzt möchte ich da etwas Ordnung hinein bringen und den Quellcode auf mehrere Dateien verteilen, daran verzweifle ich aber allmählich.

Ich hab mich in diversen Tutorials und Hilfen mit Packaging beschäftigt, aber das beschreibt alles nicht so recht das Problem, das ich dabei habe. Dort werden immer nur einzelne Klassen auf mehrere Dateien verteilt, aber was mach ich, wenn ich einzelne Funktionen EINER Klasse auf mehrere Dateien verteilen möchte?




Ich komme von c++, da sah das ganze in etwa so aus:

main.cpp (die Datei wird dann mit dem Compiler angesprochen)

```
#include "elements.hpp"
#include "elements.cpp"

int main(int argc, char *argv[])
	{
	PointValues P1, P2;
	P1.flush();
	}
```

elements.hpp:

```
class PointValues
	{
	private:
	double stat, rw, hw, ny, h, n;

	public:
	PointValues() {}
	~PointValues() {}
	void flush();

	};
```

elements.cpp

```
void PointValues::flush()
	{
	stat = 0.;
	rw   = 0.;
	hw   = 0.;
	ny   = 0.;
	h    = 0.;
	n    = 0.;
	return;
	}
```


Also in diesem Beispiel wird die Datei main.cpp kompiliert, die zunächst mal eine Headerdatei elements.hpp importiert, in der nur Variablen und Funktionennamen deklariert sind. Erst in der Datei elements.cpp stehen dann (mit Angabe des Namensraums) die eigentlichen Funktionen drin. Genau das würde ich jetzt in Java auch gerne machen, ist das möglich? Oder wie ist das in Java üblich, wenn eine Klasse immer länger und länger wird?


Nachtrag:
Ich merke grade, mein Problem wird nicht 100% ersichtlich durch das bisher geschriebene. Zur Aufklärung: in der elements.hpp könnten beispielsweise sehr viele Funktionen deklariert sein, die alle sehr lang sind. Zur Übersichtlichkeit werden diese vielen Funktionen jetzt in sinnvollen Gruppen auf mehrere Dateien verteilt. Also ein Headerfile, dass die Funktionen deklariert (damit sich auch keine dazumogeln kann) und dann ein paar Dutzend einzelne Dateien, in denen die Funktionen dann drinstehen


----------



## Leroy42 (18. Jun 2009)

MrMilti hat gesagt.:


> Genau das würde ich jetzt in Java auch gerne machen, ist das möglich?



Nein, das ist nicht möglich!



MrMilti hat gesagt.:


> Oder wie ist das in Java üblich, wenn eine Klasse immer länger und länger wird?



Die Klasse logisch/semantisch splitten, wenn sie zu lang wird.


----------



## kama (18. Jun 2009)

Hallo,

es gibt in Java keine Unterscheidung zwischen Deklaration und Definition wie in C++....abgesehen davon heissen in C++ die Header Dateien immer noch ".h" ...weiterhin fehlen in der Header-Datei die #ifndef ..._H...
Warum ist der Default Constructor nicht dazu da die sachen auf 0.0 zu setzen...der Würde doch dann im C++ Quelltext 
	
	
	
	





```
PointValues P1, P2;
```
 hier aufgerufen....anstatt mit flush ?


```
public class PointValues {
  private Double stat;
  private Double rw;
  private Double hw;
  private Double ny;
  private Double h;
  private Double n;

  public PointValues() { //Default Constructor
    flush();
  }
  //Weitere Constructoren...

  public void flush() {
    stat = 0.0;
    rw = 0.0;
    hw = 0.0;
    ny = 0.0;
    h = 0.0;
    n = 0.0;
  }

 //getter/setter schenke ich mir jetzt mal....
}
```
Das obige kommt in eine einzige Datei und zwar "PointValues.java"...

In C++ sollte man eine logischen Zusammenhang zwischen Datei und Funktionen bzw. besser Methoden machen....

MfG
Karl Heinz Marbaise


----------



## MrMilti (18. Jun 2009)

Ich habs in der Uni mit .hpp gelernt, im Endeffekt ist das doch auch völlig egal, man könnte sie auch .quitscheentchen nennen, wenn einem der Sinn danach steht.

Desweiteren führe ich auch nur sinnhafte Beispiele an, um mein Problem zu erläutern und lege jetzt keinen Wert auf vollständig ausformulierte Codezeilen, die vielleicht hübsch anzusehen sind, mit meiner Problemstellung aber nichts zu tun haben.


Wie gesagt mein Problem ist immer noch das Selbe:
Ich hab eine Klasse mit Hausnummer 23 Millionen Methoden und die möcht ich bitte nicht alle in eine Datei schreiben müssen...

Sorry für die vielleicht etwas bissige Antwort, aber ich hab grad das Gefühl, nicht ernst genommen und als unfähig dargestellt zu werden


----------



## maki (18. Jun 2009)

> Ich hab eine Klasse mit Hausnummer 23 Millionen Methoden und die möcht ich bitte nicht alle in eine Datei schreiben müssen...


Nicht falsch verstehen, aber man sagt "Wenn man nur einen Hammer hat, sieht jedes Problem wie ein Nagel aus."
Dein Hammer ist die eher schräge Trennung in C++ von Schnittstelle und Deklaration, in der man beides mischen kann.
Was du für einen Nagel hällst ist sehr wahrscheinlich  eine nicht OO mässige Struktur, wenn eine Klasse zu groß wird, liegt das daran das da weitere Klassen drinnstecken die ausbrechen wollen 

Mit refactoring kannst du das korrigieren.


----------



## kama (18. Jun 2009)

Hallo,



MrMilti hat gesagt.:


> Ich habs in der Uni mit .hpp gelernt, im Endeffekt ist das doch auch völlig egal, man könnte sie auch .quitscheentchen nennen, wenn einem der Sinn danach steht.


Nicht wirklich ....Das Problem ist, dass faktische alle Build Tools (Make etc.) hier meist default Regeln haben um C++ zu übersetzen und da wird nun mal .h genommen.....



MrMilti hat gesagt.:


> Desweiteren führe ich auch nur sinnhafte Beispiele an, um mein Problem zu erläutern und lege jetzt keinen Wert auf vollständig ausformulierte Codezeilen, die vielleicht hübsch anzusehen sind, mit meiner Problemstellung aber nichts zu tun haben.


Das hättest Du ja kurz hinschreiben könne... (so nach dem Motto: Zur Übersichtlichkeit gekürzt....)...Weil ich nur danach gehen kann was Du schreibst und nicht was Du Dir denkst.....Hier gibt es durchaus Leute die schon mal C++ gesehen aber auch selbst schon programmiert haben....somit fällt denen (auch mir) so etwas auf....



MrMilti hat gesagt.:


> Wie gesagt mein Problem ist immer noch das Selbe:
> Ich hab eine Klasse mit Hausnummer 23 Millionen Methoden und die möcht ich bitte nicht alle in eine Datei schreiben müssen...


Dann war das auch schon in C++ Käse. Das refaktoriert man dann. Eben, um kleinere Übersichtlichere Einheiten zu erhalten....Da besteht prinzipiell kein Unterschied zwischen C++ und Java...Ok Java hat keine Prä-Prozessor..(Ist auch gut so) usw....

Abgesehen davon wenn Die Klasse tatsächliche so viele Methoden hat, dann ändernt das erstmal nichts....Stichwort ist wie schon gesagt "Refaktorierung" ....dazu sind selbstverständlich Unit Tests unerlässlich....



MrMilti hat gesagt.:


> Sorry für die vielleicht etwas bissige Antwort, aber ich hab grad das Gefühl, nicht ernst genommen und als unfähig dargestellt zu werden


Warum nicht? Sowohl Leroy42 als auch ich haben geschrieben, dass das von Dir gewünschte nicht möglich ist...Abgesehen davon: Es wird doch geantwortet....Was willst Du denn noch mehr?
EDIT: Maki fehlt noch...

MfG
Karl Heinz Marbaise


----------



## kama (18. Jun 2009)

Hallo,


maki hat gesagt.:


> Mit refactoring kannst du das korrigieren.


Käse Du warst schneller....

MfG
Karl Heinz Marbaise


----------

