C++ Modern? Vererbung? Sockets?



  • Hallo Zusammen,
    ich bin ein ausländische Student und wenn ich Felern im Text habe, bitte um Enschuldigung. Ich habe ein Client-Server Projekt mit die folgenden Voraussetzungen.
    1. Sprache ist C++.
    2. Ohne externe Bibliotheken, wie für Sockets und ect..
    3. BS Linux.

    Und dann habe ich bischen gegoogelt und was sehr nützliches gefunden.
    Das Buch "TCP/IP Sockets in C: Practical Guide for Programmers, Second Edition" by Michael J.
    url: http://cs.ecs.baylor.edu/~donahoo/practical/CSockets2/

    Ich habe die Klassen im PracticalSocket.h und PracticalSocket.cpp ausgewählt und nach meine Bedürfnisse angepasst. Mein Teamleiter sagte die Vererbungs muster nicht mehr up to date ist und man kann sehr leicht Felern machen. Er hat mir einen Link mit Beispile gegeben. Hier ist der Link: "https://lwn.net/Articles/548560/" . Ich habe den Artikel, mit meine bescheidene englischkenntnisse, ein paar mal gelesen und leider nicht ganz verstanden.

    Kann mir Jemand behilflich sein, den Artikel zur verstechen?
    Ich hoffe, dass ich das Problem beschreiben könnte.



  • da hat dein teamleiter leider unrecht. mit objekt-orientierten ansätzen macht man weniger fehler. das bekannteste argument dafür ist RAII.


  • Mod

    asfasfd schrieb:

    da hat dein teamleiter leider unrecht. mit objekt-orientierten ansätzen macht man weniger fehler. das bekannteste argument dafür ist RAII.

    😕 Hast du wenigstens mal die Überschrift vom verlinkten Artikel gelesen?



  • cpp_is_cool schrieb:

    Mein Teamleiter sagte die Vererbungs muster nicht mehr up to date ist man kann sehr Felern machen. Er hat mir einen Link mit Beispile gegeben. Hier ist der Link: "https://lwn.net/Articles/548560/" . Ich habe den Artikel, mit meine bescheidene englischkenntnisse, ein paar mal gelesen und leider nicht ganz verstanden.

    In dem Artikel geht es darum, dass die Programmiersprachen Go und Rust keine Vererbung anbieten, die man als Programmierer explizit erwähnen muss, zumindest dann, wenn es um "Interfaces" bzw "abstrakte Basisklassen" geht. Man definert einfach Schnittstellen/Traits und wenn ein Typ diese Schnittstelle unterstützt, kann man den Typ ganz automatisch dort verwenden, wo anderer Code auf dieser Schnittstelle arbeitet. Das schöne dabei ist, dass man als Programmierer weniger Vorausschau braucht und auch nachträglich noch Schnittstellen für Typen bauen kann, ohne die Typen verändern zu müssen und ein "implements Interface_Soundso" oder ": public this_abstract_class" dahinter schreiben muss. Es fühlt sich ein bisschen wie Duck-Typing an.

    Was Dein Teamleiter jetzt von Dir will, kann ich Dir nicht sagen.
    Was Dein Problem genau ist, weiß ich auch nicht.



  • Erst ich danke an allen.

    Ich bin "noch nicht" ein fortgeschrittene C++ Programmierer und deswegen schaue ich wie die andere erfahrene Programmierer das Problem schon gelöst haben. Zu Zeit bescheftige ich mich mit Qt und da ist das Problem, wenn man es Problem nennen kann, mit Vererbung gelöst. Wie folgt:
    QIODevice -> QAbstractSocket -> QTcpSocket
    Wenn man sich die QTcpSocket Kalasse anschaut, man sieht, dass alle "Public Functions" geerbt sind.
    Und jetzt frage ich mich. Sind alle Qt-Developer nicht mehr up to date oder die können nicht googeln?
    Was ich weiss, dass die Vererbung vermeidet die Code-Duplizierung und mit eifachen schreiben von ": public BaseClass" man erbt die gesamte Funktionalität und dann kann man weitere eigene Methoden dazu tun. Was ist das bessere an Go und Rust, wenn sie keine Vererbung anbieten?

    krümelkacker schrieb:

    Man definert einfach Schnittstellen/Traits und wenn ein Typ diese Schnittstelle unterstützt, kann man den Typ ganz automatisch dort verwenden, wo anderer Code auf dieser Schnittstelle arbeitet. Das schöne dabei ist, dass man als Programmierer weniger Vorausschau braucht und auch nachträglich noch Schnittstellen für Typen bauen kann, ohne die Typen verändern zu müssen und ein "implements Interface_Soundso" oder ": public this_abstract_class" dahinter schreiben muss.

    Wie kann man in C++ das tun ohne zu Erben ": public this_abstract_class" und die pure virtuele Methoden implementieren? Ein bischen Code wäre sehr hilfsreich.



  • cpp_is_cool schrieb:

    Wie kann man in C++ das tun ohne zu Erben ": public this_abstract_class" und die pure virtuele Methoden implementieren? Ein bischen Code wäre sehr hilfsreich.

    Dynamisch gar nicht.
    Man kann aber statische Polymorphie verwenden, z.B. in Form von Duck-Typing:

    #include <iostream>
    
    template <class T>
    void TestDuck(T& duck)
    {
        duck.Walk();
        duck.Quack();
    }
    
    class Duck
    {
    public:
        void Walk() { std::cout << "Walking...\n"; }
        void Quack() { std::cout << "QUACK!!!\n"; }
    };
    
    class DuckSimulation
    {
    public:
        void Walk() { std::cout << "Simulated walking...\n"; }
        void Quack() { std::cout << "Simulated QUACK!!!\n"; }
    };
    
    int main()
    {
        Duck d;
        TestDuck(d);
    
        DuckSimulation sd;
        TestDuck(sd);
    }
    

    http://ideone.com/3N5tCh

    Das ist jetzt natürlich nicht type-safe. Die type-safe Variante davon ist in C++ recht hässlich und auch recht viel zusätzliche Tipparbeit. Das Prinzip sollte aber klar sein.

    Worum es deinem Teamleiter genau geht weiss ich ehrlich gesagt nicht. Es könnte sein dass er sich einfach grundsätzlich daran stösst dass hier Vererbung verwendet wird, obwohl sie für die meisten Anwendungen nicht nötig oder sinnvoll ist.
    Und wenn man die Vererbung Client-Seitig nicht braucht, also einen CommunicationSocket nirgens als Socket behandeln muss usw., dann ist sie mMn. auch wirklich nicht angebracht. Code-Duplizierung kann man auch anders vermeiden - man muss dazu ein paar Zeilen mehr schreiben als mit Vererbung. Das ist mMn. aber noch lange kein ausreichendes Argument für Vererbung.



  • Ala Policy Pattern

    Ich fürchte das ist für den Threadersteller ein wenig zuviel des Guten.



  • Nochmal für den Anfänger:

    Vererbung keineswegs schlechter Stil und schon gar nicht veraltet.

    Klar gibt es Programmiersprachen, die ohne Vererbung auskommen. Die haben eben einen anderen Schwerpunkt und sind für andere Sachen besser geeignet, als C++.

    Mit Template-Metaprogrammierung kann der Profi mittlerweile einige Dinge lösen, für die man früher bzw. als Anfänger Vererbung verwendet hätte. Aber das ist ein Thema für Fortgeschrittene - und kann Vererbung auch nicht 1:1 ersetzen.



  • Vererbung schließt doch auch das Erben von Schnittstellen/abstrakten Klassen mit ein. Und gegen Schnittstellen zu programmieren ist IMHO eine schöne Sache und macht viele Design Pattern in C++ erst möglich.


Anmelden zum Antworten