Wichtige Hinweise

steffen12
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 205
Registriert: 14. Okt 2009 16:28

Wichtige Hinweise

Beitrag von steffen12 » 5. Jan 2014 17:22

Hallo zusammen,

es haben sich nun durch verschiedene Threads hindurch bestimmte Fragen gehäuft und ich möchte diese hier einmal zentral beantworten.
Vorab: Wir bitten um Entschuldigung, falls wir wichtige Dinge nicht deutlich genug kommuniziert haben sollten, was euch dann unötig Zeit gekostet hat. Unsere Bemühung war immer, das zu vermeiden.

Zu den Themen:

1) Die Methode equals():
Bitte alle Vergleiche (in If -Statements und ähnlichem) mit der Methode equals durchführen.
Beispiel:
Position pos1 = new Position(0, 0);
pos1.equals(new Position(0, 1)) --> false.
Primitive Datentypen (int, boolean usw.) sind hiervon ausgenommen.

2) Die Klasse MutationTest ist nicht kompilierbar, weil dafür ein import fehlt. Das ist nicht schlimm, diese Klasse hat mit den eigentlichen Test nichts zu tun. Das ist ein Test für die Tests. Ihr könnt diese Klasse löschen.

3) Exceptions die für die GUI bestimmt sind und von Tests erwartet werden, dürfen nicht im Controller oder im Model gefangen werden. Wenn es in Ausnahmefälllen doch notwendig sein sollte, dann werft sie in jedem Fall nach dem catch weiter!

4) Da der Controller die Methoden getModel() und setModel() besitzt, soll im Controller auch ein Attribut vom Typ IModel oder der implementierenden Klasse angelegt werden. Das Model im Controller wird von der GUI sowohl gesetzt als auch abgefragt, und der Controller soll dann mit ganau diesem Model arbeiten. Es kommt zu erheblichen Schwierigkeiten beim Zeichnen der GamePane, wenn es da Inkonsistenzen gibt.

5) Der Klasse GuiInventoryEntry dürfen Methoden hinzugefügt werden. Das kann sehr hilfreich sein.

6) Es wird folgende Änderung geben:
Es soll erlaubt sein, den Methodensignaturen in IModel throws Exception -Deklarationen hinzuzufügen und die Tests entsprechend zu modifizieren.
Modifizieren heißt, die Exceptions sollen den Testmethoden als throws -Deklaration hinzugefügt werden.

7) An alle die Windows benutzen:
Falls ihr einmal das Problem haben solltet, dass sich der Miner in der GUI überhaupt nicht bewegen lässt, dann versucht folgendes:
Klickt das Fenster einmal weg, so dass es in der Hintergund geht, holt es wieder vor und draufklicken, so dass es wieder aktiv (im Vordergund) ist.
Das hat bei einigen eurerer Komilitonen erstaunlicherweise geholfen.

8. Kleiner Fehler in der GUI:
In Zeile 74 der Klasse gui.Field, letzter Methodenaufruf: Da sollte eigentlich getHeightOfGrid() stehen.

Point playerPos = new Point(Math.min(model.getPositionOfPlayer().width, model.getWidthOfGrid()-1), Math.min(model.getPositionOfPlayer().height, model.getWidthOfGrid()-1));

Kann ersetzt werden durch:

Point playerPos = new Point(Math.min(model.getPositionOfPlayer().width, model.getWidthOfGrid()-1), Math.min(model.getPositionOfPlayer().height, model.getHeightOfGrid()-1));

Bis auf weiteres ...

Viele Grüße

Gast
Gast

Re: Wichtige Hinweise

Beitrag von Gast » 5. Jan 2014 18:29

Zu dem Vergleich mit equals():

Mit ist klar, wie ich zwei Positionen auf Gleichheit überprüfen kann, aber in meinem Code frage ich auch manchmal ab, ob zB die Höhe einer Position größer als irgendwein Wert ist. (mit if(pos1.height > *eine Zahl* {})).

Kann ich das auch mit der Methode equals() machen?

thb
Gast

Re: Wichtige Hinweise

Beitrag von thb » 5. Jan 2014 19:05

Wieso muss ich denn die Vergleiche mit der Methode equals() machen? Wusste bis jetzt nicht, dass das so gewünscht ist.
Funktionieren dann Tests nicht, wenn ich das auf die herkömmliche == Methode mache? Und wie lautet dann das Gegenstück != ? notEquals() oder !equals()?

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Wichtige Hinweise

Beitrag von SophiaLi1 » 5. Jan 2014 23:02

Ich wusste es auch nicht und das hat mir viel Arbeit gemacht (hätte man ja mal erwähnen können), generell gilt: Strings musst du mit equals vergleichen. Das Gegenteil ist !(Variable.equals(String)).

Man kann damit nur auf Gleichheit prüfen, nicht mehr.

gast ritis
Gast

Re: Wichtige Hinweise

Beitrag von gast ritis » 5. Jan 2014 23:12

der unterschied liegt darin, das "equals" und "==" verschiedene Sachen tun.

z.B.

String text_1 = "Hello";

String text_2 = Hello";

text_1 == text_2 jetzt würde man spontan sagen, das da true rauskommt. Kommt es auch! Aber NICHT weil die beiden Objektvariablen den selben Inhalt ("Hello") haben.

Du vergleichst mit " ==" , nicht "Hello" == "Hello". Was du machst ist, du vergleichst die Adressen die die beiden objektvariablen text_1 und text_2 in sich tragen.

In den variablen text_1 ist nicht der Text "Hello" gespeichert, sondern die Adresse im Speicher die auf "Hello" zeigt.

Jetzt fragst du dich natürlich warum da trotzdem true rauskommt. Das liegt daran das der Compiler erkennt, das die beiden Variablen den selben Inhalt haben und deswegen auch die selben Adresse haben können. Also man speichert nur ein "Hello".

Mit equals vergleichst du den Inhalt einer objektvariablen. Z.b kann text_1 und text_2 verschiedene Adressen haben, aber da der Inhalt verglichen wird, wir tatsächlich
"Hello" == "Hello" verglichen.

Aber das geht nicht immer so zu. Vergleiche niemals die Inhalten von objektvariablen mit ==. Es ist also mehr Glück dabei, wenn dein Programm funktioniert obwohl du kein equals verwendest.

Hoffe das hilft weiter

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Wichtige Hinweise

Beitrag von SophiaLi1 » 5. Jan 2014 23:15

Danke für die Erklärung, was mache ich jetzt bei Zahlen?

gast
Gast

Re: Wichtige Hinweise

Beitrag von gast » 5. Jan 2014 23:23

Generell kannst du primitive Datentypen wie int, double, boolean, char etc ganz normal mit == vergleichen.
Das sind ja keine objektvariablen, deswegen würde equals keinen SInn machen.

mdk
Gast

Re: Wichtige Hinweise

Beitrag von mdk » 6. Jan 2014 10:15

Habe jetzt versucht mit equals() zu arbeiten, funktioniert aber nicht:

if(model.getTypeOfField(new Position(position.width + 1, position.height)) equals(TYPE_GRANITE)) {
...
}

die If-Bedingung kann man wohl so nicht hinschreiben, zumindest zeigt mir BlueJ an, dass es nicht geht. Wie sonst? Ich hatte vorher "==" dort stehen.

Osterlaus
BSc Spammer
BSc Spammer
Beiträge: 1263
Registriert: 23. Aug 2007 12:46
Wohnort: DA

Re: Wichtige Hinweise

Beitrag von Osterlaus » 6. Jan 2014 11:02

Probier es mit einem Punkt vor equals

mdk
Gast

Re: Wichtige Hinweise

Beitrag von mdk » 6. Jan 2014 11:15

Osterlaus hat geschrieben:Probier es mit einem Punkt vor equals
Keine Syntaxfehler mehr.
Perfekt! Danke!

Benutzeravatar
5seconds
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 155
Registriert: 27. Apr 2013 10:44

Re: Wichtige Hinweise

Beitrag von 5seconds » 6. Jan 2014 11:20

mdk hat geschrieben:if(model.getTypeOfField(new Position(position.width + 1, position.height)) equals(TYPE_GRANITE)) {
...
}

die If-Bedingung kann man wohl so nicht hinschreiben, zumindest zeigt mir BlueJ an, dass es nicht geht. Wie sonst? Ich hatte vorher "==" dort stehen.
Ist das Leerzeichen statt dem Punkt vor dem equals ein Copy-Fehler oder steht das bei dir so?

mdk
Gast

Re: Wichtige Hinweise

Beitrag von mdk » 6. Jan 2014 11:47

Das stand bei mir so mit dem Leerzeichen. Das hat ja nicht funktioniert und ich wusste nicht, wie es sein muss. Da gehört aber ein Punkt, statt einem Leerzeichen hin.

Benutzeravatar
5seconds
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 155
Registriert: 27. Apr 2013 10:44

Re: Wichtige Hinweise

Beitrag von 5seconds » 6. Jan 2014 15:06

Ja, das kann nur mit Punkt funktionieren, weil model.getTypeOfField(new Position(position.width + 1, position.height)) in deinem Fall ein String-Objekt ist, von dem du die Methode equals aufrufen willst :wink:

thb
Gast

Re: Wichtige Hinweise

Beitrag von thb » 6. Jan 2014 18:43

Hallo, ich habe noch eine Frage zu der equals() - Abfrage:

So sieht mein Code an einer Stelle aus:

Code: Alles auswählen

public void setPositionOfElevator(Position position) throws InvalidPositionException{
       if(position.width.equals(-1)){
       ...
        }
Wenn ich das kompiliere, wird mir folgender Fehler angezeigt:

int cannot be dereferenced

Wenn ich aber stattdessen schreibe if(position.width == -1){}, dann zeigt er mir keine syntaktischen Fehler an. Weiß da jemand von euch, woran das liegen könnte?

midstar
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 172
Registriert: 29. Dez 2013 17:00

Re: Wichtige Hinweise

Beitrag von midstar » 6. Jan 2014 18:45

ich hätte gesagt das funktioniert nicht weil er das mit nem objekt vergleichen will, und -1 einfach mal kein objekt ist :)

Ich würde an der stelle einfach == -1 benutzen ;)

Antworten

Zurück zu „Archiv“