OOP Verständnissfrage

Logaff

Bekanntes Mitglied
Hiho,

1)irgend wie steig ich nicht dahinter was das mit OOP aufsich hat....also meiner Meinung nach baut man verschiedene Klassen(Baupläne für ein Opjekt)mit Attributen(Eigenschaften) welche ein Objekt erzeugen, mittels Konstrucktoren.
hinter her hat man im speicher alsso zb ein Punkt-Object welches verschiedene eigenschaften hat, welche abgerufen und verändert werden können.
wenn bis hier irg wo ein fehler bitte melden:p

2)Kann man mir mal, bitte einer erklären, wann man private oder public benutzt?

3) hat jmd lust hier meine 2 klassen zu überprüfen nach irg welchen OOP denkfehlern?
DOWNLOAD

vielen Dank,
mfg Logaff
 

Network

Top Contributor
Zu 2)
Public verwendest du, wenn andere Klassen auf die Methode oder die Variable zugreifen können sollen.
Private wenn sies nicht können sollen.

Es empfiehlt sich aber immer Public zu verwenden, solange man nicht mit mehrern zusammenarbeitet bzw. Klassen schreibt die andere in ihre Projekte einbauen können.
 

Marco13

Top Contributor
Es empfiehlt sich aber immer Public zu verwenden, solange man nicht mit mehrern zusammenarbeitet bzw. Klassen schreibt die andere in ihre Projekte einbauen können.

NEIN. (Ausnahmsweise mal was mit Caps Lock, ja, haut mich... :oops: )

Eines der wichtigsten Prinzipien von OOP (wenn nicht sogar das wichtigste überhaupt) ist das Geheimnisprinzip. Vereinfacht gesagt: Man macht IMMER ALLES so privat wie möglich.
Eigentlich.

In dem Beispiel sollten die xcoord/ycoord also private sein.
Eigentlich.
Aber so einfach ist es eben nicht.
Das Beispiel, das du dir ausgesucht hast (Vektormathezeug) ist einerseits toll, weil man da bestimmte OOP-Aspekte schön anwenden kann. Gleichzeitig ist es aber auch unheimlich schwer und wirft wahnsinnig viele Fragen auf, die sich in anderen Fällen nicht stellen. Der Unterschied zu "anderen Fällen" besteht hier in der schier unendlichen Abstrahier- und Erweiterbarkeit, und der engen Verbindung zur Mathematik, die sich sehr oft sehr gut aber an manchen Stellen auf schmerzhafte Weise nicht perfekt auf OOP übertragen läßt.

Vielleicht kennst du die javax.vecmath-Bibliothek, die schon so etwas anbietet, was du jetzt dort programmieren willst: Vector3d, Point3d, Matrizen und einige praktische andere Dinge. Dort wurde gegen das oben genannte "heilige Prinzip" verstoßen, und die Koordinaten der Vector3d-Klasse (x,y,z) sind public. Das ganze stammt aber noch aus einer Zeit, wo man sich dadurch höchstwahrscheinlich Methodenaufrufe (für getter und setter) sparen wollte und sich höhere Effizienz erhofft hat. Heute würde man das vermutlich nicht mehr machen. Tatsächlich wurden in den letzten vecmath-Versionen auch getter und setter eingefügt, wenn auch aus einem anderen Grund - aber die public Fields x,y,z sind nach wie vor vorhanden. Das ist einer der Gründe, weswegen public Fields bei "echter OOP" ein no-go sind: Sie sind immer da, man wird sie nicht mehr los, und sie sind unflexibel.

Insgesamt ist OOP eine Wissenschaft für sich, und was für Leute, die Herausforderungen suchen: Es ist immer schwer, gut OO zu programmieren (wenn es leicht wäre, würde man versuchen, es besser zu machen, und dann wäre es wieder schwer ;) ).

An diesem Vecmath-Beispiel sieht man schon einen Punkt, wo man OOP zumindest in erster Näherung sinnvoll einsetzen könnte: Vector2d und Point2d könnten von einer Klasse "Tuple2d" erben. Worin unterscheiden sich Point und Vector? Eigentlich nur im Namen, und vielleicht dass man aus zwei Punkten kein Kreuzprodukt oder zwischen zwei Vektoren keinen Abstand berechnen kann. Letzteres wären dann spezielle Methoden in den von Tuple2d (bzw. Tuple3d) abgeleiteten Klassen. Andererseits wäre es eben oft praktisch, wenn Punkte wie Vektoren behandeln und zwischen ihnen ein Kreuzprodukt ausrechnen könnte - das ist dann der Punkt, wo die Mathematik "flexibler" ist, als das, was man "stimmig" mit OOP abbilden kann. Eine Möglichkeit wäre dann eine statische Utility-Methode wie
void computeCrossProduct(Tuple3d t0, Tuple3d t1, Tuple3d cross)

Über weiter gehende Fragen, wie ob die ganzen Klassen dort nicht eigentlich <3 interfaces <3 sein sollten, oder ob sie Immutable sein sollten und wie man das dann vernünftig und effizient umsetzt könnte man sich noch viel länger Gedanken machen...
 

Logaff

Bekanntes Mitglied
Programmtechnisch ändert sich nur der Name bei Point und Vector aber der sinn inst ein anderer. Ein Punkt gibt es so nur einmal genau an diesem ORT X/Y. Ein Vektor ist die Menge ALLER! Pfeile die gleiche Richtung, gleiche Länge und irg was war noch haben. nen vektor hat keinen festen ort er ist nicht gebunden da er nur ein pfeil ist der die gleiche ausrichtung usw besitzt.
 

Marco13

Top Contributor
Beides ist (im 2D-Fall, für einen Mathematiker) nur ein Tupel aus 2 Zahlen. Sie haben mehr gemeinsam als sie unterscheidet. Schau dir mal die Tuple2d auf Generated Documentation (Untitled) an - diese Methoden alle doppelt zu implementieren und Point und Vector auf dieser Ebene (nur wegen des Namens) "inkompatibel" zu machen wäre wohl unangebracht.

Wichtig: Die Umsetzung dort finde ich nicht bedingungslos "gut" - sie hat (abgesehen von den public fields) einige Nachteile und Fragwürdigkeiten, aber wie schon angedeutet: Man kann da sehr schnell sehr philosophisch werden, und DIE optimale Lösung gibt es vermutlich ohnehin nicht.
 

Logaff

Bekanntes Mitglied
aah verstanden ok.....

aber macht private nicht nur sinn wenn sie nach aussen nicht verändert werden sollte? oder nur innerhalb einer klasse geändert werden darf?

aber was spricht dagegen alles public zu machen wenn mit brain.exe arbeitet bzw nicht?
 

Marco13

Top Contributor
Was das mit der brain.exe heißen sollte, konnte meine brain.exe nicht verarbeiten. Grundsätzlich steht einiges zu publich fields hier: http://www.java-forum.org/top-fragen/3938-instanzvariablen-privat-deklarieren.html

Wie ich schon sagte: Für so eine Vecmath-Bibliothek sind vielleicht einige Dinge... "anders" als bei "normaler" OOP. Viele der Argumente, die gegen public fields sprechen, greifen bei so etwas mathematisch-elementarem wie einem Vector2d nicht: Dort wird es immer einen float/double-Wert geben, der die x-Koordinate beschreibt, also könnte man auch einfach ein "public float x" dort reinschreiben. Aber man muss sich im klaren sein, dass das aus rein programmiertechnischer Sicht einige Nachteile hat....

Man kann bei OOP sehr viele Prinzipien berücksichtigen, die auf Dinge abzielen, auf die man bei einer Vecmath-Lib vielleicht nicht sooo hohe Priorität legen würde. Es ist z.B. bei OOP nicht unüblich, ALLE "Klassen" zuerst nur in Form von Interfaces zu definieren. (Dort hat man ohnehin nur Methoden - die Frage nach public Fields stellt sich also schon gar nicht mehr...). Für eine einfache, kleine, effiziente und leicht zu verwendende Vecmath-Lib könnte man sagen, dass das "Over-Engineering" wäre.

Aber es hätte beeindruckende Vorteile in bezug auf die Flexibilität. GANZ grob angedeutete (und deswegen vielleicht etwas konstruiert wirkende) Beispiele könnten sein: Eine Implementierung eines Vector2d, der eine Exception wirft, wenn ihm für x oder y ein "Float.NAN" übergeben wird, oder eine Implementierung, die bei jeder Änderung ein "Dirty-Flag" setzt und updates auslöst oder sogar Listener benachrichtigt, oder der bei jeder Änderung von x oder y automatisch die Länge neu berechnet und zwischenspeichert (damit die dann oft abegrufen werden kann, ohne dass jedes Mal aufwändig die Wurzel gezogen werden muss - was sehr teuer sein kann) oder eine Implementierung eines Vector3d, der eine Projektion oder Spiegelung eines anderen Vector3d ist, oder eine Implementierung, die die Daten nicht in einzelnen floats speichert, sondern in einem Array, oder, oder, oder...

Ich gebe hier keine Empfehlungen!!! (Nur Hinweise...)
 

Ähnliche Java Themen

Neue Themen


Oben