Performancemythen?



  • otze schrieb:

    Was ist das denn für eine Frage? Du zeigst mir nichts und ich soll sagen, was das ist?
    Hab ich 'ne Kristallkugel? Ich weiß ja nicht, was der Code da macht.
    Nur weil da Miau rauskommt, weiß ich doch nicht, ob der Entwickler per OOP gelöst hat oder nicht.

    das bedeuted, dass deine definition in 90% aller großprojekte nichtmehr sinnvoll zum einsatz kommen kann. tolle definition, ehrlich. so mathematisch korrekt...und nützlich.

    Keine Definition kommt sinnvoll zum Einsatz, wenn Du nicht die Informationen hast um eine Antwort zu geben.

    Wer ein Auto mietet und an die Tankstelle fährst, stellt oft fest, dass das Auto fährt, obwohl man nicht weiß, ob man Benzin oder Diesel tanken muss.
    Trotzdem ist entweder ein Benzinmotor drin - oder ein Diesel.

    Wenn man die Motorhaube öffnet oder sich in der Dokumentation informiert, dann kann man das entscheiden.

    Man kann natürlich auch sagen, dass die Definition Benzin oder Diesel nichts taugt und einfach Kraftstoff verlangen.



  • Xin schrieb:

    Ist das alles, was als Begründung kommt?
    Wenn Du mir etwas mitteilen möchte, dann stelle nicht nur Behauptungen auf, sondern begründe sie.

    Die Grundlage von OO ist die sinnvolle Zusammenführung von Daten und Funktionalität zu Objekten. Punkt aus ende. Aber du kommst mir Spezialisierungen daher und nennst das OOP. Das ist so, als ob man sagt, dass ein Ding nur dann ein Vehikel ist, wenn es ein Lenkrad hat und Porsche heisst.



  • dv_ schrieb:

    Xin schrieb:

    Ist das alles, was als Begründung kommt?
    Wenn Du mir etwas mitteilen möchte, dann stelle nicht nur Behauptungen auf, sondern begründe sie.

    Die Grundlage von OO ist die sinnvolle Zusammenführung von Daten und Funktionalität zu Objekten. Punkt aus ende. Aber du kommst mir Spezialisierungen daher und nennst das OOP. Das ist so, als ob man sagt, dass ein Ding nur dann ein Vehikel ist, wenn es ein Lenkrad hat und Porsche heisst.

    Falsch, ich verlange Räder.

    Räder funktionieren mit einem Fahrer (int), mit Beifahrer ( Array ) und auch als Transporter (Klasse).
    Der Fahrer (int) kann aber auch zu Fuß gehen, genauso wie die Beifahrer und auch eine Palette kann man notfalls tragen.

    Ansonsten sind Diskussion mit Personen, die "Punkt aus ende" formulieren kaum nutzbringend.



  • Du weisst aber schon, dass Vehikel nicht unbedingt Räder brauchen, oder? Wozu braucht ein Schiff räder? Ja, ein Schiff ist ein Vehikel.

    Davon abgesehen ist dein Beispiel überhaupt total verkorkst. Du bist extrem C++-versteift. Lerne doch endlich, dass es andere Modelle gibt. Verschiedene Beispiele anderer Sprachen wurden dir gezeigt.



  • Xin schrieb:

    Wo steht das?
    Es ist die logische Konsequenz, wenn der Compiler OOP rausoptimiert, dass der OOP-Quelle zu einem Nicht-OOP-Ziel kompiliert wird.

    Besten Dank für die Antwort.
    Könnte Alpträume verursachen, wenn die Executable nicht mehr dem Sourcecode entspricht.
    Ist aber wohl ein anderes Thema.



  • Was haben wir hier eigentlich. Wir haben zwei Parteien: Die eine hat eine schwammige, unpräzise Definition von OOP, die andere eine harte, präzise. Was mich dabei aber wundert ist, dass in einem Forum mit den übelsten Pedanten, ANSI-Standard-Fetischisten und undefined-behaviour-Propheten eben die unexakte, schwammige Definition besser angenommen wird. Müssten diese nicht alle (den Matheloser Jester mal ausgenommen) den Weg der peinlichst genauen Definition gehen? Woher kommt das? Liegt es vielleicht letzten Endes doch daran, dass die präzise Definition einfach nur unbrauchbar ist, weil sie einfach zu speziell ist?
    Mir kommt es so vor, als definiert jemand "Speiseeis" als "Mischung aus Wasser und Milch in festem Aggregatszustand mit Zucker und Zartbitterschokoladepartikeln mit definierter Größe", während der Pöbel das einfach nur als "na Eis halt" definiert. Bei der ersten Definition ist eindeutig, dass Stracciatella gemeint ist. Der Pöbel hingegen kann sich theoretisch die Zunge am Trockeneis einfrieren, aber sollte da nicht schon längst der "common sense" eingesetzt haben?



  • Xin schrieb:

    Was ist ein "abstraktes Konzept, das nicht direkt im Sourcecode vorkommt"?

    Shape in dem C++ Template Beispiel



  • Oder auch Policy-Based Design genannt 😃



  • minhen schrieb:

    rüdiger schrieb:

    Hier mal ein Beispiel mit Common Lisp (CLOS)

    Ich erweitere das Sammelsurium einfach mal aus Spaß an der Freude mit Perl:

    iiiih ist ja grauenhaft :p Aber dennoch schön OOP (auch wenn einige es hier nicht glauben mögen...)



  • Tim schrieb:

    Was haben wir hier eigentlich. Wir haben zwei Parteien: Die eine hat eine schwammige, unpräzise Definition von OOP, die andere eine harte, präzise. Was mich dabei aber wundert ist, dass in einem Forum mit den übelsten Pedanten, ANSI-Standard-Fetischisten und undefined-behaviour-Propheten eben die unexakte, schwammige Definition besser angenommen wird. Müssten diese nicht alle (den Matheloser Jester mal ausgenommen) den Weg der peinlichst genauen Definition gehen? Woher kommt das? Liegt es vielleicht letzten Endes doch daran, dass die präzise Definition einfach nur unbrauchbar ist, weil sie einfach zu speziell ist?
    Mir kommt es so vor, als definiert jemand "Speiseeis" als "Mischung aus Wasser und Milch in festem Aggregatszustand mit Zucker und Zartbitterschokoladepartikeln mit definierter Größe", während der Pöbel das einfach nur als "na Eis halt" definiert. Bei der ersten Definition ist eindeutig, dass Stracciatella gemeint ist. Der Pöbel hingegen kann sich theoretisch die Zunge am Trockeneis einfrieren, aber sollte da nicht schon längst der "common sense" eingesetzt haben?

    Das Problem ist ganz einfach dass es eine solche Definition ganz einfach nicht gibt.

    Xin bastelt sich da aus seinen C++-Kenntnissen selber eine Definition (die im Endeffekt wohl genauso schwammig, unpräzise und sicher inkonsistent ist) zurecht, die hinten und vorne nicht so allgemeingültig und vor allem allumfassend ist wie er sich einbildet.



  • Xin schrieb:

    dv_ schrieb:

    Du glaubst allen ernstens, dass OOP nur aus dynamic dispatch besteht? Mann, du hast wirklich eiskalt alle Messlatten vergraben. Lass dir gesagt sein: OOP ist mehr als nur dynamic dispatch.

    Ist das alles, was als Begründung kommt?
    Wenn Du mir etwas mitteilen möchte, dann stelle nicht nur Behauptungen auf, sondern begründe sie.

    a.foo();
    

    Nachricht an ein Objekt gesendet => OOP.

    class A {
    public:
      void foo();
    };
    
    A a;
    

    wow gilt immer noch!

    class A {
    public:
      virtual void foo();
    };
    
    A a;
    

    und immer noch!

    Ist nämlich unabhängig von den Interna der Klasse.

    a.bar = 10;
    

    wow, Nachricht an eine Objekt gesender => OOP. Total toll

    a();
    

    und hier das gleiche!

    a-=10;
    

    und noch mehr Nachrichten an Objekte gesendet.

    btw. schau mal über den Tellerrand und guck dir mehr als C++ an, wenn du große Töne über OOP schwingen willst...



  • Tim schrieb:

    Mir kommt es so vor, als definiert jemand "Speiseeis" als "Mischung aus Wasser und Milch in festem Aggregatszustand mit Zucker und Zartbitterschokoladepartikeln mit definierter Größe"

    Wenn ich Wasser und Milch mische, dazu Zucker und Zartbitterschokoladepartikel packe, dieses dann in einen festen Aggregatszustand versetze, dann will ich das selber nichtmehr essen.

    Was ich damit sagen will ist, dass dies nicht unbedingt eine präzisiere Definition von Eis ist und da liegt in meinen Augen das Problem 😉



  • Shade Of Mine schrieb:

    Xin schrieb:

    Was ist ein "abstraktes Konzept, das nicht direkt im Sourcecode vorkommt"?

    Shape in dem C++ Template Beispiel

    Wo ist da ein abstraktes Konzept, dass nicht im Sourcecode vorkommt?

    Ich pack den Code hier nochmal rein, damit wir überhaupt sicher sind, dass wir vom gleichen sprechen:

    Xin schrieb:

    Shade Of Mine schrieb:

    Mir ist gerade langweilig, deshalb ein kleines Gedankenspielchen:

    class Triangle {
    public:
      void draw();
    };
    
    class Circle {
    public:
      void draw();
    };
    
    template<typename Shape>
    void foo(Shape* s) {
      s->draw();
    }
    

    Das ist ja kein OO Code, weil er statisch ist, nicht wahr?

    Korrekt, kein OOP.

    Tim schrieb:

    Was haben wir hier eigentlich. Wir haben zwei Parteien: Die eine hat eine schwammige, unpräzise Definition von OOP, die andere eine harte, präzise. Was mich dabei aber wundert ist, dass in einem Forum mit den übelsten Pedanten, ANSI-Standard-Fetischisten und undefined-behaviour-Propheten eben die unexakte, schwammige Definition besser angenommen wird.

    👍

    In dem Fall bin ich wohl der Pedant ^^
    Das ist okay, denn es stimmt hier ja. Ich möchte nur nebenher erwähnen, dass zwar scharfe gezogene Definitionen schätze, aber deswegen nicht grundsätzlich pedantisch bin.
    Hier bin ich Pedant, solange niemand die Frage auf Seite 11 sinnvoll beantwortet oder es wenigstens versucht. 😎

    Tim schrieb:

    Müssten diese nicht alle (den Matheloser Jester mal ausgenommen) den Weg der peinlichst genauen Definition gehen?

    Ich habe keine Ahnung, ob Jester gut in Mathe ist oder war.

    Ich weiß aber - und das nicht nur aus dem Thread - dass grade Informatiker nicht gewohnt sind, ihre Werkzeuge in Frage zu stellen und es vielen aus einem mir nicht erklärlichen Grund schwer fällt, sich alternativen Möglichkeiten zu öffnen.

    Tim schrieb:

    Woher kommt das? Liegt es vielleicht letzten Endes doch daran, dass die präzise Definition einfach nur unbrauchbar ist, weil sie einfach zu speziell ist?

    Sie ist speziel, aber deswegen nicht unbrauchbar.

    Wie otze ja zeigt, gibt es genug Möglichkeiten, manche Probleme auch "nicht objektorientiert" zu lösen.
    Ich kann zwar nicht sagen, ob ein Library mit OOP entwickelt wurde oder nicht, aber das kann ich nach nach "schwammiger" Definition auch nicht zwangsläufig erkennen, wenn ich nur eine C-Fasade habe. Ob es intern mit Klassen realisiert wurde, kann man da nicht erkennen.

    Was diesen Kritikpunkt angeht, ist die "schwammige" Definition genauso unbrauchbar.



  • rüdiger schrieb:

    Xin schrieb:

    dv_ schrieb:

    Du glaubst allen ernstens, dass OOP nur aus dynamic dispatch besteht? Mann, du hast wirklich eiskalt alle Messlatten vergraben. Lass dir gesagt sein: OOP ist mehr als nur dynamic dispatch.

    Ist das alles, was als Begründung kommt?
    Wenn Du mir etwas mitteilen möchte, dann stelle nicht nur Behauptungen auf, sondern begründe sie.

    a.foo();
    

    Nachricht an ein Objekt gesendet => OOP.

    Sorry, hier ist es leider schon vorbei.
    Das ist Syntax, die Realität sieht auch bei a.foo(); so aus:

    ClassOfA::foo( a );
    

    Aufruf einer statischen Funktion, mit dem Objekt als erstem Argument.

    Wenn a.foo() OOP ist, ohne virtuell zu sein, dann ist printf() ebenfalls OOP.



  • Xin schrieb:

    In dem Fall bin ich wohl der Pedant ^^
    Das ist okay, denn es stimmt hier ja. Ich möchte nur nebenher erwähnen, dass zwar scharfe gezogene Definitionen schätze, aber deswegen nicht grundsätzlich pedantisch bin.

    Wo ist sie denn, deine "scharfe gezogene Definition" von OOP?

    Xin schrieb:

    Hier bin ich Pedant, solange niemand die Frage auf Seite 11 sinnvoll beantwortet oder es wenigstens versucht. 😎

    Welche meinst du denn?



  • finix schrieb:

    Xin schrieb:

    In dem Fall bin ich wohl der Pedant ^^
    Das ist okay, denn es stimmt hier ja. Ich möchte nur nebenher erwähnen, dass zwar scharfe gezogene Definitionen schätze, aber deswegen nicht grundsätzlich pedantisch bin.

    Wo ist sie denn, deine "scharfe gezogene Definition" von OOP?

    Du kannst sie auf den letzten ähh... 20-30 Seiten lesen.
    Die 40 packen wir wohl noch ^^

    Ich lege die Tage eine Zusammenfassung vor, die ich dann zur Diskussion stelle.

    finix schrieb:

    Xin schrieb:

    Hier bin ich Pedant, solange niemand die Frage auf Seite 11 sinnvoll beantwortet oder es wenigstens versucht. 😎

    Welche meinst du denn?

    Die Frage, die ich hustbaer stellte - sorry, war Seite 12:

    xin schrieb:

    hustbaer schrieb:

    Wenn man diese Definition von OO(P) verwendet heisst das noch lange nicht dass man hier irgendwelche abstrakten Klassen, Polymorphie oder virtuelle Aufrufe braucht. Wenn ein Programm so entworfen ist dass "die Auswahl des auszuführenden Codes" immer zur Compile-Zeit erfolgen kann (ohne natürlich den "falschen" Code auszuwählen), dann ist das kein Grund warum das Programm nichtmehr "OO" wäre.

    Und welche Begründung gibt es, es "OO" zu nennen?
    Nachrichten gibt's in rein prozeduralen Sprachen, in C++ wird es in Funktionsaufrufen gehandhabt.
    Man könnte auch überall, was da in Wirklichkeit ja auch steht, die Funktion korrekt ausschreiben:

    tier.Tier::Funktion( typ Parameter )
    

    Das unterscheidet sich von

    tier_Funktion( Tier * tier, typ Parameter )
    

    nicht. Die Methode heißt Tier::Funktion( Tier *, typ ). Wo ist der Unterschied zu "tier_Funktion( Tier *, typ )?
    Es passiert dasselbe und es wird auch dasselbe übersetzt. Es ist in der Implementierung identisch. Es ist semantisch identisch, beides kann als Nachricht übermittelt werden und beides wird in C++ als Funktionsaufruf umgesetzt.
    Warum ist das eine für Dich "OO" und das andere nicht? Wo beschreibt die Masse einen Unterschied, der den Namen "objekt orientiert" rechtfertigt?

    ...und beides wird in C++ als - statischer - Funktionsaufruf umgesetzt.



  • OK, ich habe ja lange tapfer durchgehalten, aber irgendwo auf seite 28 oder 29 bin ich ausgestiegen.

    Ich weiß nicht, ob in den folgenden Seiten definiert wurde, was mit "reiner" OO gemeint ist, deswegen mache ich das noch eben und klinke mich dann volkommen aus.

    Zunächst ein Bereich, in dem rein vs. unrein an der Tagesordnung steht: rein-funktionale Sprachen (Haskell, Clean, ...) vs. unreine (SML, O'Caml, ...). Rein Funktionale Sprachen kennen eben keinerlei imperative Konstrukte, wie Schleifen, etc. da sich der Zustand nicht ändern kann und Schleifen somit grundsätzlich entweder nie oder unendlich lang laufen würden.

    Analog ist es mit der reinen Objektorientierung zu verstehen.
    C++ verwendet z.B.

    if (x > y)
       ...
    else
       ...
    

    Wohin rein-Objektorientierte Sprachen solche Konstrukte natürlich gar nicht kennen. Alles ist ein Objekt. Equivalent in Smalltalk:

    (x > y) ifTrue: [...] ifFalse: [...].
    

    Dem Objekt x wird die Nachricht > mit dem Argument y geschickt. Dieses Antwortet entweder mit einem Objekt des Typs "True" oder mit einem Objekt des Typs "False".
    Beide implementieren die Methode "ifTrue:ifFalse": (Argumente werden hinter Doppelpunkte in den Funktionsnamen eingestreut). "True" implementiert sie so, dass sie dem ersten übergebenen Block die Nachricht "value" schickt und den zweiten ignoriert. "False" implementiert sie so, dass sie dem zweiten übergebenen Block die Nachricht "value" shickt und den ersten ignoriert. (Code-Blöcke sind natürlich auch Objekte, da alles ein Objekt ist und deswegen ist es kein Problem einen zu übergeben.)

    Rein objektorientiert bedeutet also nicht durch nicht-Objektorientierte Konstrukte "verunreinigt".

    So. Das wars von mir zu dem Thema.



  • Xin schrieb:

    finix schrieb:

    Wo ist sie denn, deine "scharfe gezogene Definition" von OOP?

    Du kannst sie auf den letzten ähh... 20-30 Seiten lesen.
    Die 40 packen wir wohl noch ^^

    Ich lege die Tage eine Zusammenfassung vor, die ich dann zur Diskussion stelle.

    Äh, ja, das hört sich tatsächlich nach scharf gezogener Definition an. Ist denn nicht eine deiner Quellen online verfügbar, so dass du bis dahin auf diese verweisen könntest? 😃



  • finix schrieb:

    Xin schrieb:

    finix schrieb:

    Wo ist sie denn, deine "scharfe gezogene Definition" von OOP?

    Du kannst sie auf den letzten ähh... 20-30 Seiten lesen.
    Die 40 packen wir wohl noch ^^

    Ich lege die Tage eine Zusammenfassung vor, die ich dann zur Diskussion stelle.

    Äh, ja, das hört sich tatsächlich nach scharf gezogener Definition an. Ist denn nicht eine deiner Quellen online verfügbar, so dass du bis dahin auf diese verweisen könntest? 😃

    Jemand warf folgenden Link rein: Stroustrup: What is OOP?.
    Der Link steht von meiner Seite nicht mehr zur Diskussion, wenn Du etwas dazu anmerken möchtest, blättere zurück, Du wärst vermutlich nicht der erste, der etwas dazu anmerkt.

    Ich zitierte schon ein paar Sachen und ansonsten sagte ich auch schon, dass eine Zitatschlacht weder für die eine oder andere Seite ein Beweis darstellt.
    Es zählt schließlich nicht, wieviele etwas sagen, sondern wie gut sie es begründen können.

    Lass es mich anders formulieren: Das eigene Hirn zu nutzen bringt mehr, als Texte zu zitieren, ohne zu wissen, ob die jeweiligen Autoren ihr Hirn benutzt haben oder nur von jemand anderem abgeschrieben haben.



  • [quote="Xin"]
    Wo ist da ein abstraktes Konzept, dass nicht im Sourcecode vorkommt?

    Ich pack den Code hier nochmal rein, damit wir überhaupt sicher sind, dass wir vom gleichen sprechen:

    Xin schrieb:

    Shade Of Mine schrieb:

    Mir ist gerade langweilig, deshalb ein kleines Gedankenspielchen:

    class Triangle {
    public:
      void draw();
    };
    
    class Circle {
    public:
      void draw();
    };
    
    template<typename Shape>
    void foo(Shape* s) {
      s->draw();
    }
    

    Das Konzept hier ist Shape. Genau wie in Java oder sonstwo wo man eine abstrakte Klasse/Interface hätte. Lediglich manifestiert es sich nicht direkt im Code in form einer Klasse/Interface sondern viel mehr im Sinne eines abstrakten Konzepts.


Anmelden zum Antworten