C# vs. Java

Status
Nicht offen für weitere Antworten.
nitronic hat gesagt.:
Mal ganz davon abgesehen, dass diese Diskussion keinem etwas bringt. Ich persönlich kann Java, sicherlich nicht so gut wie Du, Christian, keine Frage. Nur habe ich mich mal gegen Java entschieden, was auch mehrere Gründe hat das sind mitunter auch Gründe, die für andere relevant sind und über die sich jeder klar werden soll, der sich fragt C# oder doch Java.

Das ist auch vollkommen in Ordnung.
Das darf jeder für sich selber Entscheiden. Du sollstest dir nur überlegen was du über die andere Sprache sagst wenn du dir nicht sicher bist das es falsch ist. Dann sag das lieber nicht.
Dir würde es auch nicht gefallen wenn ich falsche Dinge über .net sagen würde, nur weil ich es nicht weiss oder?

nitronic hat gesagt.:
Ich programmiere mittlerweile ausschließlich auf Windows-Systemen (nicht dass ich nicht unter Linux programmieren würde, aber unsere Software ist auf Windows ausgelegt, weil eben alle unsere Kunden Windows verwenden bzw. ohnehin ein komplettes System inkl. Hardware, OS etc. kaufen). Hier kann ich Software entwickeln die sich perfekt in Windows integriert und das ohne viel Aufwand.

Weiters habe ich den Vorteil, dass sich die Software automatisch, ohne mein Zutun an den jeweiligen Style (Theme) des Benutzers anpasst, ohne Verrenkungen unternehmen zu müssen. Wie dies unter Java zu erreichen ist, keine Ahnung - ehrlich gesagt. Unter .NET muss ich da gar nichts dafür tun.

SWT passiert sich auch den Themes an, und das bei Windows die verschiedene Themes und auf Linux passt es sich den GTK Themes an, und zwar so das mann keinen Unterschied zwischen nativ und SWT sieht.
Und nein mann muss dafür auch keine einzelne Zeile Code schreiben.

nitronic hat gesagt.:
Unsere Systeme laufen mit einem MS-SQL-Server, hier bietet .NET und VS eine wesentlich angenehmere Variante was Administration etc. betrifft. Zumindest finde ich es angenehmer. Du, Christian, vielleicht nicht.
Ich habe sehr negative Erfahrungen mit dem MS SQL Server gemacht, und das seid 1 Jahr, das ich mit dem Projekt verbringe.
Diese schlechte Erfahrung kann ich aber auf meine zu geringe Kentniss mit dem MS SQL Server zurückführen. Ich komme mit dem PostgreSQL Server um einiges besser klar weil ich diesen einfach kann.
Ein anderer kommt mit IBM DB2 am besten klar usw
Da nehmen sich die meisten nicht viel.


nitronic hat gesagt.:
Wir verwenden unter anderem NUR eigens entwickelte Steuerelemente. Deren Entwicklung geht unter .NET + VS ein wenig schneller von statten als unter Java - dies ist übrigens nicht meine Aussage, weil ich unter Java noch nie derartige Elemente gebastelt hab, sondern von einem unserer Programmierer, der übrigens aus der Java-Welt stammt.

Um zu bewerten inwieweit die Aussage stimmt müsste ich wissen was für Steuerelemente. Da ich die aber nicht kenne kann ich dazu nichts sagen. Ich programmiere sowohl in .net als auch in Java und muss sagen das die Entwicklung verteilter Applikationen unter Java um einiges angenehmer durchzuführen ist, was durch RMI und EJB wunderbar unterstützt wird.


nitronic hat gesagt.:
Weiters geht es mir am Senkel, in Java ständig einmal ein Getter zu machen und einmal ein Setter. In .NET benötige ich dazu genau _EINE_ Methode und nicht zwei. Bei 10 Properties macht sich das dann schon bemerkbar.

Ich mache genau 3 Mausklicks und kann für einzelne/ sämmtliche Attribute getter (und oder setter) Methoden deklarieren.
Tip: Eclipse
folgende Klasse

Code:
public class Person {
    private String firstName, lastName;
}
rechts in den Code klicken
Kontextmenu -> Source -> generate Getter/Setter
und das wars.

nitronic hat gesagt.:
Und das sind einige der Gründe warum ich meine Projekte meist nicht mit Java mache.

Wie ich schon mehrmals bemerkt habe: Wenn die Anwendung plattform-unabhängig sein muss, dann greif selbst ich zu Java. Sind bei mir jedoch nur die wenigsten Projekte.
Du kannst programmieren mit was du willst, das ist mir 88.
Aber hör auf mit falschen Behauptungen eine Programmiersprache schlecht zu reden.

nitronic hat gesagt.:
Es geht hier darum, jemanden die Entscheidung einfacher zu machen, ob er C# oder Java nehmen soll. Und ich glaube NICHT dass ER weiß WELCHES Plugin er für Eclipse verwenden soll.

Brauch er der nicht weiss mit was er anfangen will zu programmieren ein UML Plugin?
Brauch er ein J2EE EJB Plugin? Brauch er ein Struts Plugin? Brauch er Axis SOAP Plugin?

Nein er brauch eine IDE mit der er codieren, debuggen vielleicht noch Teamverwaltung (cvs ), TODO Liste und und
Er wird als Programmieranfänger nichts benötigen was Eclipse ohne Plugins nicht bietet. Ich habe in meiner produktiv IDE genau 3 Plugins Installiert.
Wenn er lang genug gelernt hat um sich mit Techniken wie Servlet Programmierung gehört hat, so wird er schon 50 mal was von Sysedo Tomcat Pluging gehört haben.
 
Getter und Setter:
Ja, weiß ich, aber: Es gestaltet sich aber unübersichtlicher, wenn Du zusätzlichen Code in deine Getter und Setter-Methoden mit reinnimmst. Macht doch einen Unterschied bez. der Übersichtlichkeit ob du 20 Methoden oder nur 10 Methoden auf dem Schirm hast.

Steuerelemente:
TextBox, Label, Grids, ComboBoxen, CheckBoxen und viele mehr wurden ausgetauscht.
Was das allerdings mit verteilten Anwendungen zu tun hat bleibt mir im Moment etwas verborgen.
 
nitronic hat gesagt.:
Getter und Setter:
Ja, weiß ich, aber: Es gestaltet sich aber unübersichtlicher, wenn Du zusätzlichen Code in deine Getter und Setter-Methoden mit reinnimmst. Macht doch einen Unterschied bez. der Übersichtlichkeit ob du 20 Methoden oder nur 10 Methoden auf dem Schirm hast.

Auch wenn du 20 get/Set attribute mit Code und manche ohne Code ausführung hast, hast du das selbe Problem.
Der geschickte Programmierer strukturiert seinen Code so das ersichtlich ist wo etwas zur Ausführung kommt.

Ich finde die Regelung besser als die Get/Set Attribute von .net.
Denn dies ist wiederrum eine unlogische Veränderung.
Zugriffsmethoden sind Methoden. Der Zugriff auf ein Property unter .net verät dir nicht
im Code schon ob eine Methode ausgeführt wird die eventuell Code ausführt oder aber
nur ein Variable gesetzt wird. Dieser Unterschied ist aber für mich relevant.

nitronic hat gesagt.:
Steuerelemente:
TextBox, Label, Grids, ComboBoxen, CheckBoxen und viele mehr wurden ausgetauscht.
Was das allerdings mit verteilten Anwendungen zu tun hat bleibt mir im Moment etwas verborgen.
Nein du hast meinen Text nicht gelesen. Verteilte Anwendungen war ein beispiel von meiner Seite aus. Weil ich diese Art der Applikation sowohl in Java als auch in .net entwickelt habe. Und die Java Version war dank netter Applikationsserver die HotDeploy unterstützen eine Wohltat.
 
Getter/Setter
Für mich ist es nicht relevant ob im Hintergrund eine Methode ausgeführt wird, oder eine Variable gesetzt wird. Ich will das wieder zurückbekommen, was ich der Property übergeben habe. Der Vorteil gegenüber Variablen liegt doch darin, dass ich in der Property Prüfungen durchführen kann, die ich bei einer Variable sonst jedes Mal machen müsste.

Weiters macht es für mich sehr wohl einen Unterschied, ob ich 20 Methoden oder nur 10 habe. Diejenigen die ich nicht benötige, werden von mir zugeklappt und je weniger in einer Klasse ist, desto übersichtlicher ist sie für mich - hängt aber womöglich vom Programmierstil oder den eigenen Vorlieben ab.

Das Get/Set-Konstrukt unter C# hingegen finde ich selbst genial. Ich muss mir nur eine einzige Methode anzusehen was passiert und nicht zwei.

Aus deinem Absatz ging jedoch nicht hervor, dass du einen Themenwechsel vorgenommen hast:

Um zu bewerten inwieweit die Aussage stimmt müsste ich wissen was für Steuerelemente. Da ich die aber nicht kenne kann ich dazu nichts sagen. Ich programmiere sowohl in .net als auch in Java und muss sagen das die Entwicklung verteilter Applikationen unter Java um einiges angenehmer durchzuführen ist, was durch RMI und EJB wunderbar unterstützt wird.

Lies die komplette Quote und dann wird es auch für dich ersichtlich.

Hier hast Du mir jedoch keine Antwort auf meine ursprüngliche Frage bzw. Aussage gegeben. Ich habe unter Java noch keine "Steuerelemente" entwickelt, daher hab ich keinen persönlichen Vergleich, sondern nur die Aussage eines Java-Programmierers, der sich in C# verliebt hat. Womöglich hast du jedoch auch einen Vergleich, da beides schon gemacht.
 
nitronic hat gesagt.:
Getter/Setter
Für mich ist es nicht relevant ob im Hintergrund eine Methode ausgeführt wird, oder eine Variable gesetzt wird. Ich will das wieder zurückbekommen, was ich der Property übergeben habe. Der Vorteil gegenüber Variablen liegt doch darin, dass ich in der Property Prüfungen durchführen kann, die ich bei einer Variable sonst jedes Mal machen müsste.
Das problem ist aber auch das Schlechter Programmierer A auf die Idee kommen könnte jede Propertyänderrung in eine Datenbank zu schreiben.
Und ich wenn ich keinen Unterschied sehe zwischen einer Zuweisung einer variable oder eines Properties diese Zuweisung eventuell ca 1000 mal in einer Schleife durchführe.
1000 Variablen zuweisungen sind aus performance Technischen Gründen kein Problem, aber 1000 Datenbank Querys nehmen den Rechner stark in Beschlagn

nitronic hat gesagt.:
Weiters macht es für mich sehr wohl einen Unterschied, ob ich 20 Methoden oder nur 10 habe. Diejenigen die ich nicht benötige, werden von mir zugeklappt und je weniger in einer Klasse ist, desto übersichtlicher ist sie für mich - hängt aber womöglich vom Programmierstil oder den eigenen Vorlieben ab.

Das Get/Set-Konstrukt unter C# hingegen finde ich selbst genial. Ich muss mir nur eine einzige Methode anzusehen was passiert und nicht zwei.

Wenn deine Get / Setter aber in der versteckten Oberklasse sind hast du eben ein Problem. Und zwar weisst du nicht ob du Programm Code aufrufst oder nicht.

nitronic hat gesagt.:
Hier hast Du mir jedoch keine Antwort auf meine ursprüngliche Frage bzw. Aussage gegeben. Ich habe unter Java noch keine "Steuerelemente" entwickelt, daher hab ich keinen persönlichen Vergleich, sondern nur die Aussage eines Java-Programmierers, der sich in C# verliebt hat. Womöglich hast du jedoch auch einen Vergleich, da beides schon gemacht.
Ich sagte doch das ich bei beiden schon eine Anwendung geschrieben. Dabei ein eigenes "Webservice Protokoll" implementiert habe welches den Ansprüchen gerecht wurde.
Dies habe ich in .net für einen Kunden implementiert und ein halbes Jahr später in einem um einiges geringeren Aufwand in Java neu implementiert und verbessert.

Ich kenne genügend Java Programmierer die über .net zu Java gekommen sind. Das sind noch nicht so viele (weil es noch nicht soviele erfahrene .net Programmierer gibt) aber kommt immer häufiger vor.
 
Ist es nicht so, dass ich in Gettern und Settern unter Java auch weiteren Code angeben kann? Und hierbei sehe ich bei der Implementierung auch nicht unbedingt ob dort eine Variable gesetzt wird, oder eben der Code ausgeführt wird. zB, wenn ich den Source zur entsprechenden Klasse nicht habe ?
 
Original geschrieben von nitronic
Ist es nicht so, dass ich in Gettern und Settern unter Java auch weiteren Code angeben kann? Und hierbei sehe ich bei der Implementierung auch nicht unbedingt ob dort eine Variable gesetzt wird, oder eben der Code ausgeführt wird. zB, wenn ich den Source zur entsprechenden Klasse nicht habe ?

Ja aber du erkennst das du eine set Methode benutzt und nicht nur einer Membervariable einen Wert zuweist.
Sprich wenn du einer protected Variable der Oberklasse (von der mann keine Sourcen hat) einen Wert auf die weise:
variable = wert;
zweist, weisst du das da kein Code ausgeführt wird. Wenn du eine get Methode verwendest
ist dir klar das Code ausgeführt werden könnte.

Bei .net verschwimmen die Grenzen, da es nicht wirklich ersichtlich ist.
 
Du, ich glaube so ganz verstehe ich nicht was Du meinst.

Wenn ich mir eine Klasse mit einer Membervariablen erstelle, dazu die Getter und Setter generieren lasse, dann kann ich in der Setter noch zusätzlich reinschreiben was ich will. ZB erstell ich einen FileWriter, der mir jedes Mal beim Aufruf des Setters etwas an ein File anhängt.

Habe ich nun die Klasse nicht im Quelltext, hab ich keine Möglichkeit zu erkennen, dass im Setter weiterer Code ausgeführt wird. Sogesehen könnte ich genauso eine Datenbank befüllen ohne es zu wissen.

Aber vielleicht bin ich ja noch nicht dort wo Du mit Deinen Gedanken bist ... bis jetzt erkenne ich auf jeden Fall noch keinen Unterschied.
 
Ich habe schon verstanden was du meinst. Aber es stimmt nicht, es sind sehr wohl unterschiede. Hier ein beispiel (auf die schnelle).

Ok nehmen wir an wir wollen eine Applikationschreiben die mit sehr vielen Objecten handeln muss. Wir entschliessen uns das Framework XX von der Firma XY zu nutzen. In diesem Framework haben wir eine Klasse die sich Logger nennt und eben daten logged aufgrund von eines LogLevel der als int (0,1,2) in der Klasse gelogged wird.
Wir wollen aber diese Klasse Logger erweitern um eigene zusätzliche benötigte Logging mechanismen bereitzustellen

Code:
public class Logger {
    public static int NO_LOG = 0;
    public static int MEDIUM_LOG=1;
    public static int FULL_LOG = 2;
    public  int logLevel;
    {
        get
       {
            return logLevel;
        }
        set
       {
            someProperty = value;
            // Security Logging durchführen da 
            // der LogLevel geänder wird.
            // Es wird eine Zeile "loglevel changed to:"
            // ausgegeben.
        }
    }

  // andere methoden / properties usw 
}

meine Klasse sähe dann so aus:

Code:
public class MyLogger : Logger {
   public bool logString(string myString, int exceptionCount) {
           if(exceptionCount < 1) 
                      loglevel = NO_LOG;
           if(exceptionCount > 1 )
                      loglevel = MEDIUM_LOG;
           if(exceptionCount > 100)                     
                      loglevel = FULL_LOG;
           // String loggen:                    
   }
}

Ich werde als Programmierer jetzt ganz erschreckend feststellen das jedesmal
wenn ich logge beu einem expcetionCount > 100 steht in den Logfiles:

loglevel changed to MEDIUM_LOG;
loglevel changed to FULL_LOG;
Logged (FULL_LOG): keine Userdaten vorhanden

ich hätte nur follgenden Eintrag erwartet:
Logged (FULL_LOG): keine Userdaten vorhanden.

Da sich für mich nicht zeigt das Dinge geschehen können die eben allein durch
das zuweisung einer für mich nicht transparenten Variable, bekomme ich ein unerwartetes Ergebnis.

Wenn ich jedoch eine Methode hätte aller changeLoglevel(int new loglevel);
kann ich damit rechnen das sowas passiert. Habe ich ein protected int loglevel und
setze diese aus Java heraus kann ich sicher sein das ausser dem Zuweisen des Wertes nichts passiert.
 
Ich blick zwar noch immer nicht ganz durch was du meinst, aber ich schreib mal das was ich mir gerade denke, in der Hoffnung dass wir langsam dorthin kommen:

Wenn ich deinen geposteten Code 1:1 nach Java konvertiere, hab ich exakt das gleiche "Problem". Ausserdem weißt du in der Property intLoglevel Werte unterschiedlich zu, was in Java auch möglich aber ebenso sinnlos wäre.

Beispiel:

Code:
private int loglevel_ = 0;
public int intLoglevel
{
     get
     {
          return this.loglevel_;
     }
     set
     {
          this.loglevel_ = value;
     }
}

Weiters:
Bei den von Dir angegebenen If-Bedingungen ist klar, dass bei > 100 mehrfache Einträge entstehen. Da würde ich mich als Programmierer nicht wundern.

Alles in allem scheint mir das ein Problem des Programmierers und nicht der Programmiersprache zu sein. Wenn jemand unsauber programmiert, kann er dies auch unter Java tun.
 
Status
Nicht offen für weitere Antworten.

Neue Beiträge

Zurück