|
You last visited: Today at 09:45
Advertisement
Ich hasse ...
Discussion on Ich hasse ... within the General Coding forum part of the Coders Den category.
02/01/2016, 16:09
|
#1
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Ich hasse ...
Nun wer kennt das nicht, man ist schön am Programmieren in seinem Workflow, und dann ist da so eine Sache, eine Kleinigkeit, die einen einfach nur zur Weißglut bringt. Das kann sein: eine Eigenheit der Programmiersprache, eine Funktion aus der IDE die sich anders verhält als erwaretet, eine Komponente von Drittanbiertern die Verbuggt ist, oder einfach ein Probleme/Eigenschafften mit der Programmumgebung.
In genau solch einem Moment dachte ich mir, es fehlt hier ein Thread auf dem man sich über seinen Unmut auslassen kann, ein Ventil für den Hass in einem. Vor allem, da solche Geschichten auch noch einen gewissen Entertainment Wert haben.
Darum eröffne ich nun diesen Thread, indem ihr euch über alles auslassen könnt was euch stört, von den kleinsten Kleinigkeiten bis hin zu großen Problemen und Bugs, und an alle die das lesen, nehmt das nicht so ernst, ist letztlich doch eh nur Shittalking :P
Fange ich mal an, und da ich als unverbesserlicher Geschichtenerzähler einen Hang zur Prosa habe, greife ich tief in die Metapherkiste und verpasse meinem Hass das hübsche Gesicht einer Erzählung:
Java, du warst für mich schon immer wie ein ungewolltes Kind, welches zwei Abtreibungen überlebt hat, und dennoch auf die Welt kam. Ich mag dich nicht, doch über die Zeit habe ich deine Exsistenz in meinem Leben zu akzeptieren gelernt. Ich habe mich damit abgefunden dass du nicht der schnellste bist, oder gar benutzerfreundlich, und ich kann mit den meißten deiner Eigenschafften mittlerweile gut leben, aber das neulich hat den Vogel abgeschossen.
Welchem deiner Entwickler wurde denn bitte ins Hirn geschissen kein Call by Reference einzubauen? Das deine Entwickler nicht immer die besten Entscheidungen für das Sprachdesign getroffen haben ist mir schon lange klar, aber die anderen Entscheidungen konnte ich wenigstens nachvollziehen, aber diese Entscheidung ist für mich komplett undurchsichtig, ja gar Hirnverbrannt. Als Begründung heißt es, das Call by Reference zu Fehleranfällig wäre, und wenn man nicht weiß was man macht es alles nur verschechtern würde, aber sind wir mal ehrlich, wer Call by Reference verwendet weiß wenigstens was das ist. Ich habe noch nie gehört oder gesehen dass jemand ausversehen Call by Reference verwendet hat, wie auch, wenn man nicht mal weiß dass es exsitiert wie soll man es dann verwenden? Oder glauben Leute wirklich dass man ausversehen mal ein ByRef, ein Var oder ein & vor den Parameter schreibt ohne es zu merken? Bevor das geschieht würde eher Tokio Hotel verkleidet als Hitlers Regimsstab vor dem Championsligue Finale auf dem Spielfeld ihren Song, "Durch den Monsun" spielen während im Refrain Farid Bang als Mussolini verkleidet noch ein paar Punchlines droppt.
Aber halt es gibt doch Workarounds für das, werden einige Leute jetzt sagen, man kann immerhin ein Objekt einer Wrapperklasse oder ein einelementiges Array verwenden.
Sag mal seid ihr ballaballa? Eine Wrapperklasse zu schreiben, sind mal mindestens 5 Zeilen, ein Array zwar nur 2, aber selbst wenn es nur eine Zeile mehr wäre sieht das Bescheuert aus. Wer diesen Code sieht fragt sich dann erst mal ob der Entwickler Gebratene Nudeln Süß-Sauer im Hirn hat, oder warum er so einen Müll fabriziert. Und als Entwickler kommt man sich einfach nur Blöd vor einen Array zu verwenden, nur weil die Entwickler von dir der Meinung waren eine vernünftige Implementation wäre zu fehleranfällig.
Und ich weiß das ich damit aus einer Mücke einen Elephanten mache, aber das hat mich grade einfach nur aufgeregt
|
|
|
02/01/2016, 16:30
|
#2
|
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
|
Quote:
|
Wer diesen Code sieht fragt sich dann erst mal ob der Entwickler Gebratene Nudeln Süß-Sauer im Hirn hat, oder warum er so einen Müll fabriziert.
|
Finde ich auch. Ich habe sowas aber auch noch nie in irgendeiner Library gesehen. Die ganze Java-Welt kommt ohne Call By Reference aus. Vielleicht entwirfst du deine APIs falsch (für Java)?
|
|
|
02/01/2016, 16:45
|
#3
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Quote:
Originally Posted by algernong
Finde ich auch. Ich habe sowas aber auch noch nie in irgendeiner Library gesehen. Die ganze Java-Welt kommt ohne Call By Reference aus. Vielleicht entwirfst du deine APIs falsch (für Java)?
|
Sehr wahrscheinlich, ich bin kein Java Entwickler, und nutze Java nur wenn ich muss, Java Entwickler kennen das Problem wohl nicht mal, aber ich bin nun mal daran gewöhnt diese Möglichkeit zu haben, darum denke ich auch zunächst daran.
Aber wie gesagt, ist alles nur Shittalking was mich aufregt, ob es Sinn macht oder nicht sich darüber auszulassen steht in einem anderen Buch geschrieben
|
|
|
02/01/2016, 16:46
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Quote:
Originally Posted by warfley
Welchem deiner Entwickler wurde denn bitte ins Hirn geschissen kein Call by Reference einzubauen? [...] Bevor das geschieht würde eher Tokio Hotel verkleidet als Hitlers Regimsstab vor dem Championsligue Finale auf dem Spielfeld ihren Song, "Durch den Monsun" spielen während im Refrain Farid Bang als Mussolini verkleidet noch ein paar Punchlines droppt.
|
Hat mich sowas von meinem Stuhl weggefegt...
In Java ist das generell Praxis mit Speicheradressen nicht zu hantieren und deswegen haben sie das vermutlich auch weggelassen obwohl sie sowas auf freiwilliger Basis hätten implementieren können.
Derjenige der weiß was es ist kann es ja nutzen und die die es nicht wollen lassen es einfach.
Nichtsdestotrotz könnte man das ganze hier auch im Coders Chit-Chat handeln und brauch keinen Extrathread dazu. Mal schauen was andere davon halten.
|
|
|
02/01/2016, 20:04
|
#5
|
elite*gold: 0
Join Date: Sep 2008
Posts: 9,484
Received Thanks: 3,109
|
Also ich selbst entwickle aktuell hauptsächlich (leider) in Java und muss sagen, dass mir diese Möglichkeit noch nie gefehlt hatte.
Zumal an sich Java das automatisch macht. Der JIT der VM ist an sich so gut, dass er kein neues Objekt anlegt, sondern oft auch einfach ein vorhandenes verändert, wenn der Garbage-Collector merkt, das alte Objekt wird nicht mehr gebraucht.
Soweit ich weiß, funktioniert das Speichermanagement der JVM sehr gut, so dass es keinen Grund gibt, direkt den Speicher anzusprechen...
|
|
|
02/01/2016, 20:35
|
#6
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Aber halt es gibt doch Workarounds für das, werden einige Leute jetzt sagen, man kann immerhin ein Objekt einer Wrapperklasse oder ein einelementiges Array verwenden.
Sag mal seid ihr ballaballa? Eine Wrapperklasse zu schreiben, sind mal mindestens 5 Zeilen, ein Array zwar nur 2, aber selbst wenn es nur eine Zeile mehr wäre sieht das Bescheuert aus. Wer diesen Code sieht fragt sich dann erst mal ob der Entwickler Gebratene Nudeln Süß-Sauer im Hirn hat, oder warum er so einen Müll fabriziert. Und als Entwickler kommt man sich einfach nur Blöd vor einen Array zu verwenden, nur weil die Entwickler von dir der Meinung waren eine vernünftige Implementation wäre zu fehleranfällig.
|
Wieso solltest du die selbst schreiben müssen? Für alle primitiven Typen gibt es ja ohnehin eingebaute Wrapper-Klassen (z.B. int -> Integer) und das sind auch die einzigen Typen mit Wertsemantik, sprich bei denen das Fehlen von CallByRef ernsthaft auffällt. Alle normalen Klassen haben Referenzsemantik.
Ok, du kannst (anders als in C#) nur das Objekt modifizieren, nicht die übergebene Referenz selbst, aber Letzteres wird eigentlich so selten benötigt, dass es nicht mal alle C#-Entwickler kennen. Man braucht halt nicht unbedingt out-Parameter.
Quote:
|
In Java ist das generell Praxis mit Speicheradressen nicht zu hantieren und deswegen haben sie das vermutlich auch weggelassen obwohl sie sowas auf freiwilliger Basis hätten implementieren können.
|
Mit Speicheradressen hat das rein gar nichts zu tun. Referenzen bzw. CallByRef bedeutet nicht, dass du frei die Adresse manipulieren kannst.
In C# gibt es die Schlüsselwörter out und ref, mit denen du die damit markierten Parameter zu Referenzen machst. Das findet primär bei primitiven Typen Anwendung, die ja beim Funktionsaufruf normalerweise kopiert werden und sich daher nicht von der aufgerufenen Methode nach außen sichtbar modifizieren lassen (weil nur die lokale Kopie innerhalb der Methode modifiziert wird). Klassen haben ohnehin Referenzsemantik, weshalb du den Objektinhalt auch ohne das ref Schlüsselwort in dieser Art modifizieren kannst. Das ref Schlüsselwort bewirkt allerdings eine Referenz auf die übergebene Variable, weshalb sich damit also sogar die Variable selbst (die ja nur auf das Objekt auf dem Heap verweist) von der Methode aus modifizieren lässt.
Im Klartext heißt das, dass Folgendes geht:
Code:
void Method(ref object arg)
{
arg = new object();
}
object obj = null;
Method(obj);
//obj zeigt nun auf ein Objekt
Während hier ohne das ref Schlüsselwort die Variable obj nicht verändert werden würde.
Das ist zumeist eher für Factory-Methoden oder solche wie TryParse mit "mehreren Rückgabewerten" (ein boolscher Rückgabewert für Erfolg/Misserfolg und ein out-Parameter für den geparsten Wert) hilfreich und das ist nun mal eine ziemlich kleine Minderheit.
In der Regel möchte man nur den Inhalt eines Objekts modifizieren und das geht ohnehin mit jedem:
Code:
Method(List<object> list)
{
list.Add(new object());
}
List<object> list = new List<object>();
Method(list);
//list enthält nun ein Element
|
|
|
02/01/2016, 21:01
|
#7
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Quote:
Originally Posted by MrSm!th
Wieso solltest du die selbst schreiben müssen? Für alle primitiven Typen gibt es ja ohnehin eingebaute Wrapper-Klassen (z.B. int -> Integer) und das sind auch die einzigen Typen mit Wertsemantik, sprich bei denen das Fehlen von CallByRef ernsthaft auffällt. Alle normalen Klassen haben Referenzsemantik.
Ok, du kannst (anders als in C#) nur das Objekt modifizieren, nicht die übergebene Referenz selbst, aber Letzteres wird eigentlich so selten benötigt, dass es nicht mal alle C#-Entwickler kennen. Man braucht halt nicht unbedingt out-Parameter.
|
Wie gesagt ich denke für die Java Programmierer stellt sich so ein Problem gar nicht, da ich allerdings hauptsächlich in Pascal programmiere, wo Referenz oder Out Parameter gang und gebe sind bin ich daran nur einfach gewöhnt. Das Problem war ich hatte eine Datenstruktur für die Uni geschrieben und bei der Gestaltung der Datenstruktur den Fehler gemacht nicht daran zu denken dass Java eben kein Call by Reference unterstützt, und meine Datenstruktur darauf ausgelegt. Bei der letztlichen Implementierung hatte ich dann keine Zeit mehr die Datenstruktur zu ändern, und musste solch eine Workaround nutzen.
Was mich vor allem stört ist die Tatsache, dass ich keinen Grund sehe so etwas nicht einzubauen, Java ist auch die einzige Imperative Programmiersprache (die ich kenne) welche kein Call by Refernece unterstützt. Das soll auch keine Große Kritik an Java sein, denn genug Leute scheinen damit ja zurecht zu kommen, ich wollte nur meinem Impulsiven Unmut in dieser Situation Ausdruck verleihen. Allein aufgrund der Tatsache dass ich so wenig mit Java arbeite könnte ich nicht mal eine Fundierte Kritik dazu abliefern.
Das ist halt so ein Typisches Problem wenn man gleichzeitig mit mehreren Sprachen arbeitet da kommt man schnell mal durcheinander und stört sich an solchen kleinigkeiten
|
|
|
02/01/2016, 22:29
|
#8
|
elite*gold: 0
Join Date: May 2010
Posts: 6,853
Received Thanks: 5,106
|
Mein Aufreger des Tages war, wie fast immer auf der Arbeit, die tolle Delphi 2010 IDE, welche ihre Qualitäten als "Zicke" unter den IDEs doch immer wieder gerne unter Beweis stellen kann, z.B. mit Fehlermeldungen ala "Zu wenig Arbeitsspeicher [um zu kompilieren]" ob noch über 6GB verfügbar sind oder man nach Strg + Leertaste sich erstmal nen Kaffee holen kann, weil im Hintergrund alles komplett neu kompiliert wird.
|
|
|
02/10/2016, 14:02
|
#9
|
elite*gold: 21
Join Date: Jun 2009
Posts: 599
Received Thanks: 64
|
Ich weiss einfach nicht wo ich hänge. Könnte kotzen.
Will mit PHP ne IP in ner MySQL DB speichern, es will aber alles nicht so wie ich will.
Entweder kommt nur ramsch dabei raus, oder es speichert einfach GARNIX.
WAS IS DAS MAN.
Stimmt so n Thread hat echt gefehlt
|
|
|
02/16/2016, 16:00
|
#10
|
elite*gold: 67
Join Date: Aug 2014
Posts: 1,323
Received Thanks: 928
|
Quote:
Originally Posted by MrSm!th
Im Klartext heißt das, dass Folgendes geht:
Code:
void Method(ref object arg)
{
arg = new object();
}
object obj = null;
Method(obj);
//obj zeigt nun auf ein Objekt
Während hier ohne das ref Schlüsselwort die Variable obj nicht verändert werden würde.
|
Nice try. Object ist aber ein referenztyp und kann daher ohne ref uebergeben und veraendert werden.
ref brauchst du nur bei ValueType's wie z.b. nem struct, int oder string.
|
|
|
02/16/2016, 16:11
|
#11
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Quote:
Originally Posted by Xio.
Nice try. Object ist aber ein referenztyp und kann daher ohne ref uebergeben und veraendert werden.
ref brauchst du nur bei ValueType's wie z.b. nem struct, int oder string.
|
Nein, in diesem Fall wird das Objekt als Zeiger betrachtet, der verändert wird, nicht das Objekt wird verändert sonder die referenz selbst. Und ein Zeiger wiederum ist ein Value-Typ während das Objekt auf das gezeigt wird (durch diesen Zeiger) Referenz-Typ ist. Die Referenz wird erst zugewiesen durch die Methode, ohne ref würdest du eine neue Instanz erstellen, den Zeiger dann in den Parameter schreiben, welcher nach dem ausführen der Funktion verloren gehen würde, ref macht daraus dann einen Zeiger auf einen Zeiger, wodurch der Zeiger selbst verändert werden kann.
|
|
|
Similar Threads
|
ich hasse es
11/07/2012 - Flyff Private Server - 0 Replies
edit: pls löschen wollte eigendlich ne umfrage starten
|
All times are GMT +1. The time now is 09:46.
|
|