OOP: soll man jetzt alles in ne Klasse packen oder watt?



  • Wieso eine Mathe Klasse?

    template<typename T>
    struct Add
    {
        T operator()( const T& lhs, const T& rhs )
        {
            return lhs + rhs;
        }
    }
    

    eventuell noch spezialisieren, das wars.
    Aufruf

    int result = Add<int>( 17, 42 );
    

    Da brauch ich kein Objekt extra anzugeben ala

    Math.Add( 17, 42 )
    

    Soviel zu dem



  • byto schrieb:

    In Java gibts dafür Static Imports:

    import static java.lang.Math.*;
    ...
    double y = sqrt(5.0);
    

    drücken diese beiden zeilen nicht eigentlich folgendes aus?

    "eigentlich ist es scheisse, dass sqrt in eine Klasse gesteckt wurde"



  • Die Klasse Math in Java enthält ja nicht diese trivialen Operationen sondern die etwas komplexeren Funktionen wie sqrt, log, sin etc. sowie die Konstanten E und PI. Diese Methoden sind statisch und öffentlich, so dass man sie ohne Objektinstanzierung überall verwenden kann. Die trivialen Methoden der Addition, Subtraktion, ... sind für die primitiven Typen ganz normal über die +, -, ... Operatoren verfügbar.



  • byto schrieb:

    Die Klasse Math in Java enthält ja nicht diese trivialen Operationen sondern die etwas komplexeren Funktionen wie sqrt, log, sin etc. sowie die Konstanten E und PI. Diese Methoden sind statisch und öffentlich, so dass man sie ohne Objektinstanzierung überall verwenden kann. Die trivialen Methoden der Addition, Subtraktion, ... sind für die primitiven Typen ganz normal über die +, -, ... Operatoren verfügbar.

    Das ist jetzt aber kein Gegenargument zu otze.



  • wotze schrieb:

    Das ist jetzt aber kein Gegenargument zu otze.

    Race condition...



  • otze schrieb:

    byto schrieb:

    In Java gibts dafür Static Imports:

    import static java.lang.Math.*;
    ...
    double y = sqrt(5.0);
    

    drücken diese beiden zeilen nicht eigentlich folgendes aus?

    "eigentlich ist es scheisse, dass sqrt in eine Klasse gesteckt wurde"

    using namespace std;
    
    {
        string blaaa;
    }
    

    "eigentlich ist es scheisse, dass string in einen Namespace gesteckt wurde"



  • volkard schrieb:

    Gregor schrieb:

    Ich bin gerade mit einem kleinen C++Projekt beschäftigt und stelle zumindest bei mir fest, dass der Anteil der globalen Funktionen enorm ist. Hier sind gerade etwa 30/40 kByte globale Funktionen.

    ok, es mögen auch 40kByte werden. aber irgendwie hüpfen dann immer wiedermal ganze gruppen dieser funktionen doch in ne klasse rein. sofern man sich die zeit dazu nimmt, immer wieder mal aufzuräumen.

    *hust* so wie die Funktion sqrt() *hust* ?



  • Warum hat man eigentlich operator^ nicht reserviert? Jetzt haben gewisse Leute das mit so 'ner Art sauberem Zeiger (brr) überladen.

    Was meinste eigentlich damit ?

    PS: sry für 3fach Post, aber bin grad zu faul das sauber in einen Post zu quoten.



  • DEvent schrieb:

    otze schrieb:

    byto schrieb:

    In Java gibts dafür Static Imports:

    import static java.lang.Math.*;
    ...
    double y = sqrt(5.0);
    

    drücken diese beiden zeilen nicht eigentlich folgendes aus?

    "eigentlich ist es scheisse, dass sqrt in eine Klasse gesteckt wurde"

    using namespace std;
    
    {
        string blaaa;
    }
    

    "eigentlich ist es scheisse, dass string in einen Namespace gesteckt wurde"

    Falsch!
    1. Eine Klasse und ein Namespace sind was ganz anderes.
    2. string verhält sich zu std NICHT wie sqrt zu math.



  • DocJunioR schrieb:

    Aaallsoooo...
    ...
    Klassen sind Funktionsgruppen.
    Beispielsweise sämtliche Sachen, die mit Textdateien in einem Textprogramm zu tun haben könnten in eine Klasse (also laden, speichern, löschen, ...)
    ...

    Genau so funktioniert OOP _NICHT_ - Du missbrauchst Klassen als
    Namespaces, ist ein klassischer Fehler von Umsteigern. in ganz
    seltenen Fällen macht sowas Sinn (das double-Beispel von Volkard),
    da nennt sich das dann Util-Klasse und durch static imports
    lässt sich das dann sehr elegant nutzen.

    Aber Klassen als Funktionsgruppen zu bezeichnen ist IMHO irreführend.

    Gruss,

    Stefan



  • DEvent schrieb:

    Warum hat man eigentlich operator^ nicht reserviert? Jetzt haben gewisse Leute das mit so 'ner Art sauberem Zeiger (brr) überladen.

    Was meinste eigentlich damit ?

    PS: sry für 3fach Post, aber bin grad zu faul das sauber in einen Post zu quoten.

    Weil 2^32 logischer Gebrauch wäre, anstatt pow(2, 32) oder was auch immer..



  • Und was ist mit Tee? schrieb:

    Wieso eine Mathe Klasse?

    template<typename T>
    struct Add
    {
        T operator()( const T& lhs, const T& rhs )
        {
            return lhs + rhs;
        }
    }
    

    eventuell noch spezialisieren, das wars.
    Aufruf

    int result = Add<int>( 17, 42 );
    

    Da brauch ich kein Objekt extra anzugeben ala

    Math.Add( 17, 42 )
    

    Soviel zu dem

    int result = Add<int>()( 17, 42 );
    


  • Ich glaub ich versteh grad den Witz nicht 😕



  • int result = Add<int>()( 17, 42 );
    

    Wirklich sehr schön aufzurufen und noch dazu derartig selbsterklärend im Vergleich zu folgendem:

    class Math {
        public:
            template<typename T>
            static T add(T lhs, T rhs) {
                return lhs + rhs;
            }
    };
    
    // ...
    
    int result = Math.add(17, 42);
    


  • interessierter schrieb:

    int result = Add<int>()( 17, 42 );
    

    Wirklich sehr schön aufzurufen und noch dazu derartig selbsterklärend im Vergleich zu folgendem:

    class Math {
        public:
            template<typename T>
            static T add(T lhs, T rhs) {
                return lhs + rhs;
            }
    };
    // ...
    int result = Math.add(17, 42);
    

    da haste nicht aufgepasst.

    #define addInt Add<int>
    ...
    int result=addInt(17,42);
    

    ich will den schmarrn doch gar nicht, sondern ne globale funktion (und wo angemessen natürlich nen überladenen operator).



  • da haste nicht aufgepasst.

    #define addInt Add<int>
    ...
    int result=addInt(17,42);
    

    Jetzt versuchst du aber schon sehr zwanghaft etwas zu verteidigen, nur um es zu verteidigen.

    #define add(a, b) Math.add(a, b)
    
    int i = add(3, 2);
    double d = add(3.0, 2.0);
    


  • interessierter schrieb:

    da haste nicht aufgepasst.

    #define addInt Add<int>
    ...
    int result=addInt(17,42);
    

    Jetzt versuchst du aber schon sehr zwanghaft etwas zu verteidigen, nur um es zu verteidigen.

    ich lehne doch

    template<typename T> 
    struct Add
    

    ab. der hat dabei die fehler gemacht, die ich den Math-benutzern vorwerfe. und ne schreibverkomplizierung dazu, die er gar nicht bemerkt hatte.



  • DEvent schrieb:

    otze schrieb:

    byto schrieb:

    In Java gibts dafür Static Imports:

    import static java.lang.Math.*;
    ...
    double y = sqrt(5.0);
    

    drücken diese beiden zeilen nicht eigentlich folgendes aus?

    "eigentlich ist es scheisse, dass sqrt in eine Klasse gesteckt wurde"

    using namespace std;
    
    {
        string blaaa;
    }
    

    "eigentlich ist es scheisse, dass string in einen Namespace gesteckt wurde"

    schön, dass du hier die analogie zu einem namespace benutzt. Richtig ist, dass das java beispiel hier namespace funktionalität simuliert.
    Leider gehts in diesem Thread um die Frage, ob man alles in eine Klasse stecken soll und nicht darum, wie man einen namespace in java simuliert.
    Du merkst doch selbst, dass sqrt danach schreit, ohne objekt oder klassenbezug aufgerufen zu werden, deshalb wurde hier auch import static vorgeschlagen. Was also ist dann deiner Meinung nach an der aussage falsch, dass es falsch ist, sqrt in eine Klasse zu packen?
    Dass java es nicht kann ist eine sache, eine andere sache ist, dann daran festzuhalten, dass dieses Beispiel ein gutes beispiel dafür ist, alles in eine Klasse packen zu können.



  • schon lustig, wie sich anhänger einer sprache, deren workaround für die doch-nicht-so-tolle strenge typisierung zufällig turing-vollständig war, und nun für alles missbraucht wird, was in anderen sprachen schöner und einfacher lösbar ist, über die krücken von anderen sprachen so lange und ausgiebig zerfetzen können. 🙄



  • sozialologe schrieb:

    schon lustig, wie sich anhänger einer sprache, deren workaround für die doch-nicht-so-tolle strenge typisierung zufällig turing-vollständig war, und nun für alles missbraucht wird, was in anderen sprachen schöner und einfacher lösbar ist, über die krücken von anderen sprachen so lange und ausgiebig zerfetzen können. 🙄

    C++ rockt eben alles weg 👍


Anmelden zum Antworten