Unterschiede zu C++ für Umsteiger von Java



  • net schrieb:

    ...
    in java ist das threading aber schon eingebaut. C++ hat auch nix, was dem java keyword 'synchronized' entsprechen würde.
    ...
    * c++ hat keine 'reflection api' (ich weiss, das ist nur was für leute mit schlechtem programmierstil) 😉
    * c++ unterstützt von haus aus keine webtechnologien (wie java mit servlets, applets, jsp, xml, soap...)

    Das fällt alles unter

    Simon2 schrieb:

    ...

    ...

    • Während in Java so ziemlich alles, was "J" im Namen hat, in den Standard aufgenommen hat, sind im C++-Standard nur recht wenige (dafür aber sehr allgemeingültige und wichtige) Dinge festgelegt.

    ...

    "synchronizied" nutzt Dir in enterprise-Umgebungen ebenso wenig wie "von Haus aus webtechnology" und "reflection API" oder die "java-Standard-GUI"...

    Da darfst Du mit dem Zeug dem Framework sowieso nicht "reinpfuschen" ... da ist es einfacher, alles, was der Standard hergibt, verwenden zu können (wie in C++) als nur Teile davon.
    Wie gesagt: C++ ist ein "schmaler Standard" (aber dafür ein sehr stabiler) - für alles, was man in Java macht, gibt's auch C++-Libs.

    Gruß,

    Simon2.



  • der Umsteiger schrieb:

    ...
    Vllt hat ja noch jemand Tipps wie tntnet, was ich mir so abgewöhnen bzw angewöhnen sollte....

    Meine ersten Tipps:

    • Beim Design auf "Zuständigkeiten" achten ! Wem "gehört" ein Objekt und wer soll es (schreibend ? lesend ?) nutzen ? Das ist (nach meiner Erfahrung) für Java-Programmierer etwas ungewohnter und in C++ hast Du einige Möglichkeiten, das schon im Design sinnvoll festzuzurren.
    • Wenn Du "new" tippen willst: Stopp !!! Erst zweimal nachdenken, ob es wirklich notwendig ist - braucht man eher selten in C++.
    • Wenn Du casten willst: Stopp !!! Erst viermal nachdenken, ob es wirklich notwendig ist - braucht man noch viel seltener in C++.
    • Gleich zu Beginn mit STL anfangen (std::vector, std::string, ....).
    • Was fachlich eine Funktion ist, soll auch technisch eine sein; man muss nicht immer alles als Objekt entwerfen - oftmals ist es sinnlos.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Wie gesagt: C++ ist ein "schmaler Standard" (aber dafür ein sehr stabiler) - für alles, was man in Java macht, gibt's auch C++-Libs.

    hast ja recht, aber man muss sich in C++ alles mühsam zusammensuchen und jeder kocht sein eigenes süppchen. in der hinsicht ist java einfach benutzerfreundlicher...



  • net schrieb:

    ...in der hinsicht ist java einfach benutzerfreundlicher...

    Finde ich eigentlich nicht.
    In Java sucht man genauso lange .. nur, dass eben alles "Standard" heißt - aber wenn ich eine bestimmte Funktionalität suche, muß ich mich ebenso durch Libs wühlen. ...
    Damit will ich nicht Java schlecht machen, sondern nur seinen vermeintlichen Vorteil relativieren.

    "Benutzerfreundlicher" ist Java IMO deutlich für Programmieranfänger ... man kommt einfach schneller aus den Startlöchern (vA als in C aber auch als in C++).

    Gruß,

    Simon2.



  • Naja, Java ist auch nur in der Basis nutzerfreundlich. Hier bei unserem Kunden ist es z.B. erforderlich, sich mit der Eclipse Platform auszukennen. Eclipse Platform ist auch ein "externes" Framework welches ich mir "suchen" muß. Und jeder der Java kann, muß nicht zwingend OSGI und Eclipse-Plugins kennen. Immerhin gibts ganze Bücher über dieses Framework! Irgendwie und irgendwann muß man immer auf externe Libs zugreifen. Ich kann nicht immer mit der Basis auskommen.

    Und synchronized ist zwar ein Java-Schlüsselwort aber so flexibel ist es dann doch nicht.

    Sicherlich, in C++ muß ich mir vieles mehr zusammen suchen, aber im Prinzip ist es egal. Weil den Endanwender meines Systems/Programms interessiert das nicht. Schlimm wäre es, wenn dadurch der Endanwender Probleme bekommt. Ich als Entwickler suche mir das einmal zusammen und programmiere. Wenn ich in einem Team bin, stelle ich eh alles über einen SCM wie Subversion oder CVS bereit. Also hat im Team eh nur einer die Aufgabe.

    Ich z.B. habe mir Boost eingerichtet. Das hab ich einmal gemacht und mein IDE kennt sie jetzt. Und, war das jetzt so schlimm?



  • Artchi schrieb:

    Naja, Java ist auch nur in der Basis nutzerfreundlich....

    Genau das meinte ich mit "für Anfänger" und "in enterprise environments relativiert sich das sehr schnell". 😃

    Gruß,

    Simon2.



  • der Umsteiger schrieb:

    Super, genau so hatte ich mir das vorgestellt. 👍

    Vllt hat ja noch jemand Tipps wie tntnet, was ich mir so abgewöhnen bzw angewöhnen sollte.

    Schon mal danke an alle, habt mir auf jeden Fall gute Tipps zur Orientierung gegeben 🙂

    - vermeide C-Style Coding, stattdessen:
    - benutze std::string und std::wstring
    - benutze std::vector und std::list
    - seit April gibts auch std::tr1:array
    - benutze ausgiebigg die Standard-Bibliothek, sie ist sehr flexibel und mächtig!
    - vermeide Makros, da sie fehleranfällig sind, C++ hat gute Ersatzkonstrukte
    - später würde ich noch Boost (eine Library Sammlung) benutzen



  • ok, mir haben die tipps auch was gebracht,
    wenn man aber von java kommt, sollte man oop programieren gewohnt sein(und das ist in c++ ja auch in ordnung).
    Da frag ich mich grad wie man das ohne zeiger machen soll?
    nur mit referenzen und stack objekten?
    Dazu braucht man doch schon nen zeiger, sonst kann man doch keine virtuellen funktionen aufrufen, oder?
    bin noch nicht wirklich erfahren, aber das hat mich jetzt schon verunsichert und verwirrt.
    Kommt ja auch wie schon gesagt auf die aufgabenstellung an.
    Wenn ich da auf dem holzweg bin muß ich das nun erfahren,
    gruß



  • Ja, das habe ich auch sehr lange geglaubt, das ausschliesslich über Pointer virtuelle bzw. polymorphe Aufrufe funktionieren. Ich bin auch der Meinung, das ich das aus dem Stroustrup-Buch habe. 🙄 Müsste ich mich aber nochmal vergewissern, das es in dem Buch drin stand.

    Aber das kannst du ja leicht selbst mal ausprobieren, um dich zu überzeugen. Hier mal mein Beispiel:

    #include <iostream>
    
    class base
    {
      public:
    	virtual void foo()
    	{ 
    		std::cout << "base::foo()" << std::endl;
    	}
    };
    
    class special : public base
    {
      public:
        virtual void foo()
    	{
    		std::cout << "special::foo()" << std::endl;
    	}
    };
    
    void bar(base &b)
    {
       b.foo(); // polymorpher Aufruf (late binding)
    }
    
    int main()
    {
        base b;
    	bar(b);
    
    	special s;
    	bar(s);
    }
    

    Ausgabe:

    base::foo()
    special::foo()
    

    Kein einziger Pointer und kein einziges new benutzt.



  • das war sehr überzeugend. danke, muß wohl ernsthaft umdenken.
    gruß



  • net schrieb:

    ist halt wie mit allem in C++ - man braucht externe libs.
    in java ist das threading aber schon eingebaut. C++ hat auch nix, was dem java keyword 'synchronized' entsprechen würde.

    In Java muß alles eingebaut sein, da man sonst nicht machen kann. In C++ steht die Betriebssystem-API zur Verfügung. Da braucht man nicht unbedingt externe libs. Und ein synchronized ist nicht so schwer über eine Mutex- und eine Guard-Klasse nachzubauen.

    tntnet schrieb:

    "instanceof" ist in der Regel schlechter Programmierstil.

    welch kühne behauptung...

    Bei einem sauberen Design ist das selten notwendig. Bis Java 1.4 war es unbedingt notwendig, um einigermassen sicher mit Containern umzugehen. In einem sauberen Design verwendet man virtuelle Methoden. Es gibt sicher Situationen, wo das doch notwendig und sinnvoll ist. Aber dafür gibt es in C++ eben ein äquivalent.

    noch was:
    * c++ hat keine 'reflection api' (ich weiss, das ist nur was für leute mit schlechtem programmierstil) 😉
    * c++ unterstützt von haus aus keine webtechnologien (wie java mit servlets, applets, jsp, xml, soap...)

    Die 'reflection api' kann durchaus als Argument für Java gelten. Aber wenn Du das in die Abteilung "schlechtem programmierstil" steckst, dann will ich Dir nicht wiedersprechen 😉 .

    Java unterstützt auch von Haus aus keine Webtechnologie. Das kommt erst mit der erweiterten API J2EE (und in C++ erst mit http://www.tntnet.org/ 😉 ). Ist ein schwaches Argument. Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java.

    Tntnet



  • Artchi schrieb:

    ...Hier mal mein Beispiel:...
    Kein einziger Pointer und kein einziges new benutzt.

    Sehr schönes Beispiel !!! 👍
    Und eigentlich nicht anders als der Javacode, der dasselbe macht (nur 2 news weniger und ein & mehr).

    Das ist IMO ein (in der Javagemeinde gut gepflegtes) Gerücht, dass man beim Umstieg auf C++ nur noch "mit Sternchen" programmiert und überhaupt nicht mehr durchsteigt.

    @QarateKid: Wenn Du noch was wirklich Nettes in C++ machen willst: Schau Dir mal die STL-Container und -algorithmen an ! Die machen wirklich Spaß - und das kennst Du von Java noch nicht. 😃

    Gruß,

    Simon2.



  • tntnet schrieb:

    ...Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java....

    Da bin ich skeptisch ... ein "weiter Standardbegriff" ist oft auch ein "weicher Standardbegriff".
    Auf jeden Fall sehe ich da kein starkes Argument für Java drin (und schon gar kein "großer Vorteil").

    Gruß,

    Simon2.



  • Simon2 schrieb:

    tntnet schrieb:

    ...Du hast natürlich Recht, daß in Java vieles standardisiert ist. Das ist der grosse Vorteil von Java....

    Da bin ich skeptisch ... ein "weiter Standardbegriff" ist oft auch ein "weicher Standardbegriff".
    Auf jeden Fall sehe ich da kein starkes Argument für Java drin (und schon gar kein "großer Vorteil").

    Gruß,

    Simon2.

    Ich denke schon, daß das ein Problem ist. Viele sagen halt: "In C++ muß ich alles selber machen oder eine externe Bibliothek bemühen". Und das ist gar nicht so falsch. Wenn ich eine JRE installiert habe, sind viele Standardaufgaben bereits installiert. Mit C++ handele ich mir schon unter Umständen viele Abhängigkeiten von externen Bibliotheken ein, was die Sache schwierig macht.

    Java als Sprache finde ich bescheiden. Da ist C++ weitaus besser. Die Infrastruktur ist es, was die Java-Plattform ausmacht. Zumindest wenn man sich auf die Java-Insel beschränkt.

    Oh Gott - jetzt verteidige ich schon Java. Ich sollte vielleicht noch ergänzen, daß ich C++ für die beste Programmiersprache der Welt halte und nie mit Java tauschen wollte. Nur um keine Missverständnisse aufkommen zu lassen 😃

    Tntnet



  • Also dieses Argument mit den Abhängigkeiten zu externen Libs habe ich bisher nie verstanden. Kann mir bitte jemand sagen, was daran schlecht sein soll? Bitte nicht sowas wie "Ich muß die Lib in die IDE-/Projekt-Settings eintragen, das kostet mich immerhin 10 Sekunden meines wertvollen Lebens".

    Ich habe hier schon diverse Java-Projekte für unseren Kunden gemacht. Ich habe noch NIE am Projektanfang nur mit der Java-Basis angefangen. Das erste was ich bei jedem Projekt mache, ist mir erstmal meine Lieblings-Javalibs und ungewollt nötigen Libs zusammen zu suchen und diese in meinem Projektsettings in Eclipse einzurichten, damit ich vernünftig arbeiten kann. Keiner von den über 50 Java Projekten am Standort kommt mit der Basis aus. Wir benutzen sogar DLLs für unsere Java-Programme, weil wir z.B. PKI-Karten über Java ansteuern müssen.

    Wir ersetzen sogar Basis-Libs durch fremde Libs, weil die uns gesonnener sind. Z.B. bietet die Java Runtime Logging-Klassen an. Wir knallen immer noch zus. Apaches Commons Logging mit log4j dazu. Schon mal eine zus. Abhängigkeit, die eigentlich nicht nötig wäre. Keiner hier in den Projekten fragt "Warum macht ihr eine Abhängigkeit zu einer externen Lib?" Niemand im Java-Umfeld kommt auf diese Idee. Aber in C++ ist es komischerweise schlecht, wenn ich z.B. sage "Ich brauche für Netzwerk die asio-Library."

    Also, was ist schlimm daran, wenn ich eine Lib für mein C++ brauche?



  • ich glaube in Java gibt es viel weniger Probleme Libraries einzubauen. In C++ muss man die Libraries doch oft noch durchkompilieren. Bei Java reicht ein einfaches import.



  • moep manche verwechseln bei ihren vergleichen die eingentliche sprache(Syntax, Schlüsselworter) mit einem eventuell vorhandenen Framework.

    Java an sich (ich meine nicht das Framework JSDK/JRE) kennt kein Threading oder Reflection.
    Nur durch das vorhandene Framwork, was bei java ein muss ist, damit ein java-programm überhaupt auf einem System laufen kann, bietet diese zusätzlichen features.

    ein besserer Vergleich wäre, wenn man bei c++ zumindestens die stl+boost dazunimmt und bei java das JDK/JRE-framework.

    Und schon sieht hier der Vergleich schon etwas anders aus.
    z.b. Threading werden von beiden unterstüzt.



  • tntnet schrieb:

    ...Wenn ich eine JRE installiert habe, sind viele Standardaufgaben bereits installiert...

    Gilt genauso, wenn ich mir ein Visual Studio C++ installiere....
    Es stimmt: Viele führen dieses Argument im Munde ... aber nur wenige von denen wissen, wovon sie da reden. 😉
    Wenn das ein Problem ist, dann ein Imageproblem - das vermutlich seinen Ursprung in der Entstehungsgeschichte von Java hat. Diese Argumente (auch "Java ist sicher/portabel/keine Zeiger/...") waren samt und sonders dazu da, die Existenz von Java (mit einer sehr C++-ähnlichen Syntax/Semantik) in einer Welt, in der es bereits C++ gab, zu legitimieren. Heute werden sie immer noch wiedergekaut, obwohl schon lange klar ist, dass sie nicht stichhaltig oder sehr viel irrelevanter sind.

    "Java ist ein Produkt mit einer C++-ähnlichen Konfigurationssprache" 😉
    (mit allen Stärken, die ein Produkt (gegenüber einer "Sprache") hat ... und allen Nachteilen)

    Gruß,

    Simon2.



  • libeinbinder schrieb:

    ich glaube in Java gibt es viel weniger Probleme Libraries einzubauen. In C++ muss man die Libraries doch oft noch durchkompilieren. Bei Java reicht ein einfaches import.

    Hä ?
    Wieso das ?
    Also ich habe immer fertig kompilierte Libs verwendet.
    (BTW: ein Recompile einer c++-lib ist immer noch schneller&einfacher als die Installation eines passenden JREs)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    "Java ist ein Produkt mit einer C++-ähnlichen Konfigurationssprache" 😉
    (mit allen Stärken, die ein Produkt (gegenüber einer "Sprache") hat ... und allen Nachteilen)

    So würde ich das nicht ausdrücken. Java und C++ sind beides (im Kern) Programmiersprachen und haben historisch bedingt eine ähnliche Syntax. Aber damit hören die Gemeinsamkeiten auch schon fast auf.


Anmelden zum Antworten