Java Quelltextanalyse

Samsa

Commander
Registriert
Dez. 2005
Beiträge
2.614
Hi,

ich habe von meiner Freundin einen Javaquelltext gekriegt. Sie hat mich gebeten diesen durchzukommentieren. Da ich von Java aber null Ahnung habe wollte ich fragen ob sich hier jemand bereiterklären würde dies zu machen. Es handelt sich um eine einfache verkettete Liste.
(Es ist auch nicht viel Code. ;))

Gruß, Jan

Code:
Klasse List:



package packList;

public class List  
{
	ListNode first;
	ListNode last;
	ListNode pos;
	
	public List()
	{ 	first = null;
		last= null;
		pos= null;
	}
	
	public boolean isEmpty()
	{ return first == null;
	}
	
	public void add(ListNode n) // Debug! 
	{ if (isEmpty() )
		{ 	first=n;
			last=n;
			pos=n;
		}
			else
			{ last.next =n;
			  last=n;
			}
	}
	
	public void toFirst()
	{ if (!(isEmpty()))
	  {	pos=first;
	  }
	}
	
	public void toLast()
	{ if (! (isEmpty()))
		{ pos=last;
		}
	}
	
	public void next()
	{ if (!(isEmpty()) & !isBehind())
		{ pos= pos.next;
		}
	}
	
	public void previous()
	{ if (! (isEmpty())& !isBefore())
		{ pos=getPrevious();
		}
	}
	
	public boolean isBefore()
	{ return pos==first;
	}
	
	public boolean isBehind()
	{return pos==last;
	}
	
	public int getItem()
	{ if(! (isEmpty()))
		{ return pos.data;
		}
		return 0;
	}
	
	public void update (ListNode n)
	{ if (! (isEmpty()))
		{ pos.data=n.data;
		}
	}
	
	private ListNode getPrevious()
	{ ListNode seek=first;
		if (! (isEmpty()))
		{
			while(!(seek.next==pos))
			{	//Suchen....\m/seek=seek.next;
			}
			return seek;
		}
		return null;
	}
		
	public void insertBehind(ListNode n)
	{	if (isEmpty())
		{	first=n;
			last=n;
			pos=n;
		}	
		else 
		{	n.next=pos.next;
			pos.next=n;
			if(pos==last)	last=n;
		}
	}
	
	public void insertBefore(ListNode n)
	{	if (isEmpty())
		{	first=n;
			last=n;
			pos=n;
		}	
		else if(pos==first)
		{ 	n.next=first;
			first=n;
		}	
		else
		{	n.next=getPrevious().next;
			getPrevious().next=n;
		}
	}
	
	public void delete()
	{
		if(!(isEmpty()))
		{	
			if(isBehind()	&& isBefore())
			{	first=null;
				last=null;
				pos=null;
			}	
			else if(isBehind())
			{	last=getPrevious();
				getPrevious().next=null;
				pos=last;
			}
			else if (isBefore())
			{	first=pos.next;
				pos=first;
			}
			else
			{	getPrevious().next=pos.next;
				pos=pos.next;
			}
		}
	}
}
 
Meinst du, dass wir Kommentare zum Code abgeben sollten in der Art: "Sieht ganz gut, aber ich würde eher dieses und jenes machen"?
Oder meinst du eher den Code durch Javadoc-Kommentare zu vervollständigen?

Zu Ersterem hätte ich ein paar Anmerkungen:
Thema Programmierstil (wird auch schnell zu einem Glaubenskrieg). Wenn man noch am lernen ist, mag das noch nicht so wichtig sein, aber wer wie ich beruflich programmiert muss da wert drauf legen:
Zeilenumbrüche: Nach { folgt kein code mehr, sondern ein Zeilenumbruch
Hässlich:
Code:
public List()
	{ 	first = null;
		last= null;
Schön(er):
Code:
public List()
	{ 	
 	 	first = null;
		last= null;
Einrückungen:
Tabulatoren oder Leerzeichen ist eigentlich egal. Ich denke, dass sich mittlerweile das Ersetzen von Tabs durch drei oder vier Leerzeichen durchgesetzt hat.
Ist aber echt nicht so wichtig.

Wichtiger ist, dass man den gewählten Stil konsequent durchzieht.
Negativbeispiel:
Code:
	public void add(ListNode n) // Debug! 
	{ if (isEmpty() )
		{ 	first=n;
			last=n;
			pos=n;
		}
			else
			{ last.next =n;
			  last=n;
			}
	}
Der else-Block sollte komplett um eine Einrückung nach links gerückt werden.
Dann aber auch die öffnenden Klammern { direkt unter das zugehörige Schlüsselwort setzen, hier halt unter das if.
 
Vielen Dank schon mal. Ich werde es so an sie weitergeben :)
Was ich eigentlich meinte waren Kommentare im Quelltext sprich
"// Hier passiert xy"
"// Hier wird ein xy gesetzt" usw.
Javadoc-Kommentare wären dann diese, oder?
Ich weiß zwar im groben und ganzen was passiert jedoch wären meine Kommentare zu den einzelnen Blöcken bzw. Schritten sicherlich nicht so gut und vor allem richtig wie die von jemandem der sich mit Java auskennt.
 
Wieso kann deine Freundin das denn nicht selber machen, wenn sie es sogar programmiert hat? Klingt irgendwie nach Hausaufgabe. Ich glaube nicht dass sich hier jemand findet, der Lust hat das Programm eines anderen zu kommentieren..
 
Ich hab doch nicht gesagt das sie es selber Programmiert hat. Und nein, es ist auch keine Hausaufgabe.
Es geht einfach nur um das Verständnis des Codes.
Den Thread habe ich erstellt um jemanden zu finden der es machen würde.
Es soll Menschen geben die einfach Spaß daran haben anderen zu helfen ;)
 
Hallo,
wenn das keine Hausaufgabe ist wie du selbst sagst, dann muss deine Freundin dieses Programm ja irgendwo her haben, wenn sie es nicht selbst geschrieben hat.
Von dieser "Quelle" sollte es auch möglich sein weitere Informationen zu bekommen.
Ganz nebenbei gemerkt ist das wirklich eine typische Hausaufgabe und das der Source-Code unvollständig ist spricht ebenfalls dafür.
Falls sich deine Freundin wirklich dafür interessiert und etwas lernen will, schlage ich an dieser Stelle mal vor sich be einschlägigen Quellen nach verketteten Listen zu informieren.
Danach sollte es auch kein Problem sein den Quellcode selbst zu kommentieren.


BTW: Auch wenn du anderes behauptest ich tippe trotzdem darauf, dass es Hausaufgaben sind :evillol:
 
Wer sagt denn überhaupt das sie noch zur Schule geht? Ich hab davon nichts gesagt.
Einzig und allein das ich den Quelltext von ihr habe und das sie mich gefragt hat ob ich ihn kommentieren könnte.
Weiß der Geier ob es für sie, ihren Vater oder den Postboten ist.
Das sollte aber auch nicht das Thema sein und werden.
 
Aber dann kann ja hier jeder mit seinen Hausaufgaben kommen und behaupten, es wäre keine Hausaufgabe und für jemand anderen ;)
 
Gut, im nächsten Thread mit ähnlichem Thema werde ich dann eine Kopie meines und ihres Studentenausweises anfügen.:rolleyes:
 
Es sollte selbstverständlich sein, dass auch Studenten ihr Aufgaben selbst lösen :rolleyes:

Wenn du eine direkte Frage hast kannst du sie stellen - aber es kann nicht sein dass andere deine/eure/ihre/etc. Aufgabe(n) lösen sollen!
 
Es findet sich immer ein Idiot...

Bei kommentieren geht es nicht darum, denn Quellcode zu erklären, sondern zu erklären was gemacht wird. bzw was man versucht mit einer Funktion zu tun. Ansonsten geht man davon aus, dass derjenige, der den Quellcode liest einfache Anweisungen und Algorithmen versteht.


Ich glaub fast, dass hier etwas anderes gesucht war: Nämlich eine Erklärung, was hier eigentlich gemacht wird ;) Das gehört aber nicht unbedingt in einen gut kommentierten Code!

Davon abgesehn weisst der Code noch einige Mängel auf.. Ein paar Code style Sachen habe ich angepasst, aber trotzdem bleibt noch einiges fragwürdig.

Code:
/**
 * @author Mrs. IDontLikeHomeWork Lazy
 */
public class List {
	/**
	 * Das erste Element in der Liste.
	 */
	private ListNode first;

	/**
	 * Das letzte Element in der Liste.
	 */
	private ListNode last;

	/**
	 * Der Zeiger auf das aktuelle Element, das in der Liste betrachtet wird.
	 */
	private ListNode pos;

	/**
	 * Konstruktor. Initalisiert einen leere Liste.
	 */
	public List() {
		first = null;
		last = null;
		pos = null;
	}

	/**
	 * Prüft die Liste auf Leerheit.
	 * 
	 * @return true, wenn die Liste leer ist, false sonst.
	 */
	public boolean isEmpty() {
		return first == null;
	}

	/**
	 * Fügt ein Element an das Ende der Liste ein.
	 * 
	 * @param n Der Eintrag, der der Liste hinzugefügt werden soll
	 */
	public void add(ListNode n) {
		if (isEmpty()) {
			first = n;
			last = n;
			pos = n;
		} else {
			last.next = n;
			last = n;
		}
	}

	/**
	 * Setzt den Positions Zeiger an den Anfang der Liste.
	 */
	public void toFirst() {
		if (!(isEmpty())) {
			pos = first;
		}
	}

	/**
	 * Setzt den Positions Zeiger an das Ende der Liste.
	 */
	public void toLast() {
		if (!(isEmpty())) {
			pos = last;
		}
	}

	/**
	 * Schiebt den Positions Zeiger um eine Position weiter.
	 */
	public void next() {
		if (!(isEmpty()) & !isBehind()) {
			pos = pos.next;
		}
	}

	/**
	 * Schiebt den Positions Zeiger um eine Position nach hinten.
	 */
	public void previous() {
		if (!(isEmpty()) & !isBefore()) {
			pos = getPrevious();
		}
	}

	/**
	 * Prüft, ob sich der Zeiger am Anfang der Liste befindet.
	 * 
	 * @return true, wenn sich der Positions Zeiger an erster Stelle befindet; false sonst
	 */
	public boolean isBefore() {
		return pos == first;
	}

	/**
	 * Prüft, ob sich der Zeiger am Ende der Liste befindet.
	 * 
	 * @return true, wenn sich der Positions Zeiger an der letzten Stelle befindet; false sonst
	 */
	public boolean isBehind() {
		return pos == last;
	}

	/**
	 * Gibt den Wert an der aktuellen Position zurück.
	 * 
	 * @return Der Wert an aktuellen Position.
	 */
	public int getItem() {
		if (!(isEmpty())) {
			return pos.data;
		}
		return 0;
	}

	/**
	 * Setzt den Wert von der ListNode an der aktuellen Position.
	 * 
	 * @param n die ListNode, die den Wert enthält, der übertragen werden soll.
	 */
	public void update(ListNode n) {
		if (!(isEmpty())) {
			pos.data = n.data;
		}
	}

	/**
	 * Gibt die ListeNode vor dem Zeiger zurück. ACHTUNG: Diese Funktion wirft eine NullPointerException, wenn der
	 * Zeiger auf das erste Element zeigt. PERFORMANCE: Wenn diese Funktion oft benutzt wird, sollte eine alternative
	 * Datenstruktur benutzt werden, da diese Implementierung ineffizient ist.
	 * 
	 * @return das Element vor dem Element auf den der Zeiger zeigt.
	 */
	private ListNode getPrevious() {
		ListNode seek = first;
		if (!(isEmpty())) {
			while (seek.next != pos) {
				seek = seek.next;
			}
			return seek;
		}
		return null;
	}

	/**
	 * Fügt einen Listen Knoten direkt nach dem Element am Positions Zeiger ein.
	 * 
	 * @param n der Listen Knoten der eingefügt werden soll
	 */
	public void insertBehind(ListNode n) {
		if (isEmpty()) {
			first = n;
			last = n;
			pos = n;
		} else {
			n.next = pos.next;
			pos.next = n;
			if (pos == last) {
				last = n;
			}
		}
	}

	/**
	 * Fügt einen Listen Knoten direkt vor dem Element am Positions Zeiger ein.
	 * 
	 * @param n der Listen Knoten der eingefügt werden soll
	 */
	public void insertBefore(ListNode n) {
		if (isEmpty()) {
			first = n;
			last = n;
			pos = n;
		} else if (pos == first) {
			n.next = first;
			first = n;
		} else {
			n.next = getPrevious().next;
			getPrevious().next = n;
		}
	}

	/**
	 * Löscht das Element auf das der Positions Zeiger zeigt. Zusätzlich wird der Positions Zeiger nach folgenden Regeln
	 * verschoben: 1) Ein Element am Ende der Liste wird gelöscht: Der Positions Zeiger zeigt auf das letzte Element der
	 * aktualisierten Liste 2) Ein Element am Anfang der Liste wird gelöscht: Der Positions Zeiger zeigt auf das erste
	 * Element der aktualisierten Liste 3) Ein Element zwischen Anfang und Ende der Liste wird gelöscht: Der Positions
	 * Zeiger zeigt auf das Element das dem gelöschten Element nachfolgt. Wenn die Liste leer ist, passiert nichts.
	 */
	public void delete() {
		if (!(isEmpty())) {
			if (isBehind() && isBefore()) { // es existiert höchstens ein Element
				first = null;
				last = null;
				pos = null;
			} else if (isBehind()) { // Zeiger am Ende der Liste
				last = getPrevious();
				getPrevious().next = null;
				pos = last;
			} else if (isBefore()) { // Zeiger am Anfang der Liste
				first = pos.next;
				pos = first;
			} else { // Zeiger irgendwo zwischen Anfang und Ende
				getPrevious().next = pos.next;
				pos = pos.next;
			}
		}
	}
}


Gut, im nächsten Thread mit ähnlichem Thema werde ich dann eine Kopie meines und ihres Studentenausweises anfügen.
Aber beeil dich damit, denn möglicherweise musst du ihn, wen ihr so weitermacht, bald dauerhaft abgeben ;)
 
Zuletzt bearbeitet:
Super, danke. :)
Sie studiert nichts was auch nur annähernd mit Informatik zu tun hat und ich habe Java bis jetzt noch nicht als Modul gewählt ;)

/Edit:
@author Mrs. IDontLikeHomeWork Lazy
Da musste ich dann doch lachen :D
 
Zuletzt bearbeitet:
Zurück
Oben