Array durch Interface ersetzen

Ark

Top Contributor
Ich habe Code (nicht von mir), der auf double-Arrays operiert. An sich funktioniert der Code auch hervorragend. Leider gibt es da ein Problem: Die double-Arrays können je nach Anwendung ziemlich groß werden. Da wäre es natürlich schön, wenn man das Array auf die Platte auslagern könnte.

Leider wollen Arrays in Java (natürlich) im Arbeitsspeicher sein. Also wäre es doch geschickt, alle Array-Operationen (Lesen, Schreiben, Längenabfrage, Pre-Inkrement usw.) durch entsprechende Methodenaufrufe zu ersetzen, wobei natürlich - zwecks maximaler Flexibilität - die Methoden in einem Interface deklariert werden.

Das Problem ist nur: Wie mache ich das möglichst effizient? Es geht um ca. 10000 bis 20000 Zeilen Code, und da alle notwendigen Arrayzugriffe manuell durch Methoden zu ersetzen, ist mühselig, zeitraubend und fehleranfällig.

Gibt es ein Programm, das das für einen erledigt? Hat vielleicht Eclipse eine Funktion, die Entsprechendes leistet?

Ark
 
Zuletzt bearbeitet:
Serializable?
Ich weiss nicht so recht, ob es das ist, was du suchst, aber damit kannst du die Objekte welche deine Arrays beinhalten persistent speichern.

Ich bin nur Benutzer von Klassen die das machen deshalb die Frage an die Profis:
Ein Objekt ist serializable hat einigen Arrays und das sind ja eigenständige Objekte.
Werden die automatisch mitgespeichert? (Wohl kaum, aber was muss man tun dass doch?)
 
Das Problem ist nur: Wie mache ich das möglichst effizient? Es geht um ca. 10000 bis 20000 Zeilen Code, und da alle notwendigen Arrayzugriffe manuell durch Methoden zu ersetzen, ist mühselig, zeitraubend und fehleranfällig.
Eclipse bietet da ein Refactoring: Encapsulate Field
 
Worum geht es dir denn im Endeffekt? Möchtest du deine double Arrays persistieren um den flüchtigen Speicher möglichst gering zu halten? Dann mach dir eine Hilfsklasse mit Methoden wie arrayToFile(File, double[]) und fileToArray(File, double[]). Letztere Methode vielleicht noch mit Parametern wie der Stelle, ab der gelesen werden soll und wieviel (du brauchst ja anscheinend das Array in seiner Gesamtheit nicht immer).

Wenn du aber jede Operation auf dem Array (Lesen/Schreiben/Größe erweitern) jetzt über ein Interface komplett über Dateizugriffe abbilden willst, so wirst du mit großer Wahrscheinlichkeit mit enormen Geschwindigkeitsverlusten rechnen müssen.
 
Eclipse bietet da ein Refactoring: Encapsulate Field
Das ist zwar ein guter Ansatz, bringt mir aber nur sehr begrenzt etwas. Denn damit werden bestenfalls die Zugriffe auf die referenzierten Arrays als solche über Methoden abgewickelt. Die Zugriffe auf Elemente bleiben unverändert. Außerdem funktioniert es nur mit Fields, nicht aber mit lokalen Variablen und noch weniger mit Parametern, aber leider sind gerade solche extrem häufig im Code zu finden.

Also, was ich brauche, ist etwas, das folgendes macht (beispielhaft, der richtige Code ist VIEL komplizierter und komplexer):
Java:
// alter Code:
private void methode1(double[] a, double[] b, double c){
	for(int i = 0;i < a.length; i+=2){
		a[i] *= c - b[b.length - i - 1];
	}
}

// neuer Code:
private void methode1(DoubleArrayInterface a, DoubleArrayInterface b, double c){
	for(int i = 0;i < a.length(); i+=2){
		a.putMUL(i, c - b.get(b.length() - i - 1));
	}
}
Also alle Operationen, die ein gewöhnliches double[] mit sich bringt, sollen durch ein Interface abgebildet werden. Gibt es da eine Möglichkeit, das automatisiert machen zu lassen?

Hintergrund ist, dass ich entscheiden können möchte, ob ein Array tatsächlich im Arbeitsspeicher sein kann oder ob es ganz oder teilweise (nach gewissen Regeln) auf die Festplatte ausgelagert werden soll. Außerdem werden die Arrays von anderen Teilen des Programms verwendet, die andere Anforderungen an dieses haben (von wegen Reihenfolge der Elemente etc., generell andere Organisation der Daten im Array). Mit einem Interface könnte ich dann ganz leicht die Zugriffe auf das Array so umleiten, wie es der Teil des Programms erwartet.

Ohne Interface müsste ich permanent die Arrays hin- und herkopieren, sei es innerhalb des Arbeitsspeichers oder über die Festplatte.

Ark
 
Also, was ich brauche, ist etwas, das folgendes macht (beispielhaft, der richtige Code ist VIEL komplizierter und komplexer):
Vielleicht ein Grund ihn einfacher zu machen?

Also alle Operationen, die ein gewöhnliches double[] mit sich bringt, sollen durch ein Interface abgebildet werden. Gibt es da eine Möglichkeit, das automatisiert machen zu lassen?
Woher soll das Tooling wissen, dass [c]length[/c] durch [c]length()[/c] und [c][][/c] durch [c]get(..)[/c] zu ersetzen ist?
Ist aber durch Suchen & Ersetzen relativ schnell zu erledigen.

Die einzelnen Refactorings sind immer nur kleine Schritte auf dem Weg zu einem neuen Design, imho ist es wichtig darauf zu achten dass man nur das Design ändert und nicht auch die bestehende Funktonalität.
 

Zurück
Oben