Java: Immer noch keine echten Templates?



  • Aber selbst bei mehreren Klassen muss es noch lange kein OO sein sondern kann
    auch nur ein objektbasierter Ansatz sein.

    Und ob jetzt die Main Funktion innerhalb einer Klasse aufgerufen wird und danach
    alles prozedural geschieht oder die Main Funktion direkt aufgerufen wird wie in
    c++ macht ja nicht den Unterschied.



  • 4 Leerzeichen schrieb:

    Aber meine Erfahrung zeigt mir, dass Werkzeuge oft dann besonders verbreitet sind, wenn sie nicht so "schwer" sind. C++ ist zwar viel ausgereifter, viel
    performanter und bietet tausendmal mehr Möglichkeiten (Template-Metaprogramming) als Java, trotzdem findet Java vor allem bei den nicht ganz so begabten "Entwicklern" eine weite Verbreitung, da man sich dann trotzdem wie ein "richtiger" Programmiere fühlen kann, obwohl man gar nicht zu wirklich richtiger Programmierung in Lage ist.

    Programmiere ein mit kommerziellen Produkten vergleichbares MMORPG in Java und eins in C++, und dann sag' mir daß es mit Java nicht "schwer" wäre... 🤡 😉
    *vonvornhereinnichtssinnvollesbeisteuernwollt'*



  • shade:

    Jo, ich habs ja probiert. Aber jedesmal wenn ich versuche etwas in Java zu machen dreh ich durch...

    wieso dieses? wenn du aus der C++ ecke kommst dann solltest du mal keine probleme mit der sprache haben? oder an was haengt es?

    Java ist nicht perfekt OO - das faengt schon bei den datentypen an.
    ruby is meiner meinung nach vollkommen irrelevant in der praxis. es ist gut um OO zu programmieren aber in der praxis nicht anwendbar da einfach unperformant. zumindest ist das bei meinen evaluierungen rausgekommen.

    C# an sich ist ne feine sache. ein verbessertes java von der struktur her - meine meinung. das .net framework bietet auch extrem viel.

    also backends schreibe ich meistens auf J2EE basis. zumindest wenn ich massiv leistung brauche.

    auf jeden Fall. Ich will Java hier nicht schlecht machen. Ich will nur nicht dass Java besser als c++ dasteht

    wie ich bereits vorher gesagt habe sind es verschiedene sprachen und haben verschiedene anwendungsgebiete

    dementsprechend sind sie fuer mich gar nicht in dem ausmasse vergleichbar das ich mir anmassen wuerde zu sagen eines der 2 ist besser

    ich wuerde eher sagen klassen richtig zu verwenden - das ist OOP

    Sir:
    richtig OO ist halt nicht immer einfach - und viele durchschauen es nicht - man braucht halt viel erfahrung


  • Mod

    4 Leerzeichen schrieb:

    C++ ist zwar viel ausgereifter

    😉
    <provozier>
    Soll das ein Witz sein? C++ und ausgereift? C++ mit seiner Standardbibliothek ist alles andere als ausgereift. Aus meiner Sicht wurden bei C++ einfach möglichst viele Features zusammengewürfelt ohne, dass dahinter ein großartiges Gesamtkonzept steht. Es ist kein Wunder, dass man damit ein Programmiersprachen-Monster geschaffen hat, das nahezu keiner in seiner Gesamtheit beherrschen kann. Ich habe hier schon oft Leute gesehen, die praktisch als "C++ Gurus" angesehen werden, die aber selbst behaupten, dass sie die Sprache noch längst nicht in ihrer Gesamtheit beherrschen bzw. ausnutzen. Mit der Standardbibliothek ist es genau das Gleiche. Schon in "The C++ Standard Library" von Nicolai M. Josuttis steht:

    The standard library, however, was not based on a book or on an existing library. Instead, different, existing classes were integrated. Thus, the result is not very homogeneous. You will find different design principles for different components.

    Ehrlich gesagt ist es kein Wunder, dass es bei dem Entstehungsprozess (bzw. Standardisierungsprozess) von C++ extrem lange gedauert hat, dass halbwegs standardkonforme Compiler entstanden sind. In der Sprache wird einfach keine klare Linie verfolgt.
    </provozier>
    🙂



  • Gregor schrieb:

    4 Leerzeichen schrieb:

    C++ ist zwar viel ausgereifter

    😉
    <provozier>
    Soll das ein Witz sein? C++ und ausgereift? C++ mit seiner Standardbibliothek ist alles andere als ausgereift. Aus meiner Sicht wurden bei C++ einfach möglichst viele Features zusammengewürfelt ohne, dass dahinter ein großartiges Gesamtkonzept steht. Es ist kein Wunder, dass man damit ein Programmiersprachen-Monster geschaffen hat, das nahezu keiner in seiner Gesamtheit beherrschen kann. Ich habe hier schon oft Leute gesehen, die praktisch als "C++ Gurus" angesehen werden, die aber selbst behaupten, dass sie die Sprache noch längst nicht in ihrer Gesamtheit beherrschen bzw. ausnutzen. Mit der Standardbibliothek ist es genau das Gleiche. Schon in "The C++ Standard Library" von Nicolai M. Josuttis steht:

    The standard library, however, was not based on a book or on an existing library. Instead, different, existing classes were integrated. Thus, the result is not very homogeneous. You will find different design principles for different components.

    Ehrlich gesagt ist es kein Wunder, dass es bei dem Entstehungsprozess (bzw. Standardisierungsprozess) von C++ extrem lange gedauert hat, dass halbwegs standardkonforme Compiler entstanden sind. In der Sprache wird einfach keine klare Linie verfolgt.
    </provozier>
    🙂

    ...wenn schon einer Stroustrup heißt... 😃 😉 👍



  • und es zuerst "C with Classes" tauft



  • gomberl schrieb:

    Jo, ich habs ja probiert. Aber jedesmal wenn ich versuche etwas in Java zu machen dreh ich durch...

    wieso dieses? wenn du aus der C++ ecke kommst dann solltest du mal keine probleme mit der sprache haben? oder an was haengt es?

    Es hängt an vielen Kleinigkeiten. zB komme ich mit C# vernünftig aus...
    Ich komme halt mit Java nicht klar - das ist keine Kritik an Java, sondern einfach meine persönliche Erfahrung.



  • shade: Nimm das nicht persönlich, aber das ist totaler schwachsinn.
    Wenn du gut mit C++ auskommst, gut mit C# (speziell C#) auskommst dann sehe ich überhaupt keinen einzigen grund wo du "durchdrehen" solltest wenn du java nutzt. Sicher gibt es einige bereiche wo die anderen Sprachen Java überlegen sind und einige dinge die man einfach anders hat.
    Aber für mich klingt das alles zu sehr nach gewohnheitsdenken (wie geht das bei C# ... hmm) und sehr nach stereotypisierung (ich glaube das wort habe ich gerade erst erfunden)

    das war nur meine subjektive meinung

    gomberl



  • Ich denke auch, dass das nur eine Frage der Gewohnheit ist. "Java" wird nunmal mit J geschrieben und nicht mit C 😉



  • CengizS schrieb:

    Ich denke auch, dass das nur eine Frage der Gewohnheit ist. "Java" wird nunmal mit J geschrieben und nicht mit C 😉

    Echt?!? A-Du-Scheibe!! 😮
    Demnach bist Du also eher der C-Coder?!? 🕶



  • Ich habe keine Vorurteile wie mach andere Personen (das ist keine Anspielung also bitte net das Flamen anfangen :))

    Ich könnte mich aber auch umbenennen ... JengizS ... etwas gewöhnungsbedürftig - nee lieber docht nicht 🙂



  • soweit ich weis ist java die sprache, welche oop nach heutigen maßstäben zur perfektion gerieben hat,soweit, dass sich c++ da noch ne große scheibe von abschneiden kann.

    ???
    Smalltalk war schon viel früher da und Javas OO-Fähigkeiten sind doch beinahe minimalistisch verglichen mit Smalltalk.

    Ich kann in Java wunderbar prozedural programmieren...

    Ach du scheiße, was siehst du denn bitte als "wunderbar" an?

    Jo, ich habs ja probiert. Aber jedesmal wenn ich versuche etwas in Java zu machen dreh ich durch...

    Kenn ich. Java ist auch nix für mich.

    Ja, aber es ging um OO Konzepte. Und das 'Problem' hierbei ist, dass viele Leute glauben dass Java deshalb besser sein muss als C++ weil es 'perfekt' OO ist. Was aber ein Blödsinn ist. 'echte' OO habe ich bei Ruby

    Naja.

    Es hängt an vielen Kleinigkeiten. zB komme ich mit C# vernünftig aus...

    Uff, ich nicht wirklich.

    Was ich aber sehr interessant finde ist C++/CLI. Was ich bis jetzt so gelesen habe ist ziemlich genial!

    ------------------------

    BTW, Klassen sind nicht grundlage für OOP. Es gibt reine OO-Sprachen, die ohne Klassen auskommen. Die verfolgen dann das Prinzip der Prototype-Based-OO (Beispiel: Self).

    Auch BETA hat nicht direkt Klassen aber man kann Pattern quasi als solche verwenden.



  • Wenn ich jetzt ausführe was mich persönlich an Java stört, dann leite ich damit nur einen flamewar ein.

    Ich habe einen kleinen Webserver (mit Plugins für verschiedene Protokolle - implementiert habe ich diese aber nicht :p) in Java geschrieben.

    Und es war für mich eher eine Qual. Wobei Qual natürlich übertrieben ist - aber ich kam mit einigen Konzepten einfach nicht klar. Dagegen habe ich meine Matura (Abitur) Arbeit in C# entwickelt - das lief das eigentlich ganz vernünftig. Natürlich stören mich auch hier einige Sachen, aber eben signifikant weniger als an Java.

    Das will ich nur kurz angemerkt haben, nicht das jemand denkt, ich habe noch nix mit Java gemacht und habe bloss Vorurteile.

    Aber man muss ja nicht mit jeder Sprache gut auskommen 🙂

    Auf C++/CLI bin ich aber auch extrem gespannt.

    Und BETA muss ich mir mal langsam wirklich ansehen... steht seit ewigen Zeiten auf meiner 'Todo' Liste.

    @Helium:
    mit 'perfekt OO' meine ich das OO von 'Java ist perfekt OO' - und nicht Objekt Orientiert wie ich es sehe.

    Wenn man Java als 'perfekt OO' bezeichnet, muss Ruby 'perfekter OO' sein - denn dort ist alles ein Objekt.

    Für mich persönlich haben 'Objekte' ansich nichts mit OOP zu tun. Für mich ist OOP mehr ein Konzept, zudem ich keine Klassen und Objekte im herkömmlichen Sinn brauche (obwohl es mit ihnen oft wesentlich einfacher, schöner und besser ist) - ich kann mir 'Objekte' zB auch gut als Handles vorstellen.


  • Mod

    Shade Of Mine schrieb:

    Wenn ich jetzt ausführe was mich persönlich an Java stört, dann leite ich damit nur einen flamewar ein.

    Wenn du begründete Kritik äußerst, dann läßt sich immer darüber reden ohne, dass es eskaliert. Oder haben deine Kritikpunkte keinen nachvollziehabren Hintergrund?



  • Shade: sehe ich genauso wie Gregor. Speziell weil ich ja selber aus der C++ Ecke komme und absolut nicht der meinung bin das Java "besser" als C++ ist.(Auch nicht als C#). Also mich würde es schon sehr interessieren was dich stört.

    Ich versteh zum beispiel nicht was du mit "Konzepten" meinst nicht.
    Weil in dem Bereich unterscheiden sich C# und Java nicht soweit voneinander.

    Stimmt - ich komm mit ruby nicht so besonders gut aus - eigentlich komm ich mit ruby gar nicht aus - aber was solls 🙂

    man kann auch wunderschoen Objektorientiert in C programmieren - mit function pointern und allem drum und darn. Das waren noch zeiten.
    So ne mischform aus OOP und modularer/strukturierter programmierung.

    gomberl

    Nur zur Info:
    Ich hab mein Matura - Spezialgebiet in C++ geschrieben (COM / DCOM) - da war das .Net gerade in der Beta heraussen. War ganz lustig. Hab dann auch vergleich mit CORBA und RMI/EJB gemacht.



  • Gregor schrieb:

    Wenn du begründete Kritik äußerst, dann läßt sich immer darüber reden ohne, dass es eskaliert. Oder haben deine Kritikpunkte keinen nachvollziehabren Hintergrund?

    Nachvollziehbar? Für mich schon, aber jeder Javaianer mit dem ich bisher darüber gesprochen habe, dachte anders 😉

    Ich mag zB die 'checked Exceptions' nicht.
    siehe auch: The Trouble with Checked Exceptions

    Dass socket.close() eine Exception wirft mag ich auch nicht.
    Die Threads mit dem Interface Runnable, finde ich in C# besser gelöst -> Delegates

    Dann mag ich das Konzept von C# und Java nicht, dass ein Objekt 'undefiniert' sein kann (NULL Pointer Exception). Ich habe gerne alle Objekte in einem 'funktionierenden' zustand.

    Generell finde ich die Exception sehr komisch gelöst. Alles wirft ne Exception - auch wenn es IMHO nur ein simpler 'Status' ist. zB EOFException - EOF ist IMHO eben kein Fehler und schon garnicht eine 'Ausnahme'.

    Socket sock=null;
    try
    {
      sock=new Socket();
    }
    catch(...)
    {
    ...
    }
    finally
    {
      try
      {
        if(foo)
          foo.close();
      }
      catch(HabIchVergessenException)
      {
      }
    }
    

    Bei sowas frage ich mich: warum keine Destruktoren? Und warum wirft der 'Dtor'? Ich kann meistens dann sowieso nix machen. Höchstens den Fehler loggen...

    Da finde ich D sehr interessant: ich kann die 'unwichtigen' Resourcen wie zB Speicher dem GC überlassen - denn da ist es mir ja egal wann er freigegeben wird. Aber zB eine DB Verbindung oder ähnliches würde ich gerne nur solange offen lassen wie nötig. Denn ich will die DB ja nicht sinnlos warten lassen... Da mache ich das Objekte dann 'auto', sprich es wird zerstört wenn es out of scope geht.

    Und Operatorenüberladung fehlt mir auch gewaltig. Ich kann mich einfach nicht an
    i.add(5);
    gewöhnen. Ich weiss dann nie, returned add jetzt ein neues Objekt, oder ändert es i?

    Die Artikel auf www.aritma.com fand ich da auch sehr interessant. Vorallem die Artikel mit Bruce Eckel und Anders Hejlsberg über das Design von .NET

    Wie man sieht sind die meisten Argumente ja auch oft 'pro Java' Argumente (wie zB: GC kümmert sich um alles, operatoren überladung macht die Sache unnötig komplex,...). Mir ist schon klar, dass viele Leute Java so gut finden wie es ist. Nur ich gehöre halt nicht dazu.

    Und ich hoffe es gibt jetzt keinen Flamewar...



  • 'checked Exceptions': find ich persönlich gut speziell bei der architektur erstellung - geschmacksache

    Dann mag ich das Konzept von C# und Java nicht, dass ein Objekt 'undefiniert' sein kann (NULL Pointer Exception). Ich habe gerne alle Objekte in einem 'funktionierenden' zustand.

    dasselbe problem hast du aber in C++ auch. ein pointer auf ein objekt kann ja auch irgendwohin zeigen wenn er nicht initialisiert wurde.
    Und wenn du eine referenz auf ein objekt hast und jemand anderer gibt den speicher dieses objektes frei dann hast du sogar bei einer referenz einen undefinierten zustand

    Bei den Exceptions geb ich dir recht - die EOFException ist eines der besten beispiele dafuer

    warum keine Destruktoren?

    finalize ist quasi der java destruktor (die methode wird vor dem destruktor aufruf von der garbage collection aufgerufen)

    bei db verbindungen hast du die close methode die es dir ermoeglicht die connection zu beenden. das objekt wird dann freigegeben sobald der GC es sammelt.

    Operatorenueberladung: Das fehlt mir auch. Aber es stimmt schon das die operatoren ueberladung nur gut fuer denjenigen ist der sich intensiv damit beschaeftigt. fuer maintanence in einem system ist das ein horror.

    also im endeffekt verstehe ich deine probleme (bis auf die destruktor problematik) - aber so das es mich in den wahnsinn treiben wuerde sind diese probleme doch nicht

    lg

    gomberl



  • gomberl schrieb:

    finalize ist quasi der java destruktor (die methode wird vor dem destruktor aufruf von der garbage collection aufgerufen)

    Ist es denn garantiert das finalize aufgerufen wird? AFAIK ist es das nicht.
    Und das macht finalize irgendwie sinnlos... bzw. unnutzbar für 'teure' Resourcen wie eine DB Verbindung.

    bei db verbindungen hast du die close methode die es dir ermoeglicht die connection zu beenden. das objekt wird dann freigegeben sobald der GC es sammelt.

    Und genau das stört mich. Weil es IMHO das Exception Konzept aushebelt.

    Ich will ja garnicht auf alle Exception reagieren... Ich will die Exceptions dort behandeln wo ich sie behandeln kann - und das cleanup will ich dem Compiler überlassen. Da habe ich oft sehr viel Fehlerbehandlungscode in der Funktion - das erinnert mich manchmal an C, da habe ich auch immer sehr viele Fehler lokal behandelt.

    Natürlich nicht immer - wie gesagt bei Speicher macht der GC einen super Job. Er achtet darauf dass nicht geswappt werden muss und ob jetzt 50 oder 70% des RAMs belegt sind, ist mir egal. Da ja nur das swappen teuer ist.

    Aber bei DB Verbindungen oder ähnlichen 'seltenen' Resourcen hätte ich eben gerne ne Möglichkeit zu wissen, dass die Resource freigegeben wird.

    Operatorenueberladung: Das fehlt mir auch. Aber es stimmt schon das die operatoren ueberladung nur gut fuer denjenigen ist der sich intensiv damit beschaeftigt. fuer maintanence in einem system ist das ein horror.

    Hast du da mal so ein 'Horror Beispiel'?

    Ich finde ein i.add(7); ist ein größere Übel.
    Ich habe das mit den Problemen mit Operatorenüberladung noch nie kapiert.
    Für mich ist
    a+b;
    nix anderes als
    add(a,b);
    wobei man keine Namensprobleme hat. Denn add(a,b); ist ja noch logisch.
    Aber was ist a.add(b); ?
    Da fängt es an, dass es aufeinmal ein add und ein append gibt - op+ und op+=

    Ich kenne diese Problematik nur von PHP - und da gibt es quasi keine 'value objekte' - aber dennoch muss ich öfters mal in die Doku schaun, wenn ich ein a>add(a->add(b) sehe...



  • Shade Of Mine schrieb:

    Aber bei DB Verbindungen oder ähnlichen 'seltenen' Resourcen hätte ich eben gerne ne Möglichkeit zu wissen, dass die Resource freigegeben wird.

    Und das ist in Java und C# allgemein gesagt solche methode:
    .dispose() .free() .close()



  • Zeus schrieb:

    Shade Of Mine schrieb:

    Aber bei DB Verbindungen oder ähnlichen 'seltenen' Resourcen hätte ich eben gerne ne Möglichkeit zu wissen, dass die Resource freigegeben wird.

    Und das ist in Java und C# allgemein gesagt solche methode:
    .dispose() .free() .close()

    Darum geht es doch gerade. Ich will eben nicht selber das machen (und uU es vergessen). Das ist doch das Argument warum ich den GC verwenden soll 😉 GC Verfechter sagen: nutze den GC, denn dann kannst du das Freigeben des Speichers nicht vergessen. Nun ist Speicher aber nicht so teuer wie ne DB Verbindung.

    Wenn ich also 3 mal vergesse Speicher freizugeben, kostet es mich vielleicht ein 1MB Memory Leak. Das ist natürlich doof - und deshalb finde ich GC ansich ja nicht schlecht - aber 1MB ist verkraftbar.

    Wenn ich aber zuviele DB Verbindungen die unnötig offen sind, können tödlich sein - oder zumindestens bremsen sie das System. Gerade hier ist es wichtig, dass ich garantiert nicht vergesse die Verbindung freizugeben.

    In C++ habe ich Destruktoren die das für mich übernehmen - denn jedes DB Objekt muss, wenn es nichtmehr gebraucht wird, die Verbindung frei geben.

    Der Compiler weiss das aber am besten -> wenn es out of scope geht, brauch ich es nicht mehr - hier gibt es natürlich unterschiede zwischen Resourcen wie Speicher und DB Verbindungen. Deshalb denke ich auch, dass der C++ ansatz mit: immer Dtor auch nicht ideal ist. Ich mag deswegen den D Ansatz: ich kann mir aussuchen ob der GC kollektet wann er will, oder ob das Objekt gekillt wird, wenn es out of scope geht.

    Natürlich muss ich dann selber aufpassen, dass es keine Referenzen mehr auf das Objekt gibt...


Anmelden zum Antworten