Beiträge von a9bejo

    Zitat von sauzachn


    Java ist sogar ein sehr gutes Beispiel für eine OO Sprache.

    Ich will Java nicht schlecht reden, aber auch wenn die Sprache
    objektorientierte Programmierung prinzipiell unterstützt, macht es
    sie auch durch die unzähligen Ausnahmen unnötig kompliziert.

    Nicht nur primitive Datentypen, sondern auch Packages, Klassen,
    Operatoren, null, loops, Blöcke oder Methoden haben in Java eine
    Sonder rolle bekommen, so dass sie entweder nicht wie gewöhnliche
    Objekte behandelt, oder zumindest von der Syntax speziell
    berücksichtigt werden müssen.

    Ein Folge dieser Ausnahmen ist zum Beispiel, dass Metaprogrammierung
    und Reflection in Java viel komplizierter sind als in "reinen" OOP
    Sprachen wie Smalltalk, Ruby oder Io.

    Eine weitere Folge sind die unkonventionellen APIs, die aus der
    uneinheitlichen Syntax entstehen. Dinge Math.abs(-5) oder
    Collections.sort(list) zeugen nicht gerade von gutem Design.

    Instanzvariablen können öffentlich sein, und wenn man ordentliche
    Kapselung implementieren will, muss man einen Haufen Get- und
    Setmethoden schreiben, auch wenn man sie zunächst überhaupt nicht
    benötigen würde.

    Siehe hierzu auch das letzte drittel von diesem Artikel auf meinem blog.

    Ich schätze die Plattform Java, weil sie mir eine riesige
    Bibliothekensammlung und einheitliche Schnittstellen zur Verfügung
    stellt. Die Sprache an sich ist, das sehe ich wie Paul Graham, ein
    langfristig gesehen toter Ast im Evolutionsbaum der
    Programmiersprachen.

    Zitat von Swoncen

    @ hal: Du behauptest also, dass Java genauso performant ist wie C/C++?

    Also das hat hal aber so nicht gesagt!

    Ich lese:

    Zitat von Swoncen


    Java ist ausserdem extrem langsam.

    Zitat von hal


    Wenn man ein Gerücht ständig wiederholt, wirds dadurch auch net wahrer...

    Von "genauso performant wie C++" hat er also nicht gesprochen. "Extrem
    langsam" interpretiere ich als "Inakzeptabel langsam fuer moderne
    Anwendungen", und das ist tatsaechlich ein Geruecht aus den 90er
    Jahren.

    Zitat von Swoncen


    Aber allein, dass es eine Interpretersprache ist, isses schon langsamer.

    Jede und keine Sprache wird interpretiert. C++ wird in den
    Maschinencode der Maschine uebersetzt, Java wird in den Maschinencode
    der (virtuellen) Maschine uebersetzt.

    Zudem wird dank JIT-Compilern ein Grossteil des Bytecodes mittlerweile
    direkt in "tatsaechlichen" Maschinencode uebersetzt.

    Um so abstrakter die Programmiersprache, umso mehr kann sich der
    Programmierer auf die Problemlösung konzentrieren.

    Um so maschinennäher die Programmiersprache, umso performanter kann
    die Software laufen.

    In den meisten Anwendungen steht die Problemlösung stark im
    Vordergrund. Daher gilt im Allgemeinen: Um so abstrakter die Sprache,
    umso effizienter die Software.

    In den Fällen, in denen die gewünschte Performance mit der
    abstrakten Sprache tatsächlich nicht erreicht werden kann, zahlt sich
    OptimizeLater meist eher aus, als dass man gleich
    das gesamte Projekt in einer low level Sprache umsetzt:

    Zitat von Paulchen

    Da du ein 534-Student bist... hast du das dem Puntigam in OOP auch so erzählt (so du OOP schon gemacht hast)? Spricht man da nicht eher von Vererbung bzw. Untertypbeziehungen?

    Ich habe OOP angerechnet bekommen. Ich mache aber gerade
    Fortgeschrittene OOP beim Puntigam und bin ein Fan vom "Kaiser
    Franz". :)

    In dem obenstehenden Code kommt tatsaechlich keine Vererbung, sondern
    Instanzierung zum tragen:


    Die Klasse java.lang.String ist eine Subklasse der Klasse
    java.lang.Object, aber eine Instanz der Klasse java.lang.Class!


    Zitat von Java API


    Instances of the class Class represent classes and interfaces in a running Java application.

    -- http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html

    Java ist leider nicht gerade ein Musterbeispiel fuer eine Objektorientierte Programmiersprache, weshalb diese Dinge oft nicht so offensichtlich sind wie sie es eigentlich sein sollten.

    Zitat von Swoncen

    häh? Du meinst wohl eine Instanz einer Klasse ist ein Objekt.

    Ich meine das Klassen selbst wieder nur Instanzen von anderen Klassen
    sind. Die Klasse java.lang.String ist zum Beispiel eine Instanz der
    Klasse java.lang.Class :

    PHP
    System.out.println(String.class.getClass().getName()); //=> java.lang.Class

    die in Java verwendete Art, Klassen zu definieren:

    PHP
    class A extends B{}

    ist also selbst nur wieder eine besondere Syntax der Instanzierung,
    damit es es der Programmierer leichter hat. Aehnlich wie das schon bei
    "" und new String() der Fall war.

    Klassen sind "Blaupausen", von denen man Objekte erstellen kann. Zum
    Beispiel kannst du von der Klasse String ein Object instanzieren.
    Da man aber in der Regel sehr viel mit solchen Zeichenketten arbeitet,
    gibt es in vielen Programmiersprachen eine spezielle Syntax, mit der
    man Strings instanzieren kann.

    PHP
    String einString = new String();


    ist also genau das selbe wie

    PHP
    String nochEinString = "";


    was sich auch leicht nachpruefen laesst:

    PHP
    boolean beideStringsGleichenSich = einString.equals(nochEinString) // => true


    Alles klar?

    Uebrigens: Klassen sind meist selbst wieder nur Objekte, die von
    anderen Klassen instanziert wurden.

    Zitat von Sandybutt

    Huhu!

    Bin auf der Suche nach einem guten J2EE-Antipattern-Buch, das interessant zu lesen ist. Kennt da jemand eins?


    Bruce Tates Bitter Java hab ich gut gefunden.

    Allerdings wurden ein paar Komponenten von J2EE vor einiger Zeit sehr stark refactored (siehe vor allem JSR 220: Enterprise JavaBeansTM 3.0). In dieser Hinsicht ist dieses Buch (sowie die meiste vorhandene Literatur) sicherlich nicht mehr auf dem Laufenden.


    Zitat von Lord Binary


    Ich hasse J2EE, insbeonsdere EJBs, bin grosser Fan des Spring Frameworks.


    Das ist aber ein Wiederspruch, denn das Spring Framework ist eine Implementierung der J2EE Spezifikation:

    Zitat von http://www.springframework.org/


    Welcome to the home of the Spring Framework. As the leading full-stack Java/J2EE application framework, Spring delivers significant benefits for many projects, reducing development effort and costs while improving test coverage and quality.

    Hallo Margit!

    Ich informiere mich mittlerweile fast ausschließlich durch
    soziale medien (weblogs, soziale informationsdienste usw.) Hier
    meine (mehr oder weniger) tägliche Routine, nach Priorität
    geordnet.


    • Diese persönlich zusammengestellte liste von Weblogs
      (besteht aus Blogs von Entwicklern verschiedener Unternehmen und
      Projekte, sowie von Kollegen aus Arbeit und Uni, deren Meinung ich schätze)
    • die Bookmarks von Bekannten in meinem del.icio.us netzwerk.
    • soziale Informationsdienste: reddit.com, tech.memeorandum.com, digg.com
    • verschiedene Mailinglisten, Usenet Gruppen und community
      Seiten diverser Entwickler communities.

    Dafür nehme ich mir täglich ungefähr eine Stunde, oft auch
    länger. Ich überfliege dabei meistens die einzelnen Einträge
    in meinem Feed-Aggregator und picke mir nur die Artikel heraus,
    die ich interessant finde (entscheidet sich meist nach
    Überschrift, Kurzbeschreibung oder Quelle). Wenn mir für einen
    Artikel, der mich interessiert die Zeit fehlt, füge ich ihn zu
    einer Liste hinzu, damit ich ihn später
    wiederfinde.

    Außerdem lese ich natürlich Fachliteratur und besitze auch
    ein iX Abonnement seit zwei Jahren.

    In einer HashMap werden die hashCodes der Schluesselwerte zwar zum abspeichern und suchen verwendet. Aber um sicher zu gehen, dass sich das gesuchte Objekt tatsaechlich in der Map befindet, wird die equals methode verwendet.

    Das eine impliziert das andere naemlich nicht:

    Zitat von http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode()


    It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

    Du solltest daher auch die equals Methode von AbstractState ueberschreiben.

    Hier noch ein entsprechender Test:

    Ich frage mich aber, ob man das wirklich so loesen sollte. Anstatt die States fuer die Map ueber ihre Klassen zu vergleichen, koenntest du ja z.b. auch gleich die Klassen als Keys benutzen:

    PHP
    map.put(StateA.class, "C");

    Hallo Jensi!

    Zitat von Jensi

    Und das soll dann passieren, indem man sich ein
    kompliziertes Emacs-Makro dazu macht, das einem vor dem Speichern die
    Tabs in Spaces verwandelt.

    Das "komplizierte Makro" brauchst du dafür ja auch nicht. Das war
    Code, der verhindern soll, dass sich jemals Tabs aus Dateien als
    solche in den Buffer von jwz's emacs einschleichen. Würdest Du immer
    automatisch nur Tabs und keine Spaces in deinen Dateien haben wollen,
    brauchtest du einen ganz ähnlichen Code. Im Übrigen ist diese Funktion
    eigentlich _sehr_ einfach, zumindest wenn man etwas LISP kann
    (ansonsten sollte man vom Emacs aber eh die Finger lassen).

    Um einfach alle vorhandenen Tabs zu Spaces zu verwandeln (oder
    umgekehrt) gibt es in Emacs (und den meisten anderen modernen
    Texteditoren) eine einfache, bereits eingebaute Funktion. Und
    natürlich kann so gut wie jeder Editor nach drücken der TAB Taste
    auch Leerzeichen statt Tabs einfügen.

    Eigentlich wollte ich mit meinem Kommentar ja nur darauf hinweisen,
    das dieses Thema sehr umstritten ist, wahrscheinlich viel zu
    umstritten, um zu fragen:

    Zitat von Jensi

    Warum willst Du das?

    Das währe nämlich so, als wurde jemand fragen, wie er Debian Server
    aufsetzt und man antwortet ihm "Warum nimmst du nicht Windows?". So
    etwas ist zumeist wenig hilfreich und führt zu wenig fruchtbaren
    Diskussionen.

    Wie auch immer, hier trotzdem meine Versuch einer Erklärung, warum
    ich persönlich Tabs vermeide, wo es geht:

    Der Tab Charakter hat für mich folgende relevante vor- und Nachteile:

    [+] man spart Platz auf dem Speichermedium, weil man ja statt bis zu
    8 Whitespaces nur einen Tab Charakter schreiben muss.

    [-] Man verwendet zwei unterschiedliche Zeichen, die äußerlich nicht
    voneinander unterscheiden lassen. Das macht nicht nur Probleme beim
    Navigieren durch den Code, sondern auch beim einfügen und bearbeiten
    von Fremden Code. Und frage einmal einen Python Programmierer, was er
    von Tabs hält :)

    [-] Will man Dateien mit Tabs mit einen Script parsen, kann es zu
    Fehlern kommen, weil man oft nicht daran denkt, die Whitespaces beim
    einlesen zu normalisieren:

    Code
    str.gsub!(/\s+/," ")

    Also der Speicherplatz ist ja wohl bei diesem Thema völlig egal, und
    ansonsten sehe ich keine Vorteile von Tabs:

    Zitat von Jensi

    Tabs haben den Vorteil, daß man die Weite des Tabulators
    in einem gscheiden Editor im Nachhinein noch auf die gewünschte Weite
    einstellen kann... zum Beispiel auf vier Zeichenbreiten.

    Den Grad der Einrückung kann ich in jedem guten Editor ohne
    weiteres ändern, ob mit Leerzeichen oder Tabs.

    Zusammenfassung: Zwei Zeichen, die genau gleich ausschauen,
    miteinander zu vermischen, bringt mehr Ärger als es einbringt. Da man
    in der Regel nicht ohne Whitespace auskommen kann, muss es der Tab
    Charakter sein, der verschwindet.

    lg, ben

    Zitat von Jensi

    Warum willst Du das?

    Tabs haben den Vorteil, daß man die Weite des Tabulators in einem gscheiden Editor im Nachhinein noch auf die gewünschte Weite einstellen kann... zum Beispiel auf vier Zeichenbreiten.

    Heh, darueber laesst sich aber streiten (1,2). ;)

    Zitat von klausi


    ich finds schade, dass uml-diagramme oft erst im nachhinein erstellt werden. ordentliche grafische modellierung von anfang ist wichtig und hilfreich (speziell bei größeren sachen).

    Ich finde UML zur unterstützenden Modellierung auch sehr sinnvoll,
    also z.b. für Sketches, Scribbles bei Meetings usw, oder um
    Spezifikationen und/oder Dokumentation durch standardisierte Diagramme
    zu bereichern. Hier ist die UML aber auch bereits sehr populär.

    Von dem Nutzen allzu detaillierter graphischer UML Diagramme zu Beginn
    eines Projektes bin ich aber nicht überzeugt. Da kommt man dann oft
    viel zu nah an den Bereich "graphisches Programmieren".

    Auf jeden Fall aber finde ich Usecase Diagramme mehr oder weniger
    sinnlos. Use Cases lassen sich durch reinen Text doch viel einfacher
    und auch verstaendlicher beschreiben" als durch Blasen und Pfeile.

    Hallo Dynamic!

    Fuer fragen bezueglich EPROG bitte im EPROG forum nachfragen. Ich weiss z.b. gar nicht, wie die Spezifikation deiner Aufgabe aussieht (klingt nach komplexen zahlen).

    Auch sinnvoll ist, zuerst die suchfunktion des forums zu benutzen. Oft wurden diese Fragen bereits ausgiebig diskutiert.

    lg, ben

    Zitat von caesarju

    wie müsste ich es machen, dass ich aus einem array beliebig viele maximal bzw minimalwerte herauslesen kann?

    Das selbe was du tust, um einen einzigen maximal/minimalwert zu bekommen. Nur halt n mal. :)

    Code
    //java:
    int[] maximalwerte = new int[anzahlDerMaximalwerte];
    //pseudocode:
    for(i=0;...){
     max = hole naechsten maximalwert
     maximalwerte[i] = max
    }

    lg, ben

    Zitat von java-girl

    Meine Lösung ist als eher primitiv anzusehen

    Deine Loesung ist aber nicht schlechter als meine.
    Bei meinem code wird das gesamte array insgesamt 6 x durchlaufen, das ist halt nicht unbedingt performant. Mit deiner loesung wuerde es mit drei Durchlaufen gehen.
    Was wirklich vernuepftig waehre, haengt wohl davon ab, wieviele elemente in dem array drinnen sind.

    Wenn die Reihenfolge erhalten bleiben muss, wird es leider etwas umstaendlicher:
    z.b.

    Code
    Integer[] arr = new Integer[]{3,1,4,5,7,6};    
        List<Integer> list = new ArrayList<Integer>(Arrays.asList(arr));
        list.remove(Collections.min(list));
        list.remove(Collections.min(list));
        list.remove(Collections.max(list));
        list.remove(Collections.max(list));
        arr = list.toArray(new Integer[0]);

    Im Gegensatz zur java-girls Loesung wird da intern viel herumkopiert. Auf der anderen Seite ist die Loesung aber abstrakter und daher besser lesbar.

    <lobbyarbeit>
    Btw, In Ruby wuerde man das vermutlich mengenorientiert loesen:

    Code
    list = list & list.sort[2...-2]


    </lobbyarbeit>

    Zitat von maciek

    so was Ähnliches hab ich mir gebastelt ... aber: Gibt es in Java keine "vordefinierte" Struktur, mit der man das lösen kann?

    Was ist denn fuer dich ein Benutzer? Der Kontext vom Client Code, der das Singleton benutzt? Wohl nicht, denn dann waehre ja dein private singleton == normale instanz einer klasse. :)

    Andererseits gibt es ja keine "Benutzer" auf ebene der programmiersprache, also kann es auch keine datenstruktur dafuer geben.

    bitte aufklaehren.

    [Nachhilfe hat mir eine Antwort als private message geschickt (?). Da die antwort aber zu dieser diskussion gehoert und nichts privates hatte, antworte ich wieder hier im forum.]

    Alles klar. All diese Features fallen für mich in den
    Aufgabenbereich einer IDE, nicht eines Text Editors.
    Natürlich kann man da keine fixe Linie ziehen, aber bei einem
    Texteditor liegt für mich der Fokus auf dem bearbeiten von Text,
    während IDEs den Fokus auf Projektmanagement mit einer (oder
    mehreren) Entwicklungsplattform(en) haben.
    Wenn für eine Plattform ein gutes Eclipse-Plugin existiert (wie
    z.b. JDT für Java), dann bin ich damit sicher produktiver als
    mit Jedit oder Emacs.

    Alle bekannten IDEs (Eclipse, Visual Studio) haben aber sehr
    schwache Texteditor en eingebaut.

    Daher ist meiner Meinung nach alles, für das es keine so
    ausgezeichnete IDE wie Eclipse gibt (Seminararbeiten,
    Dokumentationen, Mails, Weblogeintraege, ruby/python/lisp
    Programme etc., dieser Text hier) ein richtiger Texteditor das
    bessere Tool.

    PS:
    JSEclipse. Habe es aber noch nicht ausprobiert. Wenn das jemand tut
    => bitte Testbericht.