Objektorientierung - wie macht man's richtig?

Status
Nicht offen für weitere Antworten.

muemmel_0811

Bekanntes Mitglied
Hallo zusammen,
ich versuche gerade das mit der Objektorientierung verstehen zu lernen, aber irgendwie klappt das noch nicht so ganz und daher bräuchte ich mal wieder Eure Hilfe :)
Ich hab mir jetzt erstmal Tage lang den Kopf darüber zerbrochen, was ich denn so in meinen kleinen Progrämmchen überhaupt als Objekt identifizieren könnte und da ist mir dann ein "Verzeichnisläufer" eingefallen. Also etwas, dass best. Ordner incl. Unterordner nach irgendwelchen Dateien durchsucht und diese (also die Pfadangaben) in einer ArrayList speichert - für den Anfang reicht mir hier "irgendwelche Dateien" - ein Dateifilter folgt später.

Meine Frage ist jetzt, wie organisier ich das richtig. Ich hab gelernt, dass eine Klasse definiert, was ein Objekt weiß und was ein Objekt macht. Aber was weiß meine Klasse DirScan denn jetzt wirklich, welches sind ihre Instanzvariablen und welche Methoden gehören zu diesem Objekt?
Folgendes kleine Beispiel-Programm hab ich mal zusammengebastelt:
Klasse DirScan_Test
Code:
package pack;
import java.awt.BorderLayout;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class DirScan_Test extends JFrame{
	private static final long serialVersionUID = 1L;
	JTabbedPane tab = new JTabbedPane();
	Gui g = new Gui();
	DirScan_Test () {
		super();
		setTitle("Verzeichnis Scanner");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		initLaF();
		setLayout(new BorderLayout());
		tab.setFont(new Font("Verdana",Font.BOLD,11));
		tab.addTab("GUI", g);
		getContentPane().add(tab, BorderLayout.CENTER);
	}
	public void initLaF() {
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			SwingUtilities.updateComponentTreeUI(this);
			SwingUtilities.updateComponentTreeUI(tab);
			SwingUtilities.updateComponentTreeUI(g);
		}
		catch(Exception c){
		}
	public static void main(String[] args) {
		JFrame f = new DirScan_Test();
		f.setSize(500,300); // 704
		f.setLocation(300,200);
		f.setVisible(true);
		f.setResizable(false);
	}
Klasse Gui
Code:
package pack;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Gui extends JPanel{
	private static final long serialVersionUID = 1L;
	JCheckBox optRekursiv = new JCheckBox("incl. Unterverzeichnisse", true);
	JLabel lblDir = new JLabel("Verzeichnis wählen");
	JTextField txtDir = new JTextField();
	JButton btnDir = new JButton("...");
	JButton btnGo = new JButton("Go");
	JTextArea taAusgabe = new JTextArea(7,10);
	JScrollPane scrAusgabe = new JScrollPane();
	Gui() {
		super();
		setLayout(null);
		lblDir.setBounds(10,10,200,20);
		lblDir.setFont(new Font("Verdana", Font.BOLD, 11));
		add(lblDir);
		txtDir.setBounds(10,30,350,20);
		txtDir.setFont(new Font("Courier New", Font.PLAIN, 14));
		add(txtDir);
		btnDir.setBounds(370,30,50,20);
		btnDir.setFont(new Font("Verdana", Font.BOLD, 11));
		add(btnDir);
		btnDir.addActionListener(new GetDir());
		btnGo.setBounds(430,30,50,20);
		btnGo.setFont(new Font("Verdana", Font.BOLD, 11));
		add(btnGo);
		btnGo.addActionListener(new StartRunDir());
		scrAusgabe.setBounds(10,60,470,160);
		scrAusgabe.setViewportView(taAusgabe);
		add(scrAusgabe);
	}
	class GetDir implements ActionListener{
		public void actionPerformed(ActionEvent ae) {
			JFileChooser fc = new JFileChooser();
			fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			int option = fc.showOpenDialog(txtDir);
			if(option == JFileChooser.APPROVE_OPTION) {
				String pfad = fc.getSelectedFile().getAbsolutePath();
				txtDir.setText(pfad);
			}
		}
	}
	class StartRunDir implements ActionListener{
		public void actionPerformed(ActionEvent ae) {
			DirScan ds = new DirScan();
			ds.setPfad(txtDir.getText());
			ArrayList<File> dateien = ds.runDir();
		}
	}
}
Klasse DirScan
Code:
package pack;
import java.io.File;
import java.util.ArrayList;
public class DirScan {
	private String pfad;
	private ArrayList<File> dateien = new ArrayList<File>();
	public void setPfad(String p) {
		pfad = p;
	}
	String getPfad() {
		return pfad;
	}
	ArrayList<File> runDir() {
		String tmp = getPfad();
		String fPfad = tmp.replaceAll("\\\\","\\\\\\\\");
		File f = new File(fPfad);
		ArrayList<File> al = spider(f);
		return al;
	}
	ArrayList<File> spider(File dir) {
		File[] verz = dir.listFiles();
		if(verz != null) {
			for(int i=0; i<verz.length; i++) {
				if(verz[i].isDirectory()) {
					spider(verz[i]);
				}
				if(verz[i].isFile()) {
					dateien.add(verz[i]);
				}
			}
		}
		return dateien;
	}
}
Es funktioniert, es tut was es soll - aber wie ist das nu mit der Objektorientierung? Was hab ich falsch gemacht, was könnte man wie verbessern?

Helft mir, damit ich es mal wirklich verstehen lerne!

Danke und Grüße,
muemmel
 
B

Beni

Gast
Schon ganz gut (bis auf den Namen... Buchstaben kosten nichts, nenn das z.B. "DirectoryScanner"), aber ich würde sagen, dass ein DirScan für einen Pfad gedacht ist.

Das hätte auch den Vorteil, dass du die Ergebnisse zwischenspeichern kannst.

"runDir" und "spider" würde ich private machen, "getPath" public und "setPath" löschen.

Am Schluss kommt dann sowas raus:

Code:
package pack;

import java.io.File;
import java.util.ArrayList;

public class DirScan {
	private String pfad;
	private ArrayList<File> dateien = null;

	public DirScan( String path ){
		if( path == null )
			throw new IllegalArgumentException( "path == null" );
		this.pfad = path;
	}

	public String getPfad() {
		return pfad;
	}

	public List<File> getDateien(){
		if( dateien == null )
			dateien = runDir();

		return dateien;
	}

	private ArrayList<File> runDir() {
		String tmp = getPfad();
		String fPfad = tmp.replaceAll("\\\\","\\\\\\\\");
		File f = new File(fPfad);
		return spider(f);
	}

	private ArrayList<File> spider(File dir) {
		File[] verz = dir.listFiles();
		if(verz != null) {
			for(int i=0; i<verz.length; i++) {
				if(verz[i].isDirectory()) {
					spider(verz[i]);
				}
				if(verz[i].isFile()) {
					dateien.add(verz[i]);
				}
			}
		}
		return dateien;
	}
}
 

muemmel_0811

Bekanntes Mitglied
Hallo Beni,

erstmal vielen Dank für Dein kleines Lob und auch für Deine Mühe, mir unter die Arme zu greifen :applaus:
Mit Deinen Änderungsvorschlägen sieht mein Code dann so aus:
Code:
package pack;
import java.io.File;
import java.util.ArrayList;
public class DirectoryScanner {
	private String pfad;
	private ArrayList<File> dateien = null;

	public DirectoryScanner(String path){
		if(path == null) {
			this.pfad = path;
			throw new IllegalArgumentException("path == null");
		}
		else {
			this.pfad = path;
		}
	}
	public String getPfad() {
		return pfad;
	}

	public ArrayList<File> getDateien(){
		if(dateien == null) {
			dateien = runDir();
		}
		return dateien;
	}

	private ArrayList<File> runDir() {
		String tmp = getPfad();
		String fPfad = tmp.replaceAll("\\\\","\\\\\\\\");
		File f = new File(fPfad);
		ArrayList<File> al = spider(f);
		return al;
	}

	private ArrayList<File> spider(File dir) {
		File[] verz = dir.listFiles();
		if(verz != null) {
			for(int i=0; i<verz.length; i++) {
				if(verz[i].isDirectory()) {
					spider(verz[i]);
				}
				if(verz[i].isFile()) {
					dateien.add(verz[i]);
				}
			}
		}
		return dateien;
	}
}

Auszug der Klasse Gui
Code:
...
class StartRunDir implements ActionListener{
   public void actionPerformed(ActionEvent ae) {
      DirectoryScanner ds = new DirectoryScanner(txtDir.getText());
	ArrayList<File> dateien = ds.getDateien();
   }
}
...

Aber ich hätte dann da jetzt doch noch ein paar Fragen:

wieso private ArrayList<File> dateien = null; - was ist daran besser, anders (oder was auch immer) als an private ArrayList<File> dateien = new ArrayList<File>(); ?

Worin liegt der Vorteil, der Variablen pfad ihren Wert über den Konstruktor der Klasse DirectoryScanner mitzuteilen ggü. der set-Methode?

Wieso ist es besser die Methode getDateien zu "erschaffen", wenn ich doch auch die Methode runDir als public deklarieren kann? Ich sehe keinen Unterschied darin, ob nun Methode A oder B public ist *grübl*
Das man spider besser als private macht, versteh ich, denn ich brauch diese Methode ja nicht außerhalb von DirectoryScanner, aber warum getDateien und nicht runDir...

Danke Dir und viele Grüße,
muemmel
 
B

Beni

Gast
wieso private ArrayList<File> dateien = null; - was ist daran besser, anders (oder was auch immer) als an private ArrayList<File> dateien = new ArrayList<File>(); ?
Wenn man die Dateien erst später lädt und das Ergebnis speichert (wie in meinem Vorschlag), kann man mit "null" sehr einfach sagen, dass da noch was fehlt. Hingegen kann man mit einer leeren Liste nicht so sicher sein, ob das jetzt schon geladen ist (und es einfach nichts zu sehen gibt), oder ob da noch nichts geladen ist.

Ich sehe aber gerade, dass du "dateien" auch in "spider" benutzt, da müsste man also noch sicherstellen, dass "dateien" nicht mehr null ist wenn "spider" aufgerufen wird (aber das ist ja nur eine neue Zeile z.B. in "runDir").

Da fällt mir ein: wieso gibt "spider" überhaupt etwas zurück, auf das du sowieso schon Zugriff hast? Etwas doppelspurig das ganze, spider könnte man auch "void" machen.

Worin liegt der Vorteil, der Variablen pfad ihren Wert über den Konstruktor der Klasse DirectoryScanner mitzuteilen ggü. der set-Methode?
Der Pfad kann so nicht mehr verändert werden. Ob es wichtig ist, dass der Pfad unveränderlich ist? Ich denke nicht, persönlich finde ich es einfach überflüssig den Pfad veränderlich zu haben (ist komplizierter und eine potentielle Fehlerquelle). Aber das ist so eine Entscheidung über die man stundenlang streiten könnte...

Wieso ist es besser die Methode getDateien zu "erschaffen", wenn ich doch auch die Methode runDir als public deklarieren kann? Ich sehe keinen Unterschied darin, ob nun Methode A oder B public ist *grübl*
Das man spider besser als private macht, versteh ich, denn ich brauch diese Methode ja nicht außerhalb von DirectoryScanner, aber warum getDateien und nicht runDir...
Wenn du bei deinem aktuellen Code "runDir" zweimal aufrufst, wird die ganze Verzeichnisstruktur zweimal durchlaufen (und da du die "dateien" niergends leerst, Dateien doppelt aufgeführt :bae: ).
Die Methode "getDateien" wirkt als Buffer der sicherstellt, dass nicht zuviel Arbeit ausgeführt wird - insbesondere dass die "teure" Operation "runDir" nur einmal aufgerufen wird.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
L Einführung Objektorientierung Java Basics - Anfänger-Themen 8
L Einstieg Objektorientierung Java Basics - Anfänger-Themen 10
H Wie geht eigentlich Objektorientierung? Java Basics - Anfänger-Themen 14
L Objektorientierung Java Basics - Anfänger-Themen 6
B Objektorientierung Java Basics - Anfänger-Themen 1
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
T Objektorientierung-Kurze Frage Java Basics - Anfänger-Themen 5
L Hilfe! Objektorientierung Java Basics - Anfänger-Themen 3
S OOP Zusammenhang von Objektorientierung und Ausnahmebehandlungen Java Basics - Anfänger-Themen 6
C Objektorientierung? Java Basics - Anfänger-Themen 5
G Designfrage/Objektorientierung Java Basics - Anfänger-Themen 19
S Methoden Aufgabe zu ""Methoden" und "Objektorientierung" Java Basics - Anfänger-Themen 3
B OOP Programm zur Verdeutlichung von Objektorientierung Java Basics - Anfänger-Themen 7
T Initialisierungen der einzelnen Klassen - Objektorientierung Java Basics - Anfänger-Themen 4
B Objektorientierung Java Basics - Anfänger-Themen 2
W Einstieg Objektorientierung Java Basics - Anfänger-Themen 4
X Objektorientierung Einführung Java Basics - Anfänger-Themen 2
A Objektorientierung Klassen Java Basics - Anfänger-Themen 4
D Objektorientierung / Polymorphismus Java Basics - Anfänger-Themen 8
Spin Objektorientierung . Konzept Java Basics - Anfänger-Themen 4
M Objektorientierung Java Basics - Anfänger-Themen 3
R ObjektOrientierung Java Basics - Anfänger-Themen 18
D Objektorientierung ? Java Basics - Anfänger-Themen 4
D Objektorientierung Listen Java Basics - Anfänger-Themen 2
J objektorientierung und uml Java Basics - Anfänger-Themen 5
D Objektorientierung - wie konsequent sollte man sein ? Java Basics - Anfänger-Themen 30
D Zuerst Objektorientierung oder GUI ? Java Basics - Anfänger-Themen 19
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
berserkerdq2 Warum macht man in IJVM am Anfang Bipush 0? Java Basics - Anfänger-Themen 1
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
K Gleitkommazahl macht man 0 punkt matisse oder 1 punkt matisse Java Basics - Anfänger-Themen 2
B Methoden warum macht die Methode nicht das was ich erwarte? Java Basics - Anfänger-Themen 2
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
N Was macht die Klasse? Java Basics - Anfänger-Themen 3
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
L Was genau macht -> Java Basics - Anfänger-Themen 18
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
U Best Practice Fehleranalyse, welche Fehler macht Ihr beim Lernen bzw. auch später Java Basics - Anfänger-Themen 12
L Hilfe! Was macht dieser Code? Java Basics - Anfänger-Themen 1
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
M Was macht super (...)? Java Basics - Anfänger-Themen 1
Tommy135 Klassen jComboBox macht nicht was sie soll Java Basics - Anfänger-Themen 4
J JButton macht was er will Java Basics - Anfänger-Themen 3
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Habe ein frage wie man etwas macht. Java Basics - Anfänger-Themen 13
B Was macht diese Methode? Java Basics - Anfänger-Themen 9
P Was macht diese methode Java Basics - Anfänger-Themen 2
Tacofan Was macht dieses "Stückchen Code"? Java Basics - Anfänger-Themen 3
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
C Hilfe - Kleines Programm macht mir Schwierigkeiten Java Basics - Anfänger-Themen 2
G Methoden Was genau macht die Methode light.setInfluencingBounds ? Java Basics - Anfänger-Themen 5
B Erste Schritte Way of life ohne import - Habe Beispiel, macht Unfug Java Basics - Anfänger-Themen 21
D Methoden Filewriter macht keine Zeilenumbrüche Java Basics - Anfänger-Themen 3
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
H Tastatur.wurdeGedrueckt() macht nicht das, was ich will :/ Java Basics - Anfänger-Themen 2
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
J Shakersort, das Array macht Probleme! Java Basics - Anfänger-Themen 4
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Scrollpanel autoscroll(false) macht nix Java Basics - Anfänger-Themen 2
M StringTokenizer macht Quatsch Java Basics - Anfänger-Themen 21
N Papaklasse macht Zicken mit Parameterkonstruktor Java Basics - Anfänger-Themen 7
K Datentypen double x als Bruch aus Integern macht x zu integer? Java Basics - Anfänger-Themen 3
C Erste Schritte was macht eigentlich "for (;;)" Java Basics - Anfänger-Themen 7
C JDK-Installer macht nichts Java Basics - Anfänger-Themen 11
A JApplet: einbinden von weiteren Jars macht Probleme Java Basics - Anfänger-Themen 2
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
I Für was macht man "deep Kopien" Java Basics - Anfänger-Themen 4
S Erste Schritte While do Schleife - macht nicht was sie soll Java Basics - Anfänger-Themen 7
9 Programm macht nicht was es soll Java Basics - Anfänger-Themen 6
H Was macht diese Methode? Java Basics - Anfänger-Themen 3
S JApplet macht Probleme Java Basics - Anfänger-Themen 2
Y Was macht folgende Regular Expression Java Basics - Anfänger-Themen 2
M Was macht bzw. was bringt ein constructor? Java Basics - Anfänger-Themen 12
P orphaned case macht probs Java Basics - Anfänger-Themen 3
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
X Selectionsort macht Probleme Java Basics - Anfänger-Themen 2
P was macht der code? Java Basics - Anfänger-Themen 4
M OOP for Schleife macht mir Probleme mit Arrays Java Basics - Anfänger-Themen 7
R Was macht...? Java Basics - Anfänger-Themen 4
alderwaran closed source jar, kein javadoc. was macht methode x eigentlich? ( oracle forms pjc beans ) Java Basics - Anfänger-Themen 2
M JavaEditor macht Probleme! Invalid Flag! Java Basics - Anfänger-Themen 9
P Was macht dieser Source code? Java Basics - Anfänger-Themen 5
R BufferedWriter macht komische Zeichen Java Basics - Anfänger-Themen 3
I KeyEvent macht nichts.^^ Java Basics - Anfänger-Themen 3
E new File macht den Pfad kaputt Java Basics - Anfänger-Themen 15
S Wie macht man sowas?? Ist da ne If-Schleife richtig?? Java Basics - Anfänger-Themen 22
Pithecanthropus Thread anhalten, der aber ein readObject() macht. Java Basics - Anfänger-Themen 4
T aufruf methode in methode macht probleme Java Basics - Anfänger-Themen 9
I Was macht diese Funktion? Java Basics - Anfänger-Themen 4
0 Was macht eine IOException? Java Basics - Anfänger-Themen 4
0 Was ist ein GregorianCalender?(Was macht es etc.) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben