Aufgabe 6.4

Knotenpunktsche Zerlegung des Pugschen Beitrags

So hier ist sie nun die knotenpunktsche Zerlegung des pugschen Kommentars + weiterer Kommentare:

So: Die Setter und Getter Methoden sind dafür da um die Instanzvariablen nach außen hin zu schützen
Außerdem schreibe ich meinen Code doch nicht uneffizient, um a bissle Debuggen zu können, was mit diversen Hilfswerkzeugen eh viel besser geht
Logging: Ok hast ja recht… ich will zu jedem Zeitpunkt wissen welche Variablenbelegung ich im kompletten Programm habe und wehe ich verpasse eine Änderung
weil ich einmal etwas nicht über ne getter-methode gesetzt habe
Also es würde schon Sinn machen teilweise etwas bestimmtes mitzuloggen, aber dann eher in dafür vorgesehenen Methoden statt in Getter und Setter

Das mit dem Überprüfen ist richtig [wenns von außen kommt]
Intern will ich aber eventuell auch Werte zulassen, die von Außen nicht erlaubt sind

Vor allem Intern eine Getter-Methode zu verwenden ist sehr sinnvoll!.. (Aus deiner Sicht dann nur für Logging: was ja - siehe oben - gschmarri ist)

Wo steht explizit, dass Getter und Setter Methoden direkt auf die Instanzvariablen zugreifen dürfen
Also ich lese da nur dass man mithilfe der Getter/Setter Methoden drauf zugreifen darf
also methode x soll bspw. getter verwenden
und da hier steht außschließlich über getter und setter, dann heißt des, dass die getter/setter methoden selber auch nur über sich selbst (Endlosrekursion)
darauf zugreifen können oder gar nicht, da bspw. ein Direktzugriff innerhalb der getter/setter methoden nicht definiert ist
→ Widerspruch stimmt

Nein sind sie nicht, siehe Widerspruch
Trotzdem: Coole Aktion von euch… für die Aufgabe nur Punkte zu verteilen, wenn man entgegen den Regeln (entgegen der nicht Lösbarkeit der Aufgabe) handelt
Hacker müssen später auch entgegen irgendwelcher Regeln arbeiten (also schon mal gute Vorbereitung dafür^^) [Ist jetzt nicht negativ gemeit]

Schon wieder der Log/Debugg Unsinn
Ich will doch nicht generell alles mitloggen
Eventuell vereinzelt, aber auch hier frage ich mich ob das dann wirklich in ein Getter/Setter rein muss

Zum Thema Debugging/Logging oder meinetwegen auch Aspektorientierter Programmierung (um das Logging etwas anspruchsvoller zu gestalten):
Ich sehe nicht wo man für diese Aufgabe hier etwas mitloggen sollte
Debugging: Ok hier könnte man alles debuggen…
Zum Bsp. in den JUnit Testfällen… diese kann man aber sicher auch so schreiben, dass man nicht alles durch „eigene Getter/Setter“- Methoden „debuggt“

[b]Herzlichen Glückwunsch zu deinen 10% die richtig sind^[1]

So und jetzt noch etwas anspruchsvoller und/oder zusammenfassend:

Logging hat schon seine Da-Seins-Berechtigung
Ok man kann vlt. in manchen Getter/Settern etwas mitloggen
Aber es ist bullsh*** des in allen Gettern/Settern zu machen oder sich von vornherein die Möglichkeit dazu einzuräumen (siehe Aufgabenstellung: ausschließlich)

Außerdem mal ganz ehrlich:
Wird in den Gettern/Settern-Methoden mehr gemacht als gegetted und gesetted dann macht man es den Hackern unnötig schwer
Als Hacker ist es einfach irgendwelche Variablen zu manipulieren… muss man aber in einem gut ofuscateten Code auch noch herausfinden was so ne getter/setter so noch alles macht, dass das Programm nicht kaputt geht, dann ist das echt nervig
(Für die anderen: Wer mal etwas Bock hat in Java zu hacken, der kann sich mal den Javasissten anschauen und Bytecode manipulieren, oder ihr lernt mit „Reflections“ umzugehen… ist dann aber etwas anspruchsvoller als Javasisst (sorry für mein schlechtes Deutsch^^))
[Braucht ihr aber nur für anspruchsvoll obfuscateten Code]

So jetzt mal wieder etwas Themennäher:

pug, ich frag mich gerade außerdem, warum wir in den Vorlesungen sowas wie Backtracking gelernt haben
Mit der jetztigen Gruppenaufgabe werden wir gezwungen, statt

wert++
setWert(this.getWert()+1);

zu machen

Also ich hab das Gefühl, dass wir das Gitterrätsel schneller ohne Backtracking gelöst hätten, wie jetzt hier die Variable wert inkrementiert hätten (super Deutsch, aber ihr wisst was ich meine^^)

So pug!:

Angenommen von deinem Beitrag oben stimmen mehr wie 10%:
Sprich wir sollten alles über getter/setter laufen lassen, weils der bessere Code ist und weil er besser erweiterbar ist

Warum hat dann der Herr Phillipsen in der Vorlesung dann überhaupt das Wort „extends“ gennant

Wenn wir schon von anfang an (in deinen Augen bspw. des mit den settern/gettern überall) ordentlich programmieren sollten, dann aber auch überall anders ordentlich

Strategy-Design-Pattern, Depency-Injection und schon haben wir eine „ordentliche“ Vererbung (auch mehrfach Vererbung möglich) und nicht mehr so eine starre und einfache wie

class1 extends class2 (wobei man das auch wieder dynmisch gestalten könnte → Javassist-> zur Laufzeit Bytecodemanipulation-> und über den speziellen Javassist-Classloader die mit anderem Erbverhaltenversehene Klasse wieder einbinden)

Rekursiv-Art hätte man dann auch gleich mit strengem MVC gestalten müssen:
Model (was wir Coden mussten) View (strenggenommen ein abstraktes View-> Auf eine Schnittstelle programmieren und nicht auf die Implementierung Canvas)

So das wars!

Übringes nehmt meine Kritik nicht persönlich^^

Hab schon ganz andere Themen in der OOP in verschiedenen Foren/IRC-Chats zerlegt
Wurde deshalb auch schon des öfteren als Premiumtroll bezeichnet…

Schau ma halt mal was das nächste Aufgabenblatt an Diskussionsmaterial zu bieten hat^^

Also nehmt meine Aussagen so hin wie sie sind… sie sind einfach richtig!^^

Liebe Grüße
Knotenpunkt


  1. /b ↩︎

2 Likes

Diese Aussage ist immer 100% wahr, weil sie von dir kommt. Andere Ansichten sind klar falsch. Danke, verstanden.

Im Normalfall will man das bestimmt nicht. Würde ja wieder heißen, dass der Rest der Klasse doch ungültige Werte behandeln können muss.

Sorry, wir hatten tatsächlich gedacht, dass Leute mit Abitur etwas gesunden Menschenverstand mitbringen. Kommt nicht wieder vor.

Ich sehe, dass in der Aufgabenstellung steht, dass ihr Setter und Getter benutzen soll. Eventuell, weil man das mal gemacht haben sollte wenn man nicht schon alles weiß.

Ich verstehe nicht, was das mit Gettern und Settern zu tun hat.

Frag mal deine Kommilitonen…

Es ist schön für dich, dass du dich schon mit solchen Themen beschäftigt hast. Wenn man aber gerade zu verstehen versucht, was ein Konstruktor ist und wozu ich dieses new brauche, dann sind wir von sowas noch ein ganzes Stück entfernt. Du lernst auch nicht das Fahren in einem F1-Wagen. Es geht hier nicht um Best Practices, um Design Patterns oder um Logging. Es geht darum, OOP und Kapselung zu verstehen und zu üben. Wenn du’s schon kannst: Freu dich, programmier die Übungen runter und helfe deinen Kollegen. Beeindrucken tust du mit dem Buzzword-Bingo niemand.

Viel Spaß im weiteren Studium mit der Einstellung.

9 Likes

Du meinst um Zugriff auf die Instanzvariablen zu ermöglichen. Geschützt werden sie durch das private/protected keyword.

Was verstehst du unter uneffizient? Beim schreiben kannst du dir die Getter/Setter von deiner IDE generieren lassen und in Runtime werden sie inlined.

Ja, diese diversen Hilfswerkzeuge nennen sich Debugger/Sampler/Profiler und sind auch dazu da. Einen Getter/Setter um bei Access/Modification zu breaken brauchst du nicht, denn man kann einen Breakpoint auch auf eine Instanzvariable setzen.

Wenn du keine Änderungen verpassen willst dann konfiguriere deinen Debugger richtig.

logger.debug("setting x to {}", x);
setX(x);

Dieser Code ergibt so aber noch weniger Sinn, weil du die logging Ausgabe sinnvollerweise an jeder Stelle wiederholen müsstest an der du setX() aufrufst.

Niemand hat gesagt man würde im Normalfall alles über Getter/Setter machen, du kannst intern durchaus verschiedene Ansätze benutzen.

Heute Hü und Morgen Hott?

R3al BaD H4cK3Rs FuCk TeH SYSTS3M!

Testen ist nicht debuggern und debuggern ist nicht testen. Getter und Setter werden im Normalfall auch nicht getestet.

Warum Hacker? Wenn jemand meint mein Programm/Library „hacken“ zu müssen, dann sollte er kein Problem damit haben wenn eine Methode zwei Instruktionen hat statt einer, falls doch dann sollte er sich nicht Hacker schimpfen.

An extends selbst ist erstmal nichts auszusetzen. Alles mit dem Strategy Pattern zu erschlagen ist auch nicht der richtige Weg. Wenn man einen Hammer hat sieht die ganze Welt aus wie ein Nagel…

ganz oben redest du noch von Effizienz und jetzt plötzlich Reflections und Bytecodemanipulationen? Solche Aufgaben sollte man lieber einem compiler übergeben wie zB. JDT. Und wenn man das macht dann kann man auch direkt die Klassen bearbeiten.

streng getrenntes MVC wird quasi nicht benutzt. Und warum nicht MVP oder MVVM?

Wenn du die anderen Themen zerlegt hättest, dann hätte man dich nicht als Troll bezeichnet.

2 Likes

Ähm man muss euch jetzt nicht erklären was ironie ist?

Und das der Beitrag zu 50% aus Spaß besteht ist hoffentlich auch klar?


1 Like

wow such thread so knowledge much impressive


jetzt kommen alle Trolls zum Vorschein!


Ich bin nicht allein! :smiley:


Nein, ich weiss nicht, was du meinst. Wenn du eine Loesung fuer das Gitterraetsel hast, die kein Backtracking verwendet, dann nur her damit.


Ich verweise hier mal auf deinen ersten Beitrag auf den ich mich auch bezogen hab. Du triffst hier eine absolute
Aussage und der hab ich widersprochen. Ich hab dir Beispiele genannt, in denen es meiner Meinung nach sinnvoll ist,
Setter und Getter in der eigenen Klasse zu nutzen.
Logging und das konsistent Halten innerhalb der eigenen Klasse sind beides Dinge, die ich schon in Code gesehen hab.
Für mich zumindest, war es logisch an den Stellen. :wink:

Wenn bei einem Kunden ein Problem auftritt, dann benutze ich alles was mir einfällt, um das zu lösen.
Und wenns gschmarri Logging ist, Hauptsache es hilft.
Du kannst es ja dann anders und besser machen, wenn du mal Probleme hast, die du lokal nicht nachvollziehen kannst. :wink:

Ja, in dem Punkt hast du recht, die Aufgabenstellung ist zu schwammig. Ich konnte nachts um 3 einfach nicht mehr verstehen,
wie man die Aufgabenstellung so verdrehen kann. :wink:
Es wäre aber cooler von dir, das nächste Mal konstruktive Kritik zu äußeren.
Überlege dir was der Aufgabensteller wollte und erkläre die Intention dann so, dass es für alle verständlich ist
(du hattest ja offensichtlich genügend Zeit :-P).
Also anstatt da mit Widersprüchen zu hantieren wäre es besser zu sagen:
„Passt mal auf, die Aufgabenstellung ist etwas schwammig, es ist natürlich nicht gemeint, dass
man in den Gettern und Settern eine Endlosrekursion baut.“
Die Aufgabensteller sind auch immer froh, wenn konkrete Verbesserungsvorschläge kommen:
"Man kann eure Angabe falsch verstehen, schreibt das nächste Mal besser … "

Wies Unsinn? Du sagst doch selber, dass es vereinzelt sinnvoll sein kann.
Und mehr wollte ich damit auch nicht sagen. :wink:

Soll man nicht, muss man nicht, will man nicht.
Aber die Aufgabenstellung verlangt überall Getter und Setter zu benutzen (außer es führt zur Endlosrekursion :-P).
Damit sind Getter und Setter eben auch in attack verlangt.

Es geht bei den Aufgaben nicht darum, perfekten Code zu schreiben und alle Konzepte der Informatik in ein Beispiel zu packen.
Es geht gezielt darum, euch bestimmte Konzepte beizubringen.

Und das ist verdammt gut so!
Es gibt eben noch viele, die mit dem Programmieren Schwierigkeiten haben.
Manche überlegen noch, ob

setWert(this.getWert()+1);
oder
setWert(this.getWert()) + 1;
oder
setWert() = (this.getWert() + 1) ;
oder
setWert = (this.getWert + 1) ;
oder
setWert = (avatar.getWert + 1) ;

richtig ist. Dann führt eine Aufgabenstellung zu weit, die verlangt, dass man
nur an den sinnvollen Stellen Getter und Setter verwendet.
Lieber verwendet man noch einen Setter/Getter extra, damit das sitzt.
Und ganz ehrlich, ich hab wahnsinnigen Respekt vor Leuten, die im Moment
noch so mit dem Programmieren kämpfen aber am Ende die Zähne zusammenbeißen
und das Informatik Studium durchziehen. Lieber beschwert sich der Rest über die
übertrieben enge Aufgabenstellung, als dass noch mehr abgehängt werden.
Die die das schon alles verstehen, können sich ja dann beim ICPC austoben und sollten froh sein,
dass sie nicht wie andere die halbe Woche an AuD sitzen.

Hab ich nie gesagt und werd ich auch nicht.
Dinge wie den Einsatz von Gettern und Settern entscheidet man je nach Anwendungsfall.
Die Welt ist eben grau. Es gibt leider kein Patentrezept, das immer passt.

Ich hab nicht gesagt, dass Setter und Getter zum ordentlichen Programmieren gehören.
Meine einzigen beiden Aussagen zu dem Thema waren, dass es sinnvolle Möglichkeiten gibt, beides in der eigenen Klasse einzusetzen
und dass es die Aufgabenstellung explizit überall verlangt (außer es führt zur Endlosrekursion).

2 Likes

6.4 c)
Servus! ich habe bitte folgenden 3 Fragen:

“Bearbeiten Sie die Methode attack(Avatar avatar).”
“Diese führt eine Attacke mit der Waffe des Spielers auf den übergebenen Avatar aus.” Wie soll ein solche Attacken vorgehen? Wie beschreibt man der Spieler hier?

" Sollten nach der Attacke die Lebenspunkte des Angegriffenen auf 0 oder darunter liegen," Wie wirkt diese Attacke auf Lebenspunkte?

" so werden dessen Erfahrungspunkte zuden Erfahrungspunkten des Angreifers hinzuaddiert und falls die Waffe des Gegners sowohl
mehr Schaden anrichten kann als auch weniger abgenutzt ist, wird die eigene Waffe durch diese ausgetauscht und die Leiche erhält die schwächere Waffe (Leichenfleddern mit Zurücklegen)"

Danke im vorraus


[quote=ffs]„Bearbeiten Sie die Methode attack(Avatar avatar).“
„Diese führt eine Attacke mit der Waffe des Spielers auf den übergebenen Avatar aus.“ Wie soll ein solche Attacken vorgehen? Wie beschreibt man der Spieler hier? [/quote]

Schauh mal in die AvatarTest.java - der andere Spieler ist schon da (als Objekt im Arbeitsspeicher).

[quote=ffs]
" Sollten nach der Attacke die Lebenspunkte des Angegriffenen auf 0 oder darunter liegen," Wie wirkt diese Attacke auf Lebenspunkte?[/quote]
Der Spieler hat eine Waffe, diese hat eine Methode um den Schaden bei einer Attacke zu erhalten (Achtung! Nicht den Schaden direkt abfragen denn die Waffe kann auch aufgebraucht sein). Diesen Schaden ziehst du von den Lebenspunkten des Spielers ab, auf den die Attacke zielt.

Dazu wie du den Austausch der Waffe implementieren kannst sollten die Vorlesungsfolien einen Hinweis geben.


Hallo GH, ich verstehe deinen Antworte nicht, kannst du bitte mehr vielleicht mehr auf die Fragen gehen.


Leider kann ich in den Antworten nicht zu viel verraten. Um 12 Uhr ist heute noch eine Rechnerübung, frag dort einen Tutoren. Der kann Dir im Einzelfall sicher mehr helfen.

6.4 a
Hallo, kann mir bitte jemand sagen, warum bei “Weapon weapon” “Weapon cannot be resolved to a type” steht und wie man es beheben kann.

Kann mir auch jemand sagen, was man in die Methode “public Avatar(int strength, int intelligence, int experience, Weapon weapon){ }” reinkommen soll, hab mir überlegt ob da reinkommt, dass es mehrere Avatare im Spiel gibt, weiß aber nicht wie man es in JavaSprache formuliert.

Ich versteh auch nicht, wie man bei “public void attack(Avatar avatar)” und “public void castSpell(Avatar avatar, Spell spell)” in JavaSprache formulieren soll, dass wenn die lifePoints des eines Avatars zu Null oder weniger werden, dass dann die seine experience zu den experience des angreifenden Avatars dazugerechnet wird. Aslo, wie man formuliert, dass es lifepoints, experience,… des Angreifers und des Angegriffenen gibt.

Vielen Dank!


Zu dein erste Fragen; weapon ist ein objekt einer anderer klasse, also muss mit new erstmal initialisiert werden.


Das ist der Konstruktor.

Kuck mal in AvatarTest.java. Da werden zwei Avatare a1 und a2 erstellt. D.h. es sind zwei Avatar-Objekte vorhanden. Die haben beide eigene lifePoints und experience.
Dann steht da a2.attack(a1);
a2 greift also a1 an über die Methode attack(Avatar avatar). a1 wird dabei als Referenz übergeben. Über diese Referenz kannst du dann auf die Attribute von a1 zugreifen, nämlich über die Getter- und Setter-Methoden.


Wenn ich die Setter im Konstruktor verwende, gibt IntelliJ eine Warnung aus, dass man das nicht tun sollte, weil eine Unterklasse die Setter-Methoden überschreiben könnte. Da es nicht erlaubt ist, die Setter als final zu deklarieren, habe ich jetzt nur im Konstruktor die Attributwerte direkt gesetzt. Ist das von der Aufgabenstellung OK so? Wäre es unter anderen Umständen sinnvoll, Setter als final zu deklarieren oder hat man dadurch irgendwelche Nachteile?


[quote=Tamaskan]
Wenn ich die Setter im Konstruktor verwende, gibt IntelliJ eine Warnung aus, dass man das nicht tun sollte, weil eine Unterklasse die Setter-Methoden überschreiben könnte. [/quote]

In dieser Aufgabe werden keine Unterklassen verwendet, daher ist es OK die Setter auch im Konstruktor zu verwenden. Wir testen im EST aber nur darauf, ob ihr in den Methoden die getter und setter verwendet. Im Konstruktur könnt ihr die übergebenen Werte auch direkt zuweisen.

Fun fact: Eclipse bietet einem sogar an, im Konstruktor die Setter zu verwenden :wink:


Hab ihnen doch indirekt durch dich ict geholfen (siehe weiter unten)

Wurde ja bisher für das aktuelle Aufgabenblatt nicht korrigiert =>

Es werden sich morgen 35-40 Prozent der AUD-Teilnehmer freuen auf die Aufgabe 100% zu bekommen

Für diejenigen die es nicht wissen: ict gehört laut Forum zum AUD-/PFP-Team