Java...



  • Beispiel 2: Gib einen Integer i in Binärformat aus. 1 Zeile Java, >40 Zeilen C++.

    Eine, bzw. zwei Zeilen inklusive Deklaration:

    #include <iostream>
    #include <bitset>
    
    int main()
    {
        std::cout << std::bitset<sizeof(int) * CHAR_BIT>(54);
    }
    


  • #include <iostream>
    #include <iterator>
    #include <fstream>
    #include <vector>
    
    int main()
    {
        std::ifstream f("txt.txt");
        std::cout << std::vector<char>(std::istream_iterator<char>(f), std::istream_iterator<char>())[10];
    }
    

    Und zwei Zeilen für deine Spalte.



  • Was sollen denn die Spielyeugbeispiele? Ist Datenbank mit drin, oder Monitore, oder Netzwerk ...?



  • Sone schrieb:

    #include <iostream>
    #include <iterator>
    #include <fstream>
    #include <vector>
    
    int main()
    {
        std::ifstream f("txt.txt");
        std::cout << std::vector<char>(std::istream_iterator<char>(f), std::istream_iterator<char>())[10];
    }
    

    Und zwei Zeilen für deine Spalte.

    Ich denke dass a b c d ... Platzhalter sind. Von daher ist die Lösung ungenügend. (Und mit scanf wäre's immer noch schöner !)



  • Sone schrieb:

    Beispiel 2: Gib einen Integer i in Binärformat aus. 1 Zeile Java, >40 Zeilen C++.

    Eine, bzw. zwei Zeilen inklusive Deklaration:

    #include <iostream>
    #include <bitset>
    
    int main()
    {
        std::cout << std::bitset<sizeof(int) * CHAR_BIT>(54);
    }
    

    Und jetzt bitte ohne die führenden Nullen.

    Sone schrieb:

    #include <iostream>
    #include <iterator>
    #include <fstream>
    #include <vector>
    
    int main()
    {
        std::ifstream f("txt.txt");
        std::cout << std::vector<char>(std::istream_iterator<char>(f), std::istream_iterator<char>())[10];
    }
    

    Und zwei Zeilen für deine Spalte.

    Und jetzt bitte ohne die Annahme, dass eine Spalte 1 Zeichen gross ist.

    Ja, das sind Spielzeugbeispiele. Aber der Code von Sone zeigt, wie unflexibel und unallgemein C++ doch ist. Die Ironie will, dass in solchen Fällen auf scanf zurückgegriffen werden muss.



  • Darf ich Boost benutzen?
    Edit :Wahrscheinlich nicht, oder?



  • Die Ironie will, dass in solchen Fällen auf scanf zurückgegriffen werden muss.

    Na und? scanf ist auch C++. Ich benutze scanf gerne und oft in meinen sonst recht idiomatischen C++ Programmen.

    Ansonsten könnte man sicher auch einen Einzeiler mit den C++11 Regexfunktionen bauen ... von denen habe ich nur absolut keine Ahnung, weil der GCC-Support bei meinem Versuch nicht existent war, keine Ahnung wie es jetzt aussieht.

    Wie sieht eigentlich der Java-Einzeiler aus?



  • dto-depp schrieb:

    ein getrenntes Schichtenmodell ist also eine um DI herumgestrickte Anforderung... ok ich denke damit können wir die Diskussion bereits beenden, da nun klar ist, wie deine obigen Postings zu bewerten sind. 🤡 danke.

    Du hast viel mehr Anforderungen gebastelt, die alle zusammengenommen erst DI nahelegen. Aber auch nur auf den ersten Blick. Ich denke, wer sich schon im Nick schon als Depp vorstellt, wie groß icht die Wahrscheinlichkeit, daß er kein Troll ist?



  • Sone schrieb:

    Darf ich Boost benutzen?
    Edit :Wahrscheinlich nicht, oder?

    Du darfst alles.

    Aber denke darüber nach, was es bedeutet, wenn man in C++ für triviale Aufgaben externe Bibliotheken benötigt.

    Die Einzeiler in Java sind übrigens

    System.out.println(Integer.toBinaryString(1234));
    System.out.println(Integer.parseInt("a;b;c;d;e;f;5;g;h".split(";")[6]));
    

    Die idiomatische Binary-Lösung für C++ habe ich schonmal hier gepostet (http://ideone.com/E5Fvnf), wie viele C++-Programmierer verstehen die wohl?



  • Kellerautomat schrieb:

    wtf 😃
    denk da nochmal drueber nach 🤡

    Das lustige ist, dass da sogar Klammern fehlen, aber es trotzdem funktioniert. 😃



  • busibusi schrieb:

    Die idiomatische Binary-Lösung für C++ habe ich schonmal hier gepostet (http://ideone.com/E5Fvnf), wie viele C++-Programmierer verstehen die wohl?

    Amn der Verwendung von endl statt '\n' erkenne ich, daß der Autor auch seine Probleme hat.

    Inwiefern ist die Lösung "idiomatisch"? Ist es gut, "idiomatisch" zu sein? Warum?

    Warum eigentlich
    std::cout << bin << 18446744073709551615ull << '\n';
    statt
    std::cout << bin(18446744073709551615ull) << '\n';
    ?



  • volkard schrieb:

    Du hast viel mehr Anforderungen gebastelt, die alle zusammengenommen erst DI nahelegen. Aber auch nur auf den ersten Blick. Ich denke, wer sich schon im Nick schon als Depp vorstellt, wie groß icht die Wahrscheinlichkeit, daß er kein Troll ist?

    das ist eine abkürzung für Definitiv Erfahrener ProjektProgrammierer.
    meine frage ist wirklich ernstgemeint. du kannst auch gerne von meinem beispiel etwas weggehen, letztlich werden komplexe schichtenarchitekturen auch mit c++ realisiert. letztlich hat man auch immer abhängigkeiten zwischen den schichten. also was wäre ein alternativer, C++-nativer weg, der DI überflüssig macht (du hast ja gesagt, vernünftige sprachen brauchen keine DI?), respektive was macht DI schlecht? deine postings legen ja nahe, dass du von DI nicht viel hälst.

    ich freue mich auf deine antwort.



  • dto-depp schrieb:

    letztlich hat man auch immer abhängigkeiten zwischen den schichten. also was wäre ein alternativer, C++-nativer weg

    Würde mich auch interessieren, davon abgesehen das es viele Wege gibt um DI zu implementieren (und viele DI verwenden, ohne sich dessen bewusst zu sein). Oder anders herum: Was spricht gegen DI, wenn man damit Probleme besser gelöst bekommt. Einfachstes Beispiel (wobei dies wirklich nur ein winziger Aspekt ist): Wie würde man wirklich sauber getrennte Unittests ohne jegliche Form der Indirektion hinbekommen?



  • 1.) Mein Design/Programmierstil ist nicht auf gute Debugmoeglichkeiten ausgelegt.
    2.) Mein Design ist nicht auf Testen ausgelegt.

    Mein Design ist problembezogen mit etwas Spielraum. Durch einfache Richtlinien wie Entkoppeln ist die Software meist gut zu testen und zu debuggen. Aber trotzdem wuerde ich nie mit testen/debuggen argumentieren. Es sind nur Nebenerscheinungen.

    Was mich an DI stoert ist, dass selbst ein Parameter im Konstruktor schon als DI gilt, es alles und nichts sein kann. Toll dass die OOP-Leute dafuer ein Begriff gefunden haben, was gesunder Menschenverstand von eh her macht. Genau wie SOA - Same old Architekture. Es ist einfach der alte Scheiss nur mit neuen Buzzwords. Deswegen spricht nix gegen DI, weils alle vorher schon so gemacht haben, es nur nicht benennen konnten.



  • volkard:
    Wenn Du nicht mit Unregistrierten diskutieren möchtest, nehme ich die Frage gerne auf:

    Mal ein Anwendungsbeispiel:
    Habe hier eine Domänenschicht, also einen komplexen Klassenverband, welcher meine Anwendungsdomäne abbildet.
    Darauf basierend eine Prozessschicht, welche Use-Cases auf Basis der Domäne implementiert.
    Diese wiederrum nutzt eine Persistenzschicht.
    Ganz oben gibt es Webdienste, welche auf Basis der Prozessschicht Anwendungsdienste bereitstellen.
    Querschnittsfunktionen (Logging, Transformationen, Sicherheitsaspekte etc.) implementiere ich in einer Infrastrukturschicht, die jede andere Schicht verwenden darf.

    Mit DI kann ich nun automatisch hierarchisch Abhängigkeiten in den jeweiligen Konstruktor binden lassen, d.h.:
    Die Persistenzschicht erhält über den Konstruktor automatisch Kontextinformationen (Datenbankumgebung etc.), der Prozessschicht werden automatisch die Persistenzschicht-Abhängigkeiten zugewiesen, den wichtigen Klassen wird per Konstruktor eine Protokollierungsmöglichkeit gegeben usw.

    Bei Modultests kann ich die ganzen Abhängigkeiten dann sehr einfach durch Mock-Objekte ersetzen, weil ich sie ja einfach im Konstruktor übergeben kann. Oder ich lass wieder alles per DI machen und ändere nur meine Konfiguration ab.

    Welche Vorteile bietet C++, welche mir gegenüber DI diese Dinge vereinfachen? Meines Erachtens könnten sie kaum perfekter gelöst werden.

    Da gibt es eine Menge Schichten, die für Geschäftsanwendungen mit Datenbankzugriff auch Sinn ergeben. Das Architekturmodell halte ich nicht für java-spezifisch.

    Die zwei Fragen verbleiben also:

    1. Wie würde man das in C++ lösen? Überall alle Referenzen übergeben wäre mein Weg, ich verstehe aber, dass DI von Java das vereinfacht (zumal wenn man Objekterzeugung und Referenzübergabe trennt, sodass man noch Setter einbauen muss *schauder* Ist zum Beispiel nötig, wenn ich ein UI-Framework wie QT nehme, bei dem automatisch ein bestimmter ctor aufgerufen wird)
    2. Angenommen, Du sagst, dieses Schichtenmodell ist java-spezifisch. Wie würdest Du eine entsprechende Anwendung dann in C++ aufbauen?


  • Naja für DI gibt es vermutlich keine scharfe Begriffsdefinition. Allerdings zählt dazu schon etwas mehr als Parameterübergabe im Konstruktor, zumindest an dem, was gängige DI Frameworks so können.

    z.B. die zentrale Definition und Verwaltung von Lebenszyklen. Wenn ich ein ORM nutze und dafür eine ORM-Session in einer Webapplikation pro Request nutzen will, sodass ich während der Requestverarbeitung mit Transaktionen hantieren kann ohne mir groß über den jeweiligen Aufrufkontext Gedanken machen zu müssen, kann ich z.B. in Castle Windsor (DI-Framework) einfach den Lebenszyklus der ORM-Abhängigketein auf "Per Request" setzen. Mir wird eine deklarative Verwaltung meiner Abhängigkeiten gestattet und das nimmt viel Arbeit ab.

    Ich würde ein paar Klassen mit Abhängigkeitsübergabe im Konstruktor nicht als DI bezeichnen und wüsste auch sonst niemanden, der das tut...



  • Ja, DI kann mehr, das habe ich mittlerweile auch verstanden. Aber das Pendant in C++ dazu wäre eben bisher nur die Referenzübergabe. Und da hat Java (verstanden als Sprache + Bibliotheken) eben einen Vorteil - den volkard aber verneint, sodass mich interessieren würde, wie er das begründet.



  • @Eisflamme: Sorry, das Posting war für knivil...



  • Leider ist meine Erfahrung mit Webapplikationen oder Datenbanken nicht existent. Aber mit embedded, KI und wissenschaftlichem Rechnen kann ich dienen. GUIs kriege ich auch hin.



  • ich bin auch in den eher theoretischen bereichen der informatik wie mustererkennung oder algorithmische geometrie zuhause, würde aber dennoch nicht die mir aus der praxis unbekannten dinge als "same old story" abstempeln...


Anmelden zum Antworten