Java Funktion "auslagern"?

5 Antworten

Um konkret auf dein "Problem" eingehen zu wäre es noch interessant zu wissen, welches GUI-Framework du nutzt. Swing? JavaFX? Oder gar ein anderes eines Dritt-Anbieters?

Ich frage deshalb, da du beispielsweise in JavaFX deine GUI komplett in einer FXML Entwerfen kannst und die Ansteuerung deiner GUI somit direkt getrennt in einem eigenen Controller verwenden kannst, was beispielsweise für deine gewünschte Inhaltliche Trennung wohl ein guter Fortschritt wäre.

Was für Funktionen das sind, und was für eine Aufgabe diese haben, ist leider auch nicht bekannt, daher kann ich nur 'raten'.

Sagen wir mal, du hast eine GUI in einer Klasse:

hauptKlasse.java

Und gehen wir mal von Swing aus (da es hier viele Tutorials gibt und viele Lehrer auch das gerne zum Thema nehmen)

Und sagen wir mal, deine Hauptklasse leitet von JFrame ab, um 'bequem' die Hauptklasse als GUI zu starten.

Beispielsweise gehe ich mal von einem MP3-Player aus, der angesteuert werden soll, bei dir als 'auszulagernde Funktion' zu betrachten, welche aber an die GUI gebunden sein soll.

Entsprechend wäre deine 'Ausgelagerte Klasse': MP3Player:

class MP3Player {

  public void play() {};

  public void pause(){};

  public void next() {};

}

Dann könntest du in diesem Falle deine MP3Player Klasse deiner GUI Klasse als Attribut mitgeben:

public class Hauptklasse extends JFrame {
    
   private MP3Player mp3Player;


   public Hauptklasse() {
       this.mp3Player = new MP3Player();
   }
}

Hast du nun in deiner Hauptklasse einen JButton: "Play": so kannst du in dessen ActionListener direkt die Methode des MP3Players aufrufen:

@Override
public void actionPerformed(ActionEvent event) {
    mp3player.play();
}

Sollten deine Funktionen eher 'Hilfsfunktionen' sein, wie beispielsweise Textformatierungen, bei denen du aus Strings für Dateinamen illegale Zeichen löschen willst, so kannst du eine 'Hilfsklasse' erstellen, in der du diese art von Methoden als statisch kennzeichnest. Bedeutet: Diese Methoden sind nicht an eine Instanz gebunden, und kommen mit entsprechenden vor und nachteilen.

z.B.:

class MyHelper {

   public static String removeIllegalFilenameCharacters(String fileName) {
       return;
   }
}

dies wiederum kannst du direkt in deiner Hauptklasse verwenden:

class Hauptklasse extends JFrame {

   String fileName = ...;

   private void saveFile() {
        fileName = MyHelper.removeIllegalFilenameCharacters(filename);
        new File(fileName)....
   }

}

Diese Auslagern gehört zum programmiereen dazu .. und wenn die z.B. die GUI in eine (oder mehrere Methoden) auslagerst (und entsprechend kapselst) machst du einen Schritt in Richtung objektorientiertes programmieren.

Wie das zu machen ist, musst du wohl lernen -- es reicht nicht if, for und while zu kennen -- jede "eingebaute" Methode oder Funktion ist so ein "ausgelagerter" JAVA-Code.

Wie das in deinem Fall zu realisieren ist, kann dir niemand sagen -- im Endeffekt wäre es eine Mehtode "doGUI(...,....,...,..);" die du in main aufrufst.

Für eine solche "Auslagerung" der GUI Funktionen gibt es bereits ein Muster, auch bekannt als "Model View Control" alias MVC Design Pattern.

Sieh dir hierzu mal die folgenden Seiten an:

Wenn Du also deinen Code strukturieren willst, dann ist dies eine bewährte Lösungsschablone in der Softwareentwicklung. Ändern sich die Anforderungen, und somit auch der Code, weißt du damit genau wo du nach Verhalten der Anwendung suchen musst, insbesondere wo der Code erweitert werden muss.

Siehe auch hierzu das sog. "Separation of Concerns" also dem Aufteilen deines Codes in Bestandteile die zB Fachfunktionen zugeordnet werden können. Beispiel hierfür kann sein, Code für das User Interface, Datenbankzugriff, Netzwerkzugriff und weiteres.

Wir wollen doch schließlich keinen Spaghetti Code erzeugen ;-)


Ja dann schreib sie doch da rein. Kommt drauf an was du machen willst. Je nachdem macht vielleicht Sinn es in eine statische Methode auszulagern. Dann brauchst du doch nur noch dein package in der GUI einbinden und die Funktion in deiner Klasse "fuktionen" aufrufen. WO ist das Problem?

Poste doch mal deinen Code. Du kannst deine ganzen Methoden (Methoden nicht Funktionen. Will kein Klugsch...ser sein, aber das kommt später allgemein immer gut, wenn man die richtigen Begriffe verwendet) in deine Funktionne Klasse auslagern, erstellst dann in der GUI Klasse ein Objekt vom Typ Funktionen und greifst dann auf die Methoden zu.