C++ oder Java
-
Auf Vererbung wird in der C++ std-lib größtenteils verzichtet
Was imho auch richtig isst ....
Generische Biblotheken muessen in erster Linie performant sein. Und da die STL nix mit polymorphie am hut hat, besser gesagt keine TypAufloesung zur laufzeit braucht weil sie keine hirarichen Klassenbaeume braucht, waer vererbung da auch vollkommen fehl am platz, sprich nur drinnen damit sie drin waer.
den Vorteil merkst sogar ... lass mal nen std::vector gegen nen CArray laufen
Vorausgesetzt du verwendest kein std::string/CString als Members
Ciao ...
-
@Optimizer: weiter steht an der Stelle, wo Du das Wikipedia-Zitat her hast:
Paradebeispiel ist die Standard Template Library, von der weite Teile in die Standardbibliothek von C++ übernommen wurden.
-
Jester schrieb:
ich kenne das Wort objektbasiert und ich empfinde es als abwertend.
Das tut mir leid, dass du das so empfindest. Was ich von Objektbasiertheit halte, soll hier nicht zur Sprache kommen. Tatsache ist, dass dieses Wort wesentlich treffender als Objektorientierung ist. Wo findet man in der std-lib schon Vererbung mit Polymorphie, was absoluter Bestandteil des Konzepts der Objektorientierung ist?
Daß Du mir auf diese Art und Weise unterstellst es nicht zu kennen finde ich recht billig.
Ja klar, aber du kannst mir natürlich einfach unterstellen, dass ich Generizität mit Objektorientierung verwechsle.
Was in Java an Unterstützung für generische Programmierung vorhanden war (über den aktuellen Stand möchte ich jetzt nicht diskutieren, da unsere Meinungen an dieser Stelle vermutlich stark divergieren) ist quasi nichts. Das ganze wurde eben mit vielen Hilfsklassen von denen geerbt wurde irgendwie hingefixed. Ein workaround oder ein hack, nenn es wie Du willst.
Wußtest Du zum Beispiel, daß es für C++ ein Framework gibt, mit dem Reflection betreiben kann? C++ kennt also reflection. Aber der Code ist ein workaround. Es sieht nicht so schön aus wie in Java und es ist auch nicht ganz so toll benutzbar. C++ unterstützt nämlich keine Reflections. Man kann's aber so hinbiegen, daß es trotzdem geht.
Genau. So wie C++ Reflection nicht unterstützt, hat Java generische Programmierung nicht unterstützt. Das Java-Programmier das deswegen nicht kennen, ist trotzdem Unsinn, weil die Collection-Klassen so aufgebaut sind (und schon immer waren), generisch genutzt zu werden.
So und jetzt zurück zur generischen Programmierung. Ja, mann kann das in Java bauen, aber die Unterstützung der Sprache dafür war bis vor kurzem schlich nicht vorhanden. Stattdessen hat man workarounds gebaut.
Eine recht unelegante Lösung, streitet ja keiner ab. Du behauptest jedoch, dass Java Programmierer das gar nicht erst kennen.
Und jetzt kommt das, was mich wirklich gstört hat:
Du hast dann so getan, als sei dies vorbildlichstes objektoriertes DesignNein. Aber wirklich nicht. Ich habe mit Sicherheit nicht gesagt, dass dieser Generics-Workaround hervorragendes OO Design wäre. Auf die ganze generische Programmierung bist du gekommen, ich hab nicht mit einem Ton Generizität überhaupt erwähnt.
Gutes OO-Design findest du im Java-API überall. Das fängt bei den Streams an, geht weiter über die Collections (beispielsweise erbt Stack von AbstractSequentialList, von AbstractList, von AbstractCollection) und da gibt es noch unendlich viele weitere Beispiele.
Und jetzt zeig mir was vergleichbares in der C++ stdlib. Da kommt der Unterschied zwischen Objektbasierung und Objektorientierung massiv zum Tragen, wenn ich einen Konstruktor z.B. Stack(Container c) habe (nur als Beispiel, bitte jetzt nicht anfangen "sowas geht in C++ auch mit dem und dem Algorithmus". Das ist halt hier der OOP-Weg).Der Ansatz ist nicht objektbasiert sondern generisch. Mehr wollte ich eigentlich auch nicht sagen.
Dass die Templates bzw. die generischen Container objektbasiert sind, habe ich nie behauptet. Ich habe von der std-lib geredet und du hast dich einfach auf einen kleinen Teil daraus und auf die einzelnen Container und nicht auf die Container in ihrer Gesamtheit beschränkt und dann daraus geschlossen, dass ich Objektorientierung mit Generizität verwechsle. So jedenfalls scheint mir das.
Jester schrieb:
@Optimizer: weiter steht an der Stelle, wo Du das Wikipedia-Zitat her hast:
Paradebeispiel ist die Standard Template Library, von der weite Teile in die Standardbibliothek von C++ übernommen wurden.
Damit willst du was aussagen? Ich habe nie behauptet, dass die Generizität in C++ Wünsche offen lässt.
-
lass mal nen std::vector gegen nen CArray laufen
Das sagt doch gar nichts aus. Die MFC-Klasse CArray muss nicht virtuelle Zugriffsmethoden haben, die das Array ausmachen. Das Ding kann auch aus anderen Gründen langsam sein.
Außerdem will ich keine Wertung darüber abgeben, ob es jetzt besser ist, die stdlib objektorientiert aufzubauen, oder nicht. Ich habe dazu zwar meine Meinung, aber es ging mir eignetlich nur darum, zu sagen, dass das in C++ nicht der FAll ist.
-
Jester schrieb:
...aber das kenn Java-Leute ja auch erst seit kurzem.
Ich gehe mal davon aus, dass du hier auf Java-Generics anspielst. Die sind zwar in der Tat sau praktisch und eine feine Sache, generische Programmierung ist damit aber letztlich nicht möglich (nur weil man typsichere Container erzeugen kann, kann man noch lange nicht generische Programmierung betreiben). Man darf nicht vergessen, dass Java-Generics unter der Vorgabe standen, die JVM nicht ändern zu dürfen.
Problem 1: Generics existieren nur an der Oberfläche. Ein Vector<Integer> und ein Vector<String> sind letztlich aber genau der gleiche Typ (-> getClass() ist für beide gleich). Zur Laufzeit geht also einiges Wissen verloren.
Das hat natürlich Auswirkungen auf die Machbarkeit bestimmter Sachen. Parametrisierte Typen können z.B. nicht in einer catch-Anweisung stehen.Andere Sachen sind grundsätzlich nicht möglich, wie z.B. sowas:
// Bsp: aus C++ Users Journal - July 2004 // geht nicht in Java class Allocator<T> { public T allocate() {return new T;} } // geht nicht in Java class Foo<T> { public void foo(T aT) {aT.doSomething();} }
Beides kann man natürlich mit Laufzeitpolymorphie lösen, aber das ist ja ein anderes Thema.
Problem 2: Generics unterstützen keine primitiven Typen. Für Container mag das kein Problem sein (hier könnte man eine Auto-Boxing-Strategie verwenden), effiziente generische Algorithmen die auch auf primitiven Typen arbeiten lassen sich so aber nicht schreiben.
Problem 3: Generics erlauben keine Spezialisierung. Ein Grundansatz vieler Designmethoden in der Softwareentwicklung ist die Einteilung von Konzepten in Familien auf Grund von "Commonality" und "Variability". Generics erfüllen diesbezüglich aber nur den "Commonality"-Teil der Gleichung.
Kurz: Java-Generics sind eine gute Sachen und waren imo längst überfällig, generische Programmierung erlauben sie aber nicht.
-
Jester schrieb:
Optimizer schrieb:
Die kann man in C++ zum größten Teil bestenfalls als Objektbasiert bezeichnen, während sie in Java absolut mustergültig (sag ich jetzt mal) objektorientiert aufgebaut ist.
Ich zitier mich hier einfach nochmal kurz.
Hier steht: in Java ist die Bibliothek absolut mustergültig aufgebaut.Optimizer schrieb:
Nein. Aber wirklich nicht. Ich habe mit Sicherheit nicht gesagt, dass dieser Generics-Workaround hervorragendes OO Design wäre.
Oder jetzt doch nicht, oder was?
Und dann schreibst Du: die Standardbiblithek ist bestenfalls objektbasiert.
Und ich sage: nein, ist sie nicht. Sie ist generisch.Wenn Du Dich auf den Teil der Java-API zurückziehen darfst, der absolut toll ist, warum ich darf ich mich dann nicht auf den C++-Lib-Teil zurückziehen, der absolut toll ist?
Ansonsten finde ich Deinen Diskussionsstil etwas gewöhnungsbedürftig. Könntest Du vielleicht einfach mal sachlich bleiben und nicht ständig versuchen mich irgednwie anzupissen? Vielleicht schaffen wir's uns auf ner normalen Ebene zu unterhalten? Ich werd mich jedenfalls bemühen.
MfG Jester
-
@Hume: ja, hab den Artikel auch gelesen. Wollte aber nicht weiter drüber diskutieren, weil denke daß das zu nichts führt.
-
Jester schrieb:
Hier steht: in Java ist die Bibliothek absolut mustergültig aufgebaut.
Nein. Hier steht: in Java ist die Bibliothek absolut mustergültig objektorientiert aufgebaut. Dass sich "mustergültig" nicht auf "toll" oder "schlecht" sondern auf das Maß der Objektorientierung bezieht, kann man am Kontext erkennen, wo ich die Designprinzipien "objektorientiert" und "objektbasiert" vergleiche.
Und dann schreibst Du: die Standardbiblithek ist bestenfalls objektbasiert.
Und ich sage: nein, ist sie nicht. Sie ist generisch.Die C++ stdlib ist doch nicht generisch. Ein paar Klassen sind generisch, ein Teil. Deshalb ist das doch nicht gleich das ganze Designprinzip der stdlib. Es geht doch nicht darum, dass es eine generische Klasse std::vector gibt, sondern darum, wie die Klassen zueinander in Beziehung stehen. Und ich sehe keine großen Beziehungen zwischen den Klassen und vermisse im ganzen Design wichtige Aspekte der Objektorientierung. Daraus folgere ich, dass die stdlib "bestenfalls" (im Sinne von "höchstens") objektbasiert und nicht objektorientiert ist. Und einige Klassen sind generisch, was ein zugegebenermaßen nettes Zuckerl ist.
Wenn Du Dich auf den Teil der Java-API zurückziehen darfst, der absolut toll ist, warum ich darf ich mich dann nicht auf den C++-Lib-Teil zurückziehen, der absolut toll ist?
Wo habe ich mich zurückgezogen? Ich habe Beispiele genannt und ich könnte dir noch hundert weitere nennen. Da habe ich jetzt aber keine Lust dazu. Ich kann es ja auch lassen, Beispiele zu nennen, dann ist es aber auch wieder nicht recht.
Auf jeden Fall solltest du daraus nicht folgern, dass ich mich auf einen kleinen Teil zurückziehe.Ansonsten finde ich Deinen Diskussionsstil etwas gewöhnungsbedürftig. Könntest Du vielleicht einfach mal sachlich bleiben und nicht ständig versuchen mich irgednwie anzupissen? Vielleicht schaffen wir's uns auf ner normalen Ebene zu unterhalten? Ich werd mich jedenfalls bemühen.
Ich auch. Mit dem "anpissen" hast aber du mit deiner allgemeingültigen Aussage über Java-Programmierer angefangen.
-
Optimizer schrieb:
Wo findet man in der std-lib schon Vererbung mit Polymorphie, was absoluter Bestandteil des Konzepts der Objektorientierung ist?
Wo hast du deine Definition von Objektorientierung genommen? Soweit ich das Konzept kenne, sind Vererbung und Polymorphie nur Bestandteile, die aber nicht absolut vorkommen müssen. Da mir aber sowieso jeder, den ich treffe, vorwirft, ich wisse nicht was Objektorientierung sei, frage ich mal nach deiner Definition.
Zur Polymorphie läßt sich aber sagen: Die std-lib verwendet sehr stark Templates. Templates werden jedoch nicht ohne Grund als Mittel für compile-time Polymorphie bezeichnet. Wenn man also Polymorphie schon beim Kompilieren anwenden kann, kann man zur Laufzeit verzichten.
Ebenso kann die std-lib größtenteils auf Vererbung verzichten, da sie das Iteratorkonzept verinnerlicht. So gibt es stat eines vector::vector(Container const & input) einen template <typename Iter> vector::vector(Iter begin, Iter end); Zusammen mit der compile-time Polymorphie durch das Template ist letzteres allgemeiner als das erste Beispiel. Es gibt halt Datenbereiche, die nicht sinnvoll von Container abgeleitet werden können (z.B. ein Socketstream).
Falls jedoch zur Objektorientierung Laufzeitpolymorphie und Vererbung zwangsläufig dazugehoeren, wird die std-lib nicht objektorientiert sein. Das ist danna aber auch besser so.
-
deleted
-
Ich wollte, wie gesagt, kein Urteil über gut oder schlecht abgeben (auch wenn ich dir so viel sagen kann, dass ich nicht deiner Meinung bin).
Definitionen der Objektorientierung findest du eigentlich überall, auch in Wikipedia. Vererbung ist wesentlicher Bestandteil von Objektorientierung und mit Vererbung geht wohl meistens Laufzeitpolymorphie einher.
Ob Laufzeitpolymorphie aber wirklich gefordert ist, weiß ich nicht.
-
Optimizer schrieb:
Ich auch. Mit dem "anpissen" hast aber du mit deiner allgemeingültigen Aussage über Java-Programmierer angefangen.
Okay, prima.
Die Aussage über Java-Programmierer war auch nicht ernst gemeint. Ich fürchte nur, ich hab den hier
vergessen.
Das Problem mit "bestenfalls" ist, daß es sehr wohl eine Bewertung vornimmt:
A hat bestenfalls Eigenschaft a, wohingegen B absolut mustergültig Eigenschaft b hat.
Ich finde, das drückt aus, daß Eigenschaft b besser ist als a.
Aber ansonsten sind wir uns jawohl größtenteils einig.
-
Ponto schrieb:
Templates werden jedoch nicht ohne Grund als Mittel für compile-time Polymorphie bezeichnet. Wenn man also Polymorphie schon beim Kompilieren anwenden kann, kann man zur Laufzeit verzichten.
cool, dann ist 'c' ja auch ein bisschen objektorientierung. #define, #ifdef etc. ist ja wohl auch compile-time polymorph
-
moin ihr, vielelicht lasst ihr mich auch an eurem flamewar teilhaben
ich kann jetzt über java nicht allzuviel sagen(will ich auch garnicht ;)), aber zur stl kann ich mich äußern:
die stl ist objektbasiert, aber auch nur als mittel zum zweck.
Der Kern der stl ist in einem rein funktionalen stil gehalten(sogut wie alle verändernden stl algorithmen basieren auf funktoren um nur ein beispiel zu nennen), wohingegen die Schale rein generisch ist. Die objekte dienen sozusagen nur dazu, um sinneinheiten zusammenzuhalten. Auch vererbung kann man in der stl finden, als beispiele nenn ich mal die streams, oder die functoren die von unary/binary_function abgeleitet sind. Im endeffekt kann ich nur sagen, dass die stl ein paradebeispiel für den coding style von C++ ist(von den variablennamen mal abgesehen...),halt von allem etwas, funktionale programmierung, oop, generics, und das alles gut durchgerührt.Aber das ist nur meine interpretation des aufbaus, sicher werdet ihr mich jetzt in grund und boden flame
//edit dummes forum-.-
-
Willst Du Deinen Postingzähler hochtreiben?
Die STL ist nicht funktional programmiert. Bitte schlag irgendwo nach was funktionale Programmierung ist.
-
hab ich, und dabei bin ich unter anderem auf diese aussage gestoßen(hab ja auch mal im rund um die programmeirung nach ner genauen definition gefragt, viel rumgekommen ist dabei aber auch nicht :D)
-
Ein Thread mit den Wörtern "Java" und "C++" im Titel und erst 4 Seiten??
-
Wieso erst? Ich dachte, er würde nach Seite 1 geschlossen. Aber zumindest kann man hier jeden Mist reinschreiben und es wird kommentiert. Ist doch auch was.
-
Respekt, als ich es letzte mal geschaut hab, da war der Thread noch eine Seite
lang. Unglaublich, wie schnell sich das bei den zwei Streitwoertern aendert :).Wollt ich auch mal gesagt haben, es sich immer nur zu denken ist langweilig.
mfg
v R
-
Auf Vererbung wird in der C++ std-lib größtenteils verzichtet und das macht Objektorientierung nun mal aus.
Ach. Und wenn irgendwo nicht vererbt wird ist es definitiv nicht oo? Quatsch.
@otze: Ich gebe dir zwar recht, das die STL in einigen Aspekte sehr funktional (vom Paradigma her) ist, aber die Aussage "Der Kern der stl ist in einem rein funktionalen stil gehalten" halte ich für falsch.