Kommentare prüfen

Status
Nicht offen für weitere Antworten.

bjcoon

Aktives Mitglied
Hallöchen,

ich hab hier zwei Klassen kommentiert und hoffe die richtig verstanden zu haben.
Wäre sehr nett, wenn ihr mal drüberschauen könntet und mir kurz sagt, ob die richtig sind.

Code:
public class RingBuffer implements Serializable {
	private String[] list;//Array zur Speicherung der eingegebenen Wörter 
	private int size, top = 0;
	
	public RingBuffer() {//Konstruktor
		this(4);//Größe des Arrays
	}
	
	public RingBuffer(int size) {//Konstruktor
		this.size = size;//übergegebener Formalparameter size, wird Klassenvariable size zugewiesen
		list = new String[size];//Initialisierung des String Arrays 'list'
		for (int i = 0; i < list.length; i++) list[i] = "";//Wenn String Array leer, dann schreibe auch nichts in Array bzw. einen leeren String
	}
	
	public void Save(String file) {	
		try {
			FileOutputStream fos = new FileOutputStream(file);//Instantiierung des FileOutputstreams fos mit Formalparameter file
															  //Parameter ist "buffertext.txt"
			ObjectOutputStream oos = new ObjectOutputStream(fos);//Instantiierung des ObjectOutputStreams oos, mit Formalparameter fos.							 //Object, in dem Fall der FileOutputStream wird in DAtei geschrieben.
			oos.writeObject(this);//Befehl zum Schreiben
			oos.close();//Schließen des ObjectOutputStreams 
			fos.close();//Schließen des FileOutputStreams
		} catch (Exception exc)  {}//Auffangen und gleichzeitiges Ignorieren der Exception
	}
	public static RingBuffer Load(String file) {//Load Methode zur Laden des Inhalts der buffersave.txt in den InputStream
		try {
			FileInputStream fis = new FileInputStream(file);//Instantiierung des FileInputstreams fis mit Formalparameter file//Parameter ist "buffertext.txt"
			ObjectInputStream ois = new ObjectInputStream(fis);//Instantiierung des ObjectInputStreams ois, mit Formalparameter fis.															   //Das Objekt, FileInputStream mit buffersave.txt als Inhalt wird in Stream geladen
			RingBuffer obj = (RingBuffer)ois.readObject();//Lesen des Objekts buffersave.txt
			ois.close();//Schließen des ObjectInputStreams
			return obj;//Rückgabe des neuen RingBuffer Objekts an den Methodenaufruf in AComplete
		} catch (Exception exc)	{//Auffangen der Exception
			System.out.println(exc.getMessage());//Wenn keine Datei vorhanden,
			return new RingBuffer(); //Systemnachricht auf Konsole ausgeben und neuen RingBuffer erzeugen
		}
	}
	public String toString() {//Eingabe in Textfield wird in String umgewandelt und im Textfield dargestellt
		for (int i = top + 1; i < list.length; i++) {
				System.out.println(list[i]);//Ausgabe des gespeicherten Strings an durch for-Schleife ermittelten Index
		}
		for (int i = 0; i < top; i++) {
				System.out.println(list[i]);//Ausgabe des gespeicherten Strings an durch for-Schleife ermittelten Index
		}
		return "top:" + top; //Rückgabe an Methodenaufruf in AComplete
	}
	public void add(String s) {//Methoden zum "adden" an Array list 
		list[top] = s;//Mit Enter bestätigtes Wort wird in String Array an die Spitze gesetzt. Das Array stellt ein Stack dar
		System.out.println(list[top]);//Ausgabe auf die Konsole an welcher Stelle wir im Array wir uns befinden bzw. das wievielte Element die Spitze ist
		top++;//top wird erhöht. Mit jedem Hinzufügen eines Strings in das Array, wird das Array größer. Somit auch der Index von top.
		if (top == list.length) top = 0;//Wenn die endgröße des arrays erreicht ist, wird das "älteste Element überschrieben. Das Setzen von top auf 0 bewirkt das 
	}
	public String match(String input) {//Methode zum Vergleich auf Übereinstimmung der Eingabe mit einem String aus dem Array list.//Formalparameter ist input, heißt die aktuelle eingabe
		if (input.length() == 0) return "";//wenn keine eingabe getätigt wurde, dann gebe auch nichts zurück
		for (int i = 0; i < list.length; i++) {//Überprüfe stetig, ob
			if (list[i].startsWith(input)) return list[i];//ein eingegebenes element mit einem Element übereinstimmt bzw. beginnt, ab dem Punkt meiner Eingabe immer aufs neue. //Bei Eingabe eines Buchstaben wird stetig geprüft, ob eine Element diese Buchstabenfolge beinhaltet
//Parameter wird an Variable match in AComplete zurückgegeben und in store gespeichert.
		}
		return "";//Standardrückgabewert ""
	}
}

Die dazugehörige AComplete Klasse folgendermaßen:
Code:
public class AComplete extends JFrame {
	private JLabel fieldname;//Neues JTextLabel
	private JTextField textfield;//Neues JTextField
	RingBuffer buffer;//Instantiierung des RingBuffer Objects
	String store = "";//Temp variable zum zwischenspeichern des Eingabe-Strings
	String match = "";//StringVariable zum Speichern des "Treffers"
	public AComplete(){
		setTitle("Autocomplete");//Titel des Frames
		buffer = RingBuffer.Load("buffersave.txt");//Methodenaufruf Load aus der Klasse RingBuffer
//Laden des Inhalts der buffersave.txt in den FileInputStream
		System.out.println(buffer.toString());//Ausgabe des Inhalts der buffersave.txt
		init();//Aufrufen von init()
		setSize(400, 90);//Größe des Frames
		setVisible(true);//Sichtbarkeit des Frames
	}
	private void init(){
		fieldname = new JLabel("Eingabe");//Instantiierung eines neuen JLabel mit Name fieldname und dem String "Eingabe"
		textfield = new JTextField("");//Instantiierung eines neuen JTextfields mit leerem Inhalt
		setLayout(new GridLayout(2,1));//Reihenlayout, 2 Reihen, 1 Element pro Reihe
		add(fieldname);//Hinzufügen des JLabels
		add(textfield);//Hinzufügen des JTextfields
		textfield.addKeyListener(new KeyListener(){ //Anonyme Implementierung des KeyListeners
//Leere Implementierung der restlichen KeyListener
			public void keyPressed(KeyEvent e) {
				textfield.setText(store);//Wenn Buchstabe eingetippt wird, wird dieser als Text mit Hilfe von setText gesetzt und in store gespeichert
					System.out.println(e.getKeyChar());//Realisierung des AutoComplete, Markieren und vervollständigen der Eingabe
					match = buffer.match(textfield.getText());//Aktuelle Eingabe in match gespeichert und auf Treffer untersucht
					store = textfield.getText();//Zwischenspeicherung der aktuellen Eingabe in store 
					if (!match.equals("")) {//Wenn match nicht leer
						textfield.setText(match);//Autocomplete mit Treffer
				textfield.setSelectionStart(store.length());//Markierungsbeginn der autovervollständigten Restwortes
textfield.setSelectionEnd(match.length());//Markierungsende des autovervollständigten Restwortes
						System.out.println("match: " + match);//Wenn match einen Treffer gefunden hat, wird dieser auf die Konsole ausgegeben
					}
				}			
			}
		);
		textfield.addActionListener(new ActionListener(){//Anonyme Implementierung des ActionListener
			public void actionPerformed(ActionEvent b){//ActionEvent wird implementiert
				buffer.add(textfield.getText());//Hinzufügen des eingebenen Wortes in das String Array "list", Enter ist erforderlich - ActionListener!
				textfield.setText("");//Nach Bestätigung mit Enter Textfeld leer
				store = "";//Store wird auch leer gesetzt
				System.out.println(buffer.toString());//Ausgabe des Strings aus dem Array "list" in Textfield, Methode ermittelt passenden ArrayIndex mit for-Schleifen
			}});
		this.addWindowListener(new WindowListener(){//Anonyme Implementierung des WindowListeners
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				buffer.Save("buffersave.txt");//Speicherung in buffersave.txt bei Schließen des Fensters
				System.exit(0);//Beenden der Streams und des GUIs
			}
//Leere Implementierung restlicher WindowListener
		});
	}	
	public static void main(String[] args) {
		new AComplete();//Instantiierung des Frames AComplete
	}
}


Die beiden Klassen realisieren einen Autocomplete.

Vielen Dank schon mal...
 
Die Kommentare scheinen richtig zu ein (kann durchaus sein, dass ich was überlesen habe), aaaaaaaaaaaaaber:

- Methoden werden *immer* klein geschrieben, alles andere verwirrt nur

- Die folgende Methode "funktioniert" zwar, ist aber ziemlich zweckfrei. toString() ist dazu da, eine sinnvolle Repräsentation des Objekts als *String* zu liefern. Das kann der zurückgelieferte Wert top nicht leisten. Außerdem sollte man "Seiteneffekte" wie println in toString unterlassen. Es wäre viel sinnvoller, die Sachen, die momentan println ausgibt, in den Rückgabe-String zu packen.

Code:
	public String toString() {
                StringBuilder sb = new StringBuilder();
		for (int i = top + 1; i < list.length; i++) {
				sb.append(list[i]).append("\n");
		}
		for (int i = 0; i < top; i++) {
				sb.append(list[i]).append("\n");
		}
		return sb.toString();
	}
 
Zuletzt bearbeitet:
was soll ein "Formalparameter" sein, im Leben nie gehört 😕
for (int i = 0; i < list.length; i++) list = "";//Wenn String Array leer, dann schreibe auch nichts in Array bzw. einen leeren String

ich weiß nicht, was du gemeint hast, eine "wenn-dann" konstruktion kann ich in dieser harmlosen for-schleife jedenfalls nicht erkennen.

public void Save(String file)
wtf is that? Zum einen schreibt man methodennamen klein, zum anderen haben diese merkwürdigen methoden nichts mit dem oben angegebenen Serializable-Interface zu tun. Man muss stattdessen writeObject und readObject überschreiben. Die API bringt's, ehrlich^^

//Parameter ist "buffertext.txt"
das ist was? Hellseherei? Normalerweise ist der Parameter das, was als Parameter übergeben wird.
oos.writeObject(this);//Befehl zum Schreiben
Okay, der Sinn des gesammten Unternehmens mit "Save" und "Load" usw ist mir schleierhaft. Die tuen doch nichts, außer bereits existierende methoden zu wrappen und hinter hässlichen namen zu verstecken. Soll wahrscheinlich zur Verwirrung der Volksfeinde beitragen, soll mir recht sein^^ 😵?
public static RingBuffer Load(String file) {//Load Methode zur Laden des Inhalts der buffersave.txt in den InputStream
derselbe "buffersave.txt"-Salat schon wieder. An mehreren Stellen. Raus damit.

public String toString() {//Eingabe in Textfield wird in String umgewandelt und im Textfield dargestellt
"Eingabe"? "Textfield"?? Ne, sowas hat mit der toString() methode definitiv nichts zu tun. Siehe wieder API: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#toString() Da steht ja wohl mehr als unmissverständlich, was die methode tut.
for (int i = top + 1; i < list.length; i++) {
System.out.println(list);//Ausgabe des gespeicherten Strings an durch for-Schleife ermittelten Index
}

ne, diese toString() methode ist total zum verschrotten. Zum einen liefert sie irgendwelchen Müll, zum anderen DARF EINE TO STRING METHODE NIEMALS LABERN! Sowas wie "System.out.println" hat da absolut nichts verloren, nicht nur dass es keinen Sinn macht: zB. in Applets würde es nicht mal funktionieren.
return "top:" + top; //Rückgabe an Methodenaufruf in AComplete
was ist dieses "AComplete"? Wie willst du einschränken, dass diese Methode nur von AComplete aufgerufen wird? ne, das ist genauso sinnfrei wie die ganze methode.
public void add(String s) {//Methoden zum "adden" an Array list
Die methode "add" "addet" also irgendwas? Doppelgemoppelgedoppeltgemoppelt.
list[top] = s;//Mit Enter bestätigtes Wort wird in String Array an die Spitze gesetzt. Das Array stellt ein Stack dar
was für ein "Enter"? Was ist wenn ich auf meinem nuklear betriebenen Satellitenhandy gar kein Enter habe, kann ich die Klasse nicht benutzen oder wie? Hier gilt dasselbe wie für dieses "buffersave.txt": das was draußen vermutlich passieren könnte geht die Klasse nichts an.
System.out.println(list[top]);//Ausgabe auf die Konsole an welcher Stelle wir im Array wir uns befinden bzw. das wievielte Element die Spitze ist
schon wieder: methoden dürfen auf keinem Fall selbständig rumlabern, höchstens bei schwerwiegenden Exceptions. Und ob das auf die Konsole oder zum Marsrover geschickt wird, kannst du aus deiner Klasse auch auf keine weise beeinflüssen, daher ist das Kommentar sinnfrei, genau wie die Codezeile.
top++;//top wird erhöht. Mit jedem Hinzufügen eines Strings in das Array, wird das Array größer. Somit auch der Index von top.
autsch. Das ist jetzt keine Feinheit oder Formalität, sondern ein Grundlegender Verständnisfehler. Ringpuffer wird nicht größer oder kleiner, das ist ja genau der Sinn eines Ringpuffers...
if (top == list.length) top = 0;//Wenn die endgröße des arrays erreicht ist, wird das "älteste Element überschrieben. Das Setzen von top auf 0 bewirkt das
das hört sich schon etwas besser an.

//Formalparameter ist input, heißt die aktuelle eingabe
und der Himmel ist Blau und die Bäume sind grün und die Sahara ist 5000km breit. Alles richtig, aber ein sinnvolles Kommentar ist das freilich nicht.

if (input.length() == 0) return "";//wenn keine eingabe getätigt wurde, dann gebe auch nichts zurück
Naja, "" ist schon ein wesentlich komplexeres Gebilde als ein "nichts", was man i.Allg. wohl eher mit null darstellen würde, aber gut, weiß eh nicht was die methode soll.
1) ...beginnt, ab dem Punkt meiner Eingabe immer aufs neue.
2) ...//Bei Eingabe eines Buchstaben wird stetig geprüft, ob eine Element diese Buchstabenfolge beinhaltet
1) wie, wo was für einem Punkt?
2) "beinhaltet" ist hier das falsche Wort, zumindest ist das sehr unpräzise. Da steht doch: "startsWith()"...

//Parameter wird an Variable match in AComplete zurückgegeben und in store gespeichert.
schon wieder willst du irgendwoher wissen, was draußen mit der Klasse gemacht wird...
_______________________________________________________________

//Neues JTextLabel
zum einen unnötig, zum anderen Falsch. Eine solche Swing Komponente gibt es nicht in der freien Wildbahn.
RingBuffer buffer;//Instantiierung des RingBuffer Objects
wieder unnötig und wieder falsch. Hier wird noch nichts instanziiert, sondern lediglich deklariert.

//Laden des Inhalts der buffersave.txt in den FileInputStream
zu was gehört das?

//Leere Implementierung der restlichen KeyListener
...
//Leere Implementierung restlicher WindowListener
die habe ich im code irgendwie nicht entdecken können, kompiliert das so überhaupt? ???:L


*pphooo*
usw usw... blah blah blah... reicht's an Kritik erstmal? Wenn nötig kann ich noch ein paar punkte nachschmeißen^^ 😛

Hmm, ja, also, bis auf die merkwürdige Methodenbenennung und dauernd unnötige System.out.println's muss ich sagen: cooles beispielprogrammchen... Das ist doch so eine Art Hausaufgabe, richtig? Endlich mal was interessantes :toll: 😉
 
for (int i = 0; i < list.length; i++) list = "";//Wenn String Array leer, dann schreibe auch nichts in Array bzw. einen leeren String


Ich würd eher mal sagen hier wird das Array von Anfang bis Ende durchlaufen und in jedes Feld wird ein leerer String gesetzt, wobei das jetzt nicht so wirklich viel Sinn macht
 
Die Kommentare scheinen richtig zu ein (kann durchaus sein, dass ich was überlesen habe), aaaaaaaaaaaaaber:

- Methoden werden *immer* klein geschrieben, alles andere verwirrt nur

- Die folgende Methode "funktioniert" zwar, ist aber ziemlich zweckfrei. toString() ist dazu da, eine sinnvolle Repräsentation des Objekts als *String* zu liefern. Das kann der zurückgelieferte Wert top nicht leisten. Außerdem sollte man "Seiteneffekte" wie println in toString unterlassen. Es wäre viel sinnvoller, die Sachen, die momentan println ausgibt, in den Rückgabe-String zu packen.

Code:
	public String toString() {
                StringBuilder sb = new StringBuilder();
		for (int i = top + 1; i < list.length; i++) {
				sb.append(list[i]).append("\n");
		}
		for (int i = 0; i < top; i++) {
				sb.append(list[i]).append("\n");
		}
		return sb.toString();
	}


Ich versteh noch nicht ganz, was diese Methode macht. Vielleicht kann mir da jemand nochmal auf die Sprünge helfen... Würde mal tippen exakt das gleiche, wie die Ursprüngliche. Sehe ich das richtig? Und wie genau lässt sich das in "normalen" erklären bzw. kommentieren?
 
Ich versteh noch nicht ganz, was diese Methode macht. Vielleicht kann mir da jemand nochmal auf die Sprünge helfen...
Würde mal tippen exakt das gleiche, wie die Ursprüngliche. Sehe ich das richtig?
Nein.

Landei's version tut genau das, was von einer normalen toString() implementierung erwartet wird: sie liefert einen String zurück, der den Zustand des Ringpuffers angemessen beschreibt. Wäre dein Ringpuffer etwa mit Werten
["alpha","beta","gamma","delta"] gefüllt, und wäre der top auf dem Wert 2, dann würde es einen String "gamma\ndelta\nalpha\nbeta\n" liefern, was den Zustand des Ringpuffers sehr schön wiederspiegelt. Die Implementierung die du da angeschrieben hast würde dagegen lediglich "top:2" ausgeben, was nicht allzuviel über den Zustand des Ringpuffers verrät. Dafür wird aber die Konsole ohne Aufforderung zugemüllt, was bei jedem Benutzer lediglich für kurzes Staunen sorgen würde: allein deswegen schon würde die Klasse niemand zum zweiten mal benutzen.

Und wie genau lässt sich das in "normalen" erklären bzw. kommentieren?
in der von dir geposteten Implementierung? Gar nicht. Wie willst du da irgendwas reinkommentieren, was gar nicht da ist? Diese Methode tut ja irgendwas einigermaßen sinnvolles, nur mit dem erwarteten Verhalten von toString() hat's leider absolut nichts zu tun.
 
wenn ich die toString() so abändere, dann wird leider immer nur ein Buchstabe in das Textfield geschrieben bzw. es ist immer nur ein Buchstabe sichtbar. man sieht nie ein ganzes wort.

Hmm, das ist seltsam... Vor allem weil meiner meinung nach toString() von diesem Ringpuffer eigentlich nirgends verwendet wird, wo es darauf ankommen würde... 😕
 
Hab deinen originalcode jetzt kompiliert: mach dir keine Sorgen, es liegt nicht an Landei's implementierung, es funktioniert auch so schon nicht... Ich sehe auch immer nur einen Buchstaben.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben