Java...
-
dto-depp schrieb:
@volkard: Was spricht gegen Dependency Injection (das meintest du doch mit DI?)?
Würde mich auch interessieren, bislang sehe ich hier eher viele Vorteile (alleine schon die bessere Testbarkeit wäre für mich ein guter Grund, selbst wenn dies nur ein kleiner Aspekt ist).
-
boost::shared_mutex, tbb
Nun, wir koennen gern alle moegliche und unmoeglichen Bibliotheken aufyaehlen, jedoch sind diese bei Java von Haus aus dabei. Bei Java ist einfach dabei, es gibt sie und alle nutzen die gleiche.
Zu Intels TBB: Deckt alles ab, was einfach zu parallelisieren ist.
Anderes Feld: IPC wie Netzwerk und Sockets. Oder mach eine einfache GUI ... es ist einfach da. Bei C++: Welches Widget-System solls denn sein, warum haben die auch Threads, ich will doch nur Fenster, etc ...
-
dto-depp schrieb:
@volkard: Was spricht gegen Dependency Injection (das meintest du doch mit DI?)?
Brauchbare Sprachen brauchen sowas nicht.
-
Was hat C++, was Java in der Hinsicht unbrauchbarer macht?
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.
-
dto-depp schrieb:
Welche Vorteile bietet C++, welche mir gegenüber DI diese Dinge vereinfachen? Meines Erachtens könnten sie kaum perfekter gelöst werden.
Ja, das ist wohl Geschmackssache oder Ansichtssache. Ich find DI auch super, vor allem wie es in EJB 3 oder Spring umgesetzt ist. Wenn man an entsprechenden Anwendungen nicht gearbeitet hat, mag man die Vorteile nicht verstehen. Und DI erzeugt ja keinen Boilerplate, also nicht mehr Code. Was zwar völlig unwichtig ist, aber Thema dieses Threads war.
Das mit den DTOs war jetzt nicht unbedingt so negativ gemeint. Habe ich gesagt, dass ich viel Code schlecht finde und um jeden Preis jede Zeile sparen will? Was mich hierbei aber tatsächlich etwas stört, dass man ab und zu gezwungen wird, DTOs zu schreiben, auch wenn mand as nicht will. Ich kann mich jetzt nicht genau daran erinnern, aber ich hatte vor paar Jahren einen Fall, wo ich keine Lösung gefunden habe, wie ich einfach direkt meine Business Objekte verwenden konnte und gezwungen war, für alles nochmal DTO Klassen zu schreiben. Das hat mich damals ziemlich genervt.
@Sone: ja, in C++ gibts keine Reflection. Deswegen kann man in Java ja auch teilweise kürzeren Code schreiben, darum gings dir doch. Damit kriegt man vieles praktisch umsonst, ohne dafür irgendwas programmieren zu müssen. Das kann bei Geschäftsanwendungen dann schon wieder die Hälfte vom Boilerplate sparen, den man in C++ schreiben müsste und man konzentriert sich auf die eigentliche Business Logik.
-
Rein von der Sprache aus gesehen ist Java C++ nicht sonderlich überlegen, aber in der Praxis leidet Java nicht unter Programmierern mit Performancewahn (=besserer Code) und profitiert stark von der Standardbibliothek.
Beispiel 1: Gegeben eine Zeile aus einer CSV-Datei, "a;b;c;d;e;5;g", was ist der Zahlenwert der 7. Spalte?
1 Zeile Java, >4 Zeilen C++.Beispiel 2: Gib einen Integer i in Binärformat aus. 1 Zeile Java, >40 Zeilen C++.
Oder nehmen wir eine einfache Aufgabe: Kopiere ein Verzeichnis rekursiv. C++ kann das schlicht nicht ohne Zusatzbibliotheken.
Oder komprimiere ein Verzeichnis als Zip. Kann C++ nicht.Das läuft daraus hinaus, dass der C++-Programmierer einige Zeit damit beschäftigt ist, externe Bibliotheken einzubinden, aktuell zu halten, sich in die einzulesen, die der Kollege verwendet hat, Bibliotheken zu ersetzen und Code umzuschreiben weil sie nicht auf Solaris laufen, ...
Die Gegenrichtung ist, alles selber zu implementieren. Regex? Brauch ich nicht, ich schreib den Parser selber. Führt natürlich zu vielen unnötigen Zeilen, vielen Fehlern und langsamen Code.
Insgesamt ist man deshalb in Java produktiver.
-
busibusi schrieb:
externe Bibliotheken einzubinden, aktuell zu halten
Das wär eigentlich alles gar kein Problem wenn es vernünftige Dependency Management-/Buildsysteme für C++ geben tät, a la Maven oder Gradle. Danach suchste aber vergebens...
-
busibusi schrieb:
Beispiel 2: Gib einen Integer i in Binärformat aus. 1 Zeile Java, >40 Zeilen C++.
#include <iostream> int main(){ for(int i=0;i<20;++i){ unsigned n=i; char d[12],*e=d+12; do *--e='0'+n%2; while(n/=2); std::cout.write(e,12-(e-d))<<'\n'; } }
Wie sieht das in Java aus, also ein ganzen Programm, damit ich es auch testen kann?
Nebenbei, wir wissen doch beide, daß Java längst tot ist. *hihi*
-
Eine Zeile? Kein Ding.
#include <iostream> template <typename T> void print_binary(std::ostream& stream, T i) { i && (print_binary(stream, i / 2), stream << i % 2 ? '1' : '0'); } int main() { print_binary(std::cout, 77); }
-
cooky451 schrieb:
stream << i % 2 ? '1' : '0');
wtf
denk da nochmal drueber nach
-
In Java die Fibonaccizahlen ausgeben, sollte mit 10 Zeilen leicht gehen. In C++ brauchen erfahrene Programmierer schon mal 40 oder mehr Zeilen
http://www.c-plusplus.net/forum/311250
-
allweare schrieb:
In Java die Fibonaccizahlen ausgeben, sollte mit 10 Zeilen leicht gehen. In C++ brauchen erfahrene Programmierer schon mal 40 oder mehr Zeilen
http://www.c-plusplus.net/forum/311250
-
volkard schrieb:
Nebenbei, wir wissen doch beide, daß Java längst tot ist. *hihi*
ich bin kein riesen java-fan, aber: schwachsinn!
mach mal lieber hin, ich will meine fragen an dich von oben beantwortet sehen (mit der DI).
-
dto-depp schrieb:
mach mal lieber hin, ich will meine fragen an dich von oben beantwortet sehen (mit der DI).
Ich merke schon, daß Du die Anforderungen um DI herumgestrickt hast, am Ende also fragst, wie macht man DI ohne DI?
Ich verzettele mich ungern in eine ernsthafte Diskussion mit Unregistrierten. Erst recht nicht in einem so klaren Trollthread.
-
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.
-
Beispiel 1: Gegeben eine Zeile aus einer CSV-Datei, "a;b;c;d;e;5;g", was ist der Zahlenwert der 7. Spalte?
1 Zeile Java, >4 Zeilen C++.Beispiel 2: Gib einen Integer i in Binärformat aus. 1 Zeile Java, >40 Zeilen C++.
Wenn ich in der Schule bin, also in circa einer Stunde, mach ich dir die Hölle heiß.
-
Sone schrieb:
Wenn ich in der Schule bin, also in circa einer Stunde, mach ich dir die Hölle heiß.
LOL, Alter! Lern lieber was, damit was aus dir wird.
-
cooky451 schrieb:
Eine Zeile? Kein Ding.
#include <iostream> template <typename T> void print_binary(std::ostream& stream, T i) { i && (print_binary(stream, i / 2), stream << i % 2 ? '1' : '0'); } int main() { print_binary(std::cout, 77); }
template <typename T> void print_binary(std::ostream& stream, T i) { i && (print_binary(stream, i >> 1), stream << ('0' + i & 1)); }
Also wennschon, dann ohne trinären operator. (Annahme: '0' + 1 == '1')
-
Beispiel 1: Gegeben eine Zeile aus einer CSV-Datei, "a;b;c;d;e;5;g", was ist der Zahlenwert der 7. Spalte?
1 Zeile Java, >4 Zeilen C++.k.
#include <iostream> #include <cstdio> int main() { int v; std::cout << (std::sscanf("a;b;c;d;e;5;g", "%*[^;];%*[^;];%*[^;];%*[^;];%*[^;];%d", &v), v) << std::endl; }
-
Nehmen wir doch ein einfaches Beispiel: das allseits bekannte Hello World. In Java:
class foo { public static void main(String [] args) { System.out.println("Hello world!"); } }
und in C++:
#include <iostream> int main(int argc, char* argv[]) { std::cout << "Hello world!" << std::endl; }
Effektiv sind das 6 Zeilen in C++ und 7 Zeilen in Java. Habe ich damit bewiesen, dass C++ um 15% besser ist? Ich denke nicht.
Betrachten wir mal die Laufzeit. Ich messe einfach mal mit time unter Unix. C++ benötigt 0,004 Sekunden und das Java-Programm 0,272 Sekunden. Also ist C++ um den Faktor 68 schneller!!!
Das sind Aussagen auf dem Niveau von "Java... 4 mal kürzerer Code". Für das Marketing gut aber fernab der Realität.