Performancemythen?
-
Nur weil man die innere Struktur eines Objekts als "Blackbox" betrachtet, folgt daraus noch keine Undefiniertheit, sofern man angibt wie das Objekt von außen aussieht.
Xin schrieb:
Mich hätte hier lediglich Marc++us Definition noch interessiert. Ich gehe nicht davon aus, dass er mir zustimmt, weil meine Definition braucht man nicht zu binden, da tun es auch ein, zwei Blätter. Ich gehe aber davon aus, dass wenn er schon ein Buch schreibt, er sich ebenfalls intensiver mit dem Thema beschäftigt hat und entsprechend schärfere Definitionen benutzt.
Marcus bezeichnet (Laufzeit-)Polymorphie in seinem Buch als "wesentliches Merkmal der objektorientierten Programmierung". Laufzeit-Polymorphie macht also das Wesen von OOP aus. Genauer wird er nicht - und OOP definiert er schon gleich gar nicht konkret. Aber man kann bei Sätzen wie "Das ist zwar schon schön C++, weil es Klassen verwendet. Aber es ist nicht objektorientiert" schon etwas vermuten. Zumal ein Abschnitt "Streiche switch, setze virtual" mit einem Merksatz "Nicht überall, wo Klasse draufsteht, ist auch Objektorientierung drin" endet. Die Lösung, um aus nicht objektorientiertem Code eben objektorientierten zu machen, lautet in dem Abschnitt nämlich: virtual.
-
Overtaker schrieb:
hurra ich hab gewonnen, xin verloren
So schnell wird aus "unserer Definition" ein "ich habe gewonnen".
Geschichten schreiben Sieger. Wer einen Phyrrussieg erringt hat die Schlacht gewonnen, war aber doch unterlegen.
Ich gratuliere zu Deinem ganz persönlichem Erfolg.Overtaker schrieb:
rüdiger schrieb:
Du bist wirklich Arrogant und eingebildet
und diesmal ist sogar rüdiger der gleichen meinung wie ich
Hehehe, ihr sollten den Thread mal lesen.
Wenn Jester loszieht und behauptet, Menschen die nicht seiner Meinung sind, sollten sich raushalten wenn Dipl.Infs sich unterhalten, ist das nicht arrogant.Overtaker schrieb:
ps: xin warum hast du nicht direkt gesagt du kommst von der FH das hatte so einigen glaub ich auch gut zeit gespart
Hehehe und Du findest mich arrogant?
Lies mal nach, was arrogant bedeutet.Und wieder einmal sei darauf hingewiesen, dass Du nur lesen braucht, was ich schreibe. Ich habe aus dem (FH) kein Geheimnis gemacht. Da einige hierzu nicht in der Lage sind, habe ich den Thread verlassen.
minhin schrieb:
Xin schrieb:
Mich hätte hier lediglich Marc++us Definition noch interessiert. Ich gehe nicht davon aus, dass er mir zustimmt, weil meine Definition braucht man nicht zu binden, da tun es auch ein, zwei Blätter. Ich gehe aber davon aus, dass wenn er schon ein Buch schreibt, er sich ebenfalls intensiver mit dem Thema beschäftigt hat und entsprechend schärfere Definitionen benutzt.
Marcus bezeichnet (Laufzeit-)Polymorphie in seinem Buch als "wesentliches Merkmal der objektorientierten Programmierung". Laufzeit-Polymorphie macht also das Wesen von OOP aus.
Was in C++ durch virtuelle Funktionen erreicht wird...
minhin schrieb:
Genauer wird er nicht - und OOP definiert er schon gleich gar nicht konkret. Aber man kann bei Sätzen wie "Das ist zwar schon schön C++, weil es Klassen verwendet. Aber es ist nicht objektorientiert" schon etwas vermuten. Zumal ein Abschnitt "Streiche switch, setze virtual" mit einem Merksatz "Nicht überall, wo Klasse draufsteht, ist auch Objektorientierung drin" endet. Die Lösung, um aus nicht objektorientiertem Code eben objektorientierten zu machen, lautet in dem Abschnitt nämlich: virtual.
Ich denke, dass das es im Bezug auf C++ kaum genauer geht.
Danke für die Ausschnitte, ich habe das Buch leider noch nicht, aber es ist meiner To-Buy-Queue (schon vor dem Thread)
-
Xin schrieb:
Overtaker schrieb:
rüdiger schrieb:
Du bist wirklich Arrogant und eingebildet
und diesmal ist sogar rüdiger der gleichen meinung wie ich
Hehehe, ihr sollten den Thread mal lesen.
Wenn Jester loszieht und behauptet, Menschen die nicht seiner Meinung sind, sollten sich raushalten wenn Dipl.Infs sich unterhalten, ist das nicht arrogant.Niemand hat behauptet, dass Jester nicht arrogant wäre. Das ändert doch nichts für dich.
-
Xin schrieb:
Was in C++ durch virtuelle Funktionen erreicht wird...
... was jedem hier wohl klar ist.
Ich denke, dass das es im Bezug auf C++ kaum genauer geht.
Der Punkt ist, dass er weder explizit OOP definiert noch explizit sagt, dass es in C++ dieses und jenes bedeutet. Es folgt nur implizit aus dem, was er sagt und wie er vorgeht.
Schön ist zum Beispiel auch, wie er in einem Kapitel OOP in C zeigt. Denn das macht er indem er zunächst Klassen, dann Vererbung und schließlich Laufzeit-Polymorphie in C nachprogrammiert. Und dann ist das Kapitel zu Ende. Das war OOP in C.
Das Vorgehen hier entspricht also exakt der OOP-Definition von Stroustrup (1. Kapselung 2. Vererbung 3. Laufzeit-Polymorphie). Aber dennoch nennt er diese Definition nie explizit. Das heißt man kann es sich zwar denken, aber er sagt es nicht explizit.
-
Xin schrieb:
habe ich den Thread verlassen.
merkt man aber provozieren lässt dich trotzdem mit vergnügen gell?
minhen schrieb:
OOP-Definition von Stroustrup
das ist natürlich relevant was herr stroustrup dazu sagt weil c++ schon immer ein musterbeispiel von objektorientierten konzepten war
-
minhen schrieb:
Die Lösung, um aus nicht objektorientiertem Code eben objektorientierten zu machen, lautet in dem Abschnitt nämlich: virtual.
Konkret auf einen bestimmten Fall in einem definierten Umfeld bezogen - durchaus vertretbar.
Aber ich kann nicht oft genug wiederholen: Es gibt massig Sprachen ohne virtuelle Funktionen. zB JavaScript.
Marcus zeigt zB in seinem Buch wie man OO in C hinbekommt - und dort hat man kein virtual stehen.
Naja, was ich denke dass euer Problem ist:
Für euch zählt nur die Definition:
Alles was Energiequelle sein will, muss das Interface Energiequelle implementieren.In anderen Sprachen als Java kann man aber auch Energiequelle als:
Alles was sich wie eine Energiequelle verhält, ist eine Energiequelle.
sagen.Eure Definition bezieht sich ziemlich genau auf Java - wie ich bereits mehrfach geschrieben habe. Für Java passt die Definition ziemlich gut. Aber sie verleugnet die Realität - denn Sprachen wie Self und JavaScript haben keine Klassen ergo keine virtuellen Funktionen. Polymorphie läuft dort über Objekte. Es gibt keine definierten Interfaces - es ist ähnlich wie Templates in C++: alles was get_energie() anbietet kann als Energiequelle dienen.
Aus genau diesem Grund braucht man auch keine virtuellen Funktionen.
Ich kann euch wirklich nur empfehlen mal von Java wegzukommen und neue Sprachen und Konzepte zu lernen - dann werdet ihr feststellen dass eure Definition einfach Fehlerhaft ist.
Niemand bezweifelt dass für C++ und Java virtuelle Funktionen ein Key Feature sind. Was wir aber versuchen euch zu sagen ist, dass man virtuelle Funktionen durch andere Techniken ersetzen kann.
-
Ich finde hier wird "das was es ist" mit "das was es sein sollte" bzw. "das was sinn macht und gut ist" verwechselt.
OOP "ist" nicht (beinhaltet nicht) dynamic dispatch/..., aber es macht Sinn OOP mit dynamic dispatch zu kombinieren.Anderes Beispiel: Dynamic dispatch "ist" auch nicht multiple dispatch, aber multiple dispatch ist gut und macht Sinn.
Oder: C++ "ist" nicht typsicher, aber es macht Sinn in C++ typsicher zu programmieren.Genauso falsch wie zu einem "switch/printf/fopen" Code zu sagen "das ist nicht C++" (denn es IST C++, da es in C++ compiliert und definiertes Verhalten hat) ist es zu einem static dispatch/... Programm welches "Objekte" verwendet zu sagen "das ist nicht OOP".
Das ist zumindest meine Meinung bzw. Sicht der Dinge.
Man kann sich natürlich darüber streiten ob diese meine Definition von OOP "richtig" ist, also der "allgemein akzeptierten" Definition (die es aber anscheinend nicht gibt) entspricht, bzw. irgendeiner "authoritären" Definition entspricht (von der ich nichts wüsste falls es eine geben sollte -- wüsste auch nicht wer diese Authorität sein sollte).
Würde ich die Definition von OOP allerdings um die Forderung nach dynamic dispatch erweitern, dann kämen für mich automatisch andere Dinge mit dazu (die genauso "wichtig" bzw. noch "wichtiger" sind), wie z.B. multiple dispatch und reflection. Da beides in C++ nicht "direkt" möglich ist müsste man also entweder sagen C++ "kann" kein OOP, oder eben doch die wesentlich einfachere Definition von OOP akzeptieren.
-
Shade Of Mine schrieb:
Aber ich kann nicht oft genug wiederholen: Es gibt massig Sprachen ohne virtuelle Funktionen. zB JavaScript.
"Ja", aber mit Laufzeit-Polymorphie. Und das ist etwas was du offensichtlich nicht verstehst. Virtuelle Funktionen sind die Methode um Laufzeit-Polymorphie in C++ zu implementieren. Du bist aber offenbar so tief in der C++-Gedankenwelt verwurzelt, dass dir die Gemeinsamkeiten überhaupt nicht auffallen. Man braucht kein "virtual" Schlüsselwort und auch kein "final" für "virtuelle Funktionen". Insofern ist es wirklich witzig, dass ausgerechnet du allen anderen vorwirfst, sie mögen sich doch endlich mal von C++/Java lösen.
Laufzeit-Polymorphie hast du sowohl in C++ als auch in C als auch in Perl als auch in JavaScript. Dass ist das Konzept, welches in C++ mit "virtual" verfügbar ist. Aber deswegen fehlt das Konzept noch lange nicht in anderen Sprachen, die nicht dieses Schlüsselwort verwenden.Shade Of Mine schrieb:
Marcus zeigt zB in seinem Buch wie man OO in C hinbekommt - und dort hat man kein virtual stehen.
Wenn du schon auf das Kapitel in Marcus' Buch eingehst, dann solltest du es auch wirklich lesen. Denn Marcus geht ein Stück weiter und nennt das Konzept nicht beim abstrakten Namen sondern benennt es immer in der C++-Terminologie.
Ich zitiere mal aus Marcus' Buch, Seite 199:
Virtuelle Methoden in C
Das hätten Sie sich bestimmt nicht träumen lassen ... man kann in C mit virtuellen Methoden arbeiten. Fragen Sie mal einen C++-Papst aus der Nachbarschaft, ob es virtuelle Methoden auch in C gibt. Wetten, dass er "Nein" sagen wird? Tja, denkste.
Um sich zu überlegen, wie man das in C emulieren könnte, müssen Sie noch einmal kurz das wesentliche Merkmal einer virtuellen Funktion auflisten:
(Merksatz) Es handelt sich um eine späte Bindung, je nach Objekttyp wird eine andere Funktion aufgerufen.Dann geht es damit weiter wie man virtuelle Methoden in C implementieren kann. Lies das Kapitel mal. Schadet dir sicher nicht. Also befrei dich lieber mal von deiner eingeschränkten C++-Sicht. Andere Sprachen, andere Mittel, selbes Konzept.
Insofern hör lieber auf bei anderen ständig "Probleme" zu diagnostizieren und leg besser deine eigenen Scheuklappen mal ab.
-
minhen schrieb:
"Ja", aber mit Laufzeit-Polymorphie. Und das ist etwas was du offensichtlich nicht verstehst. Virtuelle Funktionen sind die Methode um Laufzeit-Polymorphie in C++ zu implementieren.
Sind _eine_ Methode um Laufzeit Polymorphie in C++ zu implementieren und eine seltene Methode um Polymorphie in C++ zu implementieren (Templates verwendet man für Polymorphie in C++ öfter als virtual).
Du bist aber offenbar so tief in der C++-Gedankenwelt verwurzelt, dass dir die Gemeinsamkeiten überhaupt nicht auffallen.
Eben nicht. Ich rede nicht von C++, ich rede meistens von JavaScript, Self, Nice, Lisp,...
Laufzeit-Polymorphie hast du sowohl in C++ als auch in C als auch in Perl als auch in JavaScript. Dass ist das Konzept, welches in C++ mit "virtual" verfügbar ist. Aber deswegen fehlt das Konzept noch lange nicht in anderen Sprachen, die nicht dieses Schlüsselwort verwenden.
Laut Xin ist aber der entsprechende JavaScript Code mit Laufzeit Polymorphie - ohne virtual aber - kein OO Code.
Und neben "Laufzeit Polymorphie" gibt es eben noch "statische Polymorphie" - wobei ich bereits mehrfach erklärt habe dass diese Begriffe nicht technisch zu verstehen sind - denn auch "statische Polymorphie" kann zur Laufzeit aufgelöst werden.
Dann geht es damit weiter wie man virtuelle Methoden in C implementieren kann. Lies das Kapitel mal. Schadet dir sicher nicht. Also befrei dich lieber mal von deiner eingeschränkten C++-Sicht. Andere Sprachen, andere Mittel, selbes Konzept.
Danke ich kann besser C als du
Aber virtuelle Funktionen in C sind auch nur _eine_ Möglichkeit laufzeit Polymorphie zu implementieren - ich habe in diesem Thread bereits eine andere Möglichkeit implementiert.
Aber gut, ich frage dann dich mal, ist folgender Code OOP?
function Dynamo() { this.get_energie = function(){} } function Atomreaktor() { this.get_energie = function(){} } function Lampe(energiequelle) { this.e=energiequelle } lampe=new Lampe(new Dynamo())
Laut Xin ist das nicht OOP. Ist es für dich OOP?
-
Shade Of Mine schrieb:
Danke ich kann besser C als du
den gleichen satz hast du schon mal gebracht, nur mit JavaScript.
-
Undertaker schrieb:
Shade Of Mine schrieb:
Danke ich kann besser C als du
den gleichen satz hast du schon mal gebracht, nur mit JavaScript.
Ich hasse es mir Leute statt über das Thema zu reden die Grundlagen von einer Sprache erklären wollen...
Was mich da aber interessiert, @minhen:
Wie gut kennst du dich mit Self, Nice, Lisp, Haskell, JavaScript,... aus?
-
Shade Of Mine schrieb:
Ich hasse es mir Leute statt über das Thema zu reden die Grundlagen von einer Sprache erklären wollen...
immer schön cool bleiben.
aussagen wie 'ich kann dieses und jenes besser als du' wirken nur kindisch.
-
Xin schrieb:
...
minhin schrieb:
Xin schrieb:
Mich hätte hier lediglich Marc++us Definition noch interessiert. Ich gehe nicht davon aus, dass er mir zustimmt, weil meine Definition braucht man nicht zu binden, da tun es auch ein, zwei Blätter. Ich gehe aber davon aus, dass wenn er schon ein Buch schreibt, er sich ebenfalls intensiver mit dem Thema beschäftigt hat und entsprechend schärfere Definitionen benutzt.
Marcus bezeichnet (Laufzeit-)Polymorphie in seinem Buch als "wesentliches Merkmal der objektorientierten Programmierung". Laufzeit-Polymorphie macht also das Wesen von OOP aus.
Was in C++ durch virtuelle Funktionen erreicht wird...
Aber das ist doch nur ein Mechanismus, mit welchem OOP in C++ ermoeglicht wird.
Das heisst nicht, dass das generell so sein muss.Ich habe den Eindruck, du faehrst dich hier auf einem Sprachfeature fest, bitte
korrigiere mich, wenn ich falsch liege.gruss
v R
-
Wenn ich jetzt ein einfaches Programm schreibe, bei dem es garkein switch/OOP Laufzeitpolymorphie benötigt wird, dann kann ich da garkeine OOP anwenden?
-
Vom sachlichen Endergebnis sin solche "Diskussionen" (im Grunde ist es ja eher ein "dädä, ich weiß es besser als du!11") total fürn Arsch. Aber für Psychologen wäre es bestimmt interessant.
-
minhen schrieb:
Shade Of Mine schrieb:
Aber ich kann nicht oft genug wiederholen: Es gibt massig Sprachen ohne virtuelle Funktionen. zB JavaScript.
"Ja", aber mit Laufzeit-Polymorphie. [...]
Warum muss es denn ausschließlich "Laufzeit-Polymorphie" sein? (was zB der Stroustrup gar nicht sagt, falls du mal wieder irgend was zitieren und entsprechend deiner Meinung auslegen willst)
-
otze schrieb:
Diese beziehung hab ich garnicht im UML diagramm dargestellt und bei der version mit abstraktet basisklasse gibts das auch nicht.
Was wolltest du nochmal trollen?
Jetzt bezeichnet ihr mich als Troll?
-----------------| |---------| | Klasse1 | | Klasse2 | |----------------| |---------| | Member |<----|.... | |----------------| |---------| |Klasse1(Member1)| | | |function() | |foo() | |________________| |---------| / \ / \ / \ |-----------| |-----------| |Konkret1 | |Konkret2 | |... | |... | |-----------| |-----------| |foo() | |foo() | |-----------| |-----------|
In diesem UML Dialgramm steht eindeutig das Klasse2 eine Klasse1 ist. Diese Beziehung haben wir weder bei Templates noch bei JS.
Da schenke ich dem Thread paar Tage keine Beachtung, und schon werde ich als Troll denunziert.
Shade Of Mine schrieb:
Ich sehe da das Problem nicht. Warum ist es falsch zu sagen "alles was sich wie eine Energiequelle verhält, ist eine Energiequelle". Warum soll das falsch sein?
Kann sein das es manchmal nicht wichtig ist. Ein Vogel kann fliegen, ist er damit ein Flugzeug?
rüdiger schrieb:
Seit wann sind die von dir genannten Punkte Bestandteil einer Definition?
Wenn man diese einfachen Fragen nicht beatworten kann, ist eine Definition nutzlos.
Overtaker schrieb:
@DEvent: schau dir mal eine dynamisch typisierte sprache wie eben javascript oder so an dann sollte sich dein missverstehen zu shades posts wohl klären
Kein Missverstaendniss. Ich habe gesagt das diese BEziehung in JS nicht gegeben ist, Shader hat gesagt das es nicht wichtig seih.
-
DEvent schrieb:
In diesem UML Dialgramm steht eindeutig das Klasse2 eine Klasse1 ist. Diese Beziehung haben wir weder bei Templates noch bei JS.
Und nu?
-
rüdiger schrieb:
DEvent schrieb:
In diesem UML Dialgramm steht eindeutig das Klasse2 eine Klasse1 ist. Diese Beziehung haben wir weder bei Templates noch bei JS.
Und nu?
Otze und Shader haben gesagt das der JS und Template Code das gleiche ist, wie der C++ und der Java Code, ich stimmt mit ihnen nicht ueberein, weil man diese Beziehung in JS/Tpm gar nicht abbilden kann. Das wars.
-
DEvent schrieb:
In diesem UML Dialgramm steht eindeutig das Klasse2 eine Klasse1 ist. Diese Beziehung haben wir weder bei Templates noch bei JS.
ich hatte weiter oben ein tool erwähnt (rhapsody in C), das solche diagramme in C (eine sprache, die mit OOP nichts am hut hat), überführen kann.
warum sollt es dann nicht mit JS gehen?