C# vs. Java

Status
Nicht offen für weitere Antworten.
Original geschrieben von Norbert Eder
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.

Nein, der entscheidende Punkt ist:

ich kann bei Java mich darauf verlassen das wenn ich:
Code:
loglevel = MEDIUM_LOG;
diese Zuweisung mache, auch garantiert nur die diese Zuweisung durchgeführt wird und kein bischen Programmcode ausgeführt wird.

Bei .net weiss ich das einfach nicht, weil auch bei einer ganz normalen Zuweisung an ein Member Programm code ausgeführt werden kann.

Mann bist du begriffstutzig :)
 
Hehe, sag das doch gleich :)

Folgendes Beispiel, eh von Dir gestohlen :)

Code:
private int MEDIUM_LOG = 1; // wobei hier ne Const besser wäre bzw. ne Enum

loglevel = MEDIUM_LOG;

Da kann auch kein Code ausgeführt werden. Und das weiß ich auch, da MEDIUM_LOG erstens als Variable angezeigt wird und zweitens mit dem Typ int.
Properties werden als Methoden angezeigt und dann weiß ich, dass eventuell Code ausgeführt werden kann.

Ausgeführt werden kann Code, wenn der Wert über eine Property gesetzt wird. Eine Property macht auch insofern Sinn, dass Werte überprüft werden, die Du sonst händisch überprüfen müsstest. Und das gleiche Problem bei nem Setter in Java.
 
Original geschrieben von Norbert Eder

Folgendes Beispiel, eh von Dir gestohlen :)

Code:
private int MEDIUM_LOG = 1; // wobei hier ne Const besser wäre bzw. ne Enum


loglevel = MEDIUM_LOG;

Da kann auch kein Code ausgeführt werden. Und das weiß ich auch, da MEDIUM_LOG erstens als Variable angezeigt wird und zweitens mit dem Typ int.


ARGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

sag mal du kannst schon C# Programmieren und lesen?
;)

Wie setze ich den Wert eines Propertys?

[property] = [value] ;

richtig?
 
Ja, das ist richtig.


Ich sagte aber auch:
Man erkennt ob es eine Property oder eine Variable ist. Demzufolge kann ich unter C# auch sagen ob eventuell Code ausgeführt wird oder nicht.

//EDIT

Gleich unter Java.
 
Original geschrieben von Norbert Eder
Ja, das ist richtig.


Ich sagte aber auch:
Man erkennt ob es eine Property oder eine Variable ist. Demzufolge kann ich unter C# auch sagen ob eventuell Code ausgeführt wird oder nicht.

//EDIT

Gleich unter Java.

Woran erkennt mann das denn?

Also bei

meineVar = 3;

erkenne ich nicht das es ein Property ist.

Original geschrieben von Norbert Eder

//EDIT

Gleich unter Java.

Eben nicht.
Unter Java setzt du entweder:
meineVar = 3; und kannst dir sicher sein das kein Code ausgeführt wird, weil es definitiv kein Property ist.
setMeinVar(3); ist ganz klar als Property zu erkennen.
 
Also das Visual Studio zeigt es mir sehr brav an, dass es eine Property ist, SharpDevelop zeigt es mir schön brav an.

Und nur weil unter Java etwas setVariable heißt, kanns noch immer eine Variable oder ein Setter sein.

Ich kann mir schon vorstellen worauf du hinaus willst - nämlich auf der Art der Übergabe.

Zum einen die Wertzuweisung unter C# und zum anderen die Übergabe eines Parameters unter Java.

Dennoch gibts es unter C# Möglichkeiten herauszufinden ob es sich um eine Variable oder um eine Eigenschaft handelt.
 
Original geschrieben von Norbert Eder
Also das Visual Studio zeigt es mir sehr brav an, dass es eine Property ist, SharpDevelop zeigt es mir schön brav an.
...
Dennoch gibts es unter C# Möglichkeiten herauszufinden ob es sich um eine Variable oder um eine Eigenschaft handelt.

Ja anhand der IDE.
Also muss eine IDE die Designfehler einer Programmiersprache ausbügeln.

Da sind mit die get/set Methoden unter Java lieber.

Code:
Und nur weil unter Java etwas setVariable heißt, kanns noch immer eine Variable oder ein Setter sein.

Falsch, wenn ich eine zuweisung:
meineVar = 3;
mache, kann ich mich zu 100% darauf verlassen das kein Code ausgeführt wird.

Und genau darum geht es. Denn unter Java kann ich Code schreiben wie:
Code:
if(exceptionCount < 1) 
              loglevel = NO_LOG;
if(exceptionCount > 0 )
              loglevel = MEDIUM_LOG;
if(exceptionCount > 100)                     
              loglevel = FULL_LOG;
Und weiss zu 100% das er bei einem exceptionCount von 120 zwar erst loglevel = MEDIUM_LOG setzt und dann loglevel = FULL_LOG setzt.
Sprich das loglevel = MEDIUM_LOG ist eine unnötige zuweisung, die aber Performancetechnisch absolut gar keine rolle spielt.
Unter C# könnte ich mir durch solchen Code ins Bein schiessen, wenn eben in der set Methode von loglevel irgendwas anderes passiert.
dor müsste ich den Code umarbeiten auf
if(exceptionCount < 1)
loglevel = NO_LOG;
if(exceptionCount > 1 && expcetionCount < 100)
loglevel = MEDIUM_LOG;
if(exceptionCount > 100 && expcetionCount < 1000)
loglevel = FULL_LOG;
usw

Sprich ein einfaches durchfallen lassen, könnte mich den Kopf kosten ;)
Unter Java kann ich mich darauf verlassen das eine Variablen zuweisung eine Variablen zuweisung ist, und eine Variablen zuweisung bleibt.
 
Gut, ohne IDE ist es nicht zu erkennen - gebe ich Dir recht.

Hier ist es allerdings so, dass die Core-Klassen des Frameworks da keinen Code ausser Überprüfungen ausführen. Bei eigenen Klassen weißt Du was passiert und ansonsten gibt es noch eine Dokumentation. Gibt es keine Dokumentation war der andere Programmierer unsauber und so wird vermutlich auch die Componente bzw. der Code dahinter aussehen.

Aus diesen Blickwinkeln stellt dies absolut kein Problem dar.

99% der Entwickler verwenden jedoch eine IDE (zumindest ist das unter Windows so) und mit HIlfe der IDE kannst Du dies feststellen.

Ausserdem gibt es noch einen Punkt den es zu beachten gilt:

Properties sind hauptsächlich für UserControls gedacht. Du hast genauso die Möglichkeit reine Getter und Setter Methoden zu implementieren. Und hier kannst Du natürlich wieder feststellen ob es sich um eine Methode oder um eine Variable handelt..
 
... und was fällt mir als Laie dazu ein?

Beide, sowohl C# als auch Java haben keine "Conditional Switch/Case/Break".

Wie schön ist doch, wenn ich das von euch beschriebene
Problem so lösen kann in "meiner" Sprache:
Code:
case TRUE of
  (exeptionCount > 100):
    loglevel = FULL_LOG
  (exeptionCount > 0):
    loglevel = MEDIUM_LOG
  (exeptionCount < 1):
    loglevel = NO_LOG
end case
nur zur Info: In Lingo (das ist die Sprache) braucht man keine breaks setzen.

So ists nämlich hübsch, übersichtlich UND eindeutig :)
Oder hab ich was übersehen?
 
Original geschrieben von Norbert Eder
Gut, ohne IDE ist es nicht zu erkennen - gebe ich Dir recht.

Hier ist es allerdings so, dass die Core-Klassen des Frameworks da keinen Code ausser Überprüfungen ausführen. Bei eigenen Klassen weißt Du was passiert und ansonsten gibt es noch eine Dokumentation. Gibt es keine Dokumentation war der andere Programmierer unsauber und so wird vermutlich auch die Componente bzw. der Code dahinter aussehen.

Wenn ich mich in einen Code reinarbeite dann lese ich diesen. Die beste Dokumentation ist der Code.
Doku brauch ich bei Dingen die nicht so einfach herauszulesen sind.
Eine Variablenzuweisung ist aber nichts wofür ich extra in der Doku nachschlagen will ob es ein Property ist oder eine Variable.

Original geschrieben von Norbert Eder

Aus diesen Blickwinkeln stellt dies absolut kein Problem dar.

Liest du dich in andere Projekte bei jeder Zeile Code in der Doku nach?
Also ich habe nicht die Zeit jede Zeile durchzugehen und mit meiner IDE zu inspizieren
ob da noch was dahinter steckt.
Eine Programmiersprache (von der IDE abgesehen) muss mir die Möglichkeit liefern
den Code zu erfassen, das ist Aufgabe der Programmiersprache, und wenn diese das
Aufgrund eines Designfehlers nicht kann, dann ist das schlecht. Sprich dein genannter
Nachteil von Java get und set Methoden zu schreiben ist eigentlich ein Vorteil gegenüber
.net.
Das wirst du, so uneinsichtig wie du mannchmal bist, wieder nicht einsehen und mit irgendwelchen
Argumenten wie eben das sogar kostenlose IDEs das darstellen können oder dieses und jenes
tool gibt. Punkt ist, die Sprache ansich leistet das nicht, was sie sollte.


Original geschrieben von Norbert Eder

99% der Entwickler verwenden jedoch eine IDE (zumindest ist das unter Windows so) und mit HIlfe der IDE kannst Du dies feststellen.

Wenn du 2000 Zeilen Code vor dir hast, musst du mit deiner IDE entweder mit der Mouse über die Zuweisungen schweben um die Hilfe zu bekommen oder eine andere Aktion ausführen.
Das heisst mann kann den Code nicht einfach nur mit den Augen ergründen.

Original geschrieben von Norbert Eder

Properties sind hauptsächlich für UserControls gedacht. Du hast genauso die Möglichkeit reine Getter und Setter Methoden zu implementieren. Und hier kannst Du natürlich wieder feststellen ob es sich um eine Methode oder um eine Variable handelt..

Nein da irst du dich. Properties sind für Eigenschafften gedacht die von anderen Programmen durch reflection herausgefunden werden können.
Sie werden u.a in UserControls genutzt, aber nicht ausschliesslich und nicht am meisten. So nutzen einige XML Librarys und auch einige Loggin Mechanismen die Möglichkeit Properties auszulesen und anhand diesen Zustände der Objecte zu analysieren. UserControls und GUI Builder sind nur ein Teil der Programme die Properties nutzt.

Wenn ich dann unter C# get und set Methoden wie unter Java nutzen soll dann kann ich keine Properties benutzen weil eben Programme wie UML tools dies nicht als Properties verstehen. Ich würde auch nie auf die Idee kommen unter C# getBla und setBla Methoden zu nutzen da dies keine Properties sind, und so auch nicht von meinen Werkzeugen erkannt werden. Also muss ich damit leben das unter .net die Art wie Properties behandelt werden auf den 1. Blick ja ganz nett ist aber letztendlich Probleme verursacht.
Ich habe immer zugegeben das es Dinge bei C# gibt, die sie ganz nett umgesetzt haben und das besser geregelt haben wie in Java. Ok sie hatten ja viel Zeit neue Features zu entwickeln da ja 90% von Java abgeschaut worden ist ... :rolleyes:
So ist autoboxing und foreach eine *wirkliche* Verbesserrung. Die get / set Properties unter .net sind es aber auf gar keinen Fall.
Im übrigen ist Sun ja auch nicht doof, und was von vielen als Verbesserrung empfunden worden ist wurde in 1.5 auch umgesetzt wie eben autoboxing und foreach ;)
 
Status
Nicht offen für weitere Antworten.

Neue Beiträge

Zurück