|
| » myCSharp.de Diskussionsforum |
|
|
|
|
Autor
 |
|
svenson
myCSharp.de-Poweruser/ Experte
Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003 Herkunft: Berlin
|
|
| Zitat von Khalid: |
| Was eigentlich gar nicht so schlecht ist. Wäre IMHO ziemlich fatal, wenn aufeinmal die ganze Anwendung zickt, nur weil sich irgendwo in irgendeiner anderen Assembly ein Defaultwert sich ändert. |
Genau DAS produziert gerade die Lösung von VB.NET und C# 4.0.
Beispiel:
Du hast irgendwo eine Blockgröße von 32 KB als optionalen Wert. Der Aufrufer verzichtet bisher einen Wert zu setzen (im Code). Der Compiler setzt aber nun einen Aufruf mit 32 KB ein.
Jetzt ändert sich das Modul, welches die Funktion implementiert. Die maximal erlaubte Blöckgröße reduziert sich aber auch 16 KB, ebenso der Default-Wert des optionalen Parameters.
Modul compiliert (Aufrufer nicht), Anwendung gestartet und BOOOOOOM!
Würden Default-Werte auschließlich im Aufgerufenen implementiert, passiert das nicht.
Optionaler Parameter sollte heissen: "Da kümmer ich mich nicht drum, mir egal". Genau DAS ist nun nicht der Fall.
Man sollte also die Verwendung von optionalen Parametern auf Assembly-interne Methoden beschränken oder auf Felder, die garantiert unkritisch bei der Veränderung des Default-Wertes sind.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am 28.10.2008 16:11.
|
|
28.10.2008 16:09
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
JAck30lena
myCSharp.de-Team (Admin)
Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.
|
|
ich schließe mich svenson an. optional heißt im moment nur "ich muss nciht tippen" und hat daher keinen nennenswerten mehrwert. mir würde es mehr gefallen, wenn sich die änderung an allen refernzierenden assemblies auswirkt. weil wenn ich definitiv einen wert benötige, dann setze ich diesen wert sowieso. auch wenn dieser der defaultwert ist. gefährlich ist es daher auch einfach nichts einzutippen, weil man denkt das der default sowieso der ist den man haben will.....
|
|
28.10.2008 16:17
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
| Zwischen diesen beiden Beiträgen liegen mehr als 8 Monate. |
Briefkasten
myCSharp.de-Mitglied
Dabei seit: 07.04.2004
Beiträge: 420
Entwicklungsumgebung: Visual Studio Express 2005
|
|
[EDIT=herbivore]Threads zusammengefügt[/EDIT]
Hallo,
und schon wieder kommt eine neue .NET C# Version (4) auf uns zu.
Wie seht ihr den Entwicklungstrend von C#? Freut ihr euch auf die Erneuerungen oder seid ihr enttäuscht?
Seht ihr es positiv, dass es zu jeder Version Syntaktische Änderungen gibt?
Quelle: heise.de
| Zitat: |
| Eine mit dem Schlüsselwort "dynamic" deklarierte Variable löst nicht mehr der Compiler, sondern die CLR zur Laufzeit auf. In Visual Basic gab es dieses späte Binden schon zu Zeiten des klassischen Visual Basic durch den Typ "Object"; in C# ging das bisher nur umständlich über die Reflection-Bibliothek. Die dynamische Programmierung bietet Vorteile beim Umgang mit COM-Objekten und im Zusammenspiel mit dynamischen Programmiersprachen wie Python und Ruby. Auch mit optionalen und benannten Parametern zieht C# endlich gleich mit Visual Basic. Neu sind hingegen Co- und Contravarianz für Typparameter, die Zuweisungen zwischen Objektmengen mit verwandten Typen ermöglicht. |
| Zitat: |
| Die neuen Sprachfunktionen halten sich demnach in Grenzen (verglichen mit den großen Wellen, die es in .NET 2.0 und .NET 3.5 gab). Interessant ist die Aussage von Mads Torgersen, Produktmanager für C#, im Dokument "New features in C# 4.0", dass C# und Visual Basic in Zukunft hinsichtlich ihrer Funktionen noch mehr im Gleichschritt gehen sollen als bisher. "Die Sprachen sollen sich in Stil und Gefühl unterscheiden, nicht in ihrem Funktionsumfang". |
Ich bin etwas enttäuscht, dass C# weg von den streng Typisierten Typen will. (var, dynamic). Das geht immer mehr in Richtung Visual Basic.NET.
Auch sind die Releases der .NET Versionen ziemlich knapp wie ich finde:
.NET 1.0 - 2002 - CLR 1.0
.NET 1.1 - 2003 - CLR 1.1
.NET 2.0 - 2005 - CLR 2.0
.NET 3.0 - 2006 - CLR 2.0
.NET 3.5 - 2008 - CLR 2.0
.NET 4.0 - 2009 - CLR ?
In dieser Tabelle sieht man auch sehr gut, dass sich seit dem .NET 2.0 Framework die CLR nicht mehr geändert hat. Ab dem dritten .NET Framework wurde es lediglich um Bibliotheken erweitert.
Findet ihr es gut, dass jedes 2te Jahr eine neue .NET Version released wir? Warum wir ein bestehendes .NET Framework nicht einfach um Bibliotheken erweitert ?
Was meint ihr?
Was meint ihr zur Thematik?
|
|
30.06.2009 23:12
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.495
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo Briefkasten,
in dem Thread, an den ich deinen Beitrag angehängt habe, sind einige deiner Fragen schon beantwortet.
herbivore
|
|
01.07.2009 02:10
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
winSharp93
myCSharp.de-Team (Moderation)
Dabei seit: 19.01.2007
Beiträge: 5.711
Entwicklungsumgebung: VS 2010 Professional Herkunft: Freiburg / Stuttgart
|
|
Hallo Briefkasten,
um nochmal meine Meinung zusammenzufassen:
| Zitat von Briefkasten: |
| Wie seht ihr den Entwicklungstrend von C#? Freut ihr euch auf die Erneuerungen oder seid ihr enttäuscht? |
Ehrlich gesagt bin ich eher enttäuscht. So etwas wie non-nullable Typen aus Spec# hätten sie ruhig einbauen können.
Außerdem hätten sie ruhig Co- / Contravarianz beim Überschreiben vererbter bzw. implementieren von Membern erlauben können.
| Zitat von Briefkasten: |
| Ich bin etwas enttäuscht, dass C# weg von den streng Typisierten Typen will. (var, dynamic). Das geht immer mehr in Richtung Visual Basic.NET. |
Man darf die Dynamik in C# keineswegs als "neuen Weg" sehen. Viel mehr ist es so, dass ein Großteil der Neuerungen der Interoptibiltät dienen (Office, F# (DLR allgemein), etc.).
var sehe ich mehr als einen Workaround denn eine wirkliche Hilfe. Im Zusammenhang mit LINQ will man halt nicht immer zeilenfüllende Variablentypen schreiben...
| Zitat von Briefkasten: |
| In dieser Tabelle sieht man auch sehr gut, dass sich seit dem .NET 2.0 Framework die CLR nicht mehr geändert hat. Ab dem dritten .NET Framework wurde es lediglich um Bibliotheken erweitert. |
Das 4er Framework kommt ja mit einer neuen CLR.
Mich persönlich störend die kurzen Releasezyklen nicht - im Gegenteil: Das zeugt IMHO von Innovation.
| Zitat von Briefkasten: |
| Warum wir ein bestehendes .NET Framework nicht einfach um Bibliotheken erweitert ? |
Verstehe ich auch nicht so ganz - vermutlich Marketingzwecke...
"Für dieses Programm brauchen sie das .NET Framework in Version 2.0 mit der Windows Presentation Foundation mindestens in Version 3 und zusätzlich die WCF Runtime 1.5". (Versionen frei erfunden) Ist vielleicht doch besser so, wie es jetzt ist
|
|
01.07.2009 08:03
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Golo Roden
myCSharp.de-Poweruser/ Experte
Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010 Herkunft: Riegel am Kaiserstuhl
|
|
Zum einen, vielleicht noch ganz lesenswert: http://www.des-eisbaeren-blog.de/post/20...wider-C-40.aspx
Zum zweiten: Zu der Frage "Warum eine neue CLR?" - sie hätten die Erweiterungen für die Parallelprogrammierung in die 2.0 nicht wirklich gut integriert bekommen, ohne etwas verändern zu müssen. Daher die neue Version.
Sieht man auch sehr schön, wenn man die TPL mal als CTP für 2008 und die aus VS 2010 Beta 1 vergleicht - die von 2010 ist um Längen schneller.
|
|
01.07.2009 08:56
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
kleines_eichhoernchen
myCSharp.de-Poweruser/ Experte
Dabei seit: 07.11.2006
Beiträge: 3.971
Entwicklungsumgebung: Visual Studio 2005 (C#) Herkunft: Ursprünglich Vogtland, jetzt Much
|
|
| Zitat: |
| Ich bin etwas enttäuscht, dass C# weg von den streng Typisierten Typen will. (var, dynamic) |
Var ist streng typisiert. Der C#-Compiler nimmt den Typ der ersten Zuweisung. Eine spätere Zuweisung eines nicht implizit konvertierbaren Typs schlegt mit einer Compiler-Meldung fehl. bei Dynamic hast du ja schon selbst geschrieben, wozu dieses verwendet wird (für COM).
|
|
01.07.2009 09:00
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Khalid
myCSharp.de-Poweruser/ Experte
Dabei seit: 19.07.2005
Beiträge: 3.247
Entwicklungsumgebung: Visual Studio 2012 Herkunft: Hannover
|
|
| Zitat: |
| Wie seht ihr den Entwicklungstrend von C#? Freut ihr euch auf die Erneuerungen oder seid ihr enttäuscht? |
Freuen:
Ich finde dynamic sehr interessant. Im Bereich Office Interop wird dadurch vieles leichter und einfacher. Kein ewiges (ref missing, ref missing , ref missing, ... ;)) mehr. Das macht jetzt der Compiler für einen.
Enttäuscht und IMHO der wohl größte Fehler:
Optionale Parameter
| Zitat: |
| Warum wir ein bestehendes .NET Framework nicht einfach um Bibliotheken erweitert ? |
Naja, wird es ja an sich. Nur die CLR 4.0 musste sein, da einige Sprachfeatures einfach für die CLR 2.0 zu viel wären. Paralells wurde ja bereits genannt. Alle weiteren späteren Featuren werden danach wahrscheinlich wieder auf die CLR 4.0 aufbauen. Hoffe ich jedenfalls :)
|
|
01.07.2009 09:46
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
dN!3L
myCSharp.de-Poweruser/ Experte
Dabei seit: 13.08.2004
Beiträge: 2.829
|
|
Hallo zusammen,
wie Golo auch, finde ich, dass "Ko- und Kontravarianz [...] mit Sicherheit nicht nur das am wenigsten beachtete, sondern auch am wenigsten verstandene Merkmal [sind] – zugleich jedoch auch das leistungsfähigste. Schließlich ermöglichen diese beiden Aspekte eine deutlich bessere Verwendung von Schnittstellen und implementierenden, aber spezialisierenden Klassen." Da habe ich mich schon mehr als oft drüber geärgert, dass das nicht ging.
Ebenso (wie schon mehrmals erwähnt) wären die optionalen Parameter ein schönes Feature gewesen - guckt man sich aber die Implementierung an, ist das aber eher fraglich. Sollte man sie wirklich einsetzten, muss man als Aufgerufener schon sehr sehr diszipliniert sein, damit das nicht irgendwann mal in die Hose geht.
Beste Grüße,
dN!3L
P.S.: Mit fehlt für ein "richtiges" neues C# noch der ??=-Operator
|
|
01.07.2009 10:17
|
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.495
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo Briefkasten,
| Zitat: |
| Ich bin etwas enttäuscht, dass C# weg von den streng Typisierten Typen will. (var, dynamic). Das geht immer mehr in Richtung Visual Basic.NET. |
wie schon gesagt ist var nur eine Schreiberleichterung, die aber sofort zur Compilezeit in einen konkreten Typ aufgelöst wird und dadurch streng typisiert ist. Und dynamic muss man ja nicht nutzen. Wenn man es nicht tut, ist auch weiterhin alles zur Compilezeit festgelegt und streng typisiert. dynamic ist also eine optionale Erweiterungen, die man benutzen kann, wenn man will, die aber nichts aufweicht, wenn man sie nicht benutzt. Und var weicht nicht mal etwas auf, wenn man es benutzt.
Hallo svenson, hallo zusammen,
um nochmal auf die Sache mit den optionalen Parametern/Default-Werten zurück zu kommen:
| Zitat: |
| Du hast irgendwo eine Blockgröße von 32 KB als optionalen Wert. [...] Die maximal erlaubte Blöckgröße reduziert sich aber auch 16 KB. |
Dein Beispiel knallt doch nicht wegen des eincompilierten Default-Werts, sondern weil sich der zulässige Wertebereich für den Parameter geändert hat. Es ist doch - auch ohne Default-Werte - der Normalfall, dass die konkreten Parameterwerte im Aufrufer stecken. Die 32 hätte ja nicht nur per Default-Wert in den Code des Aufrufers kommen können, sondern einfach durch die bewusste Entscheidung des Aufrufers, explizit 32 zu übergeben. Und dann würde es in deinem Beispiel genauso knallen. Sprich das Problem sind nicht die Default-Werte, sondern die Änderung der Schnittstelle. Daher finde ich dein Beispiel ungeeignet und sogar irreführend.
Deine Argumentation, dass es schlecht ist, wenn der Compiler Konstanten aus dem Code des Aufgerufenen in den Code des Aufrufers "injiziert", mag bei bei const vs. readonly stimmen, aber bei Default-Parametern nicht.
Es kommt nicht mal darauf an, was es für den Aufrufer bedeutet, wenn er einen Parameter beim Aufruf weglässt. Also ob er sich sagt "Da kümmer ich mich nicht drum, mir egal." oder "Ich will genau diesen Wert, aber kann mir das Tippen sparen." Fakt ist, dass eine Anwendung weiterhin funktionieren muss, wenn sich eine benutze DLL ändert, sonst ist es ein breaking change.
Wir reden hier also allenfalls über eine möglicherweise höhere oder niedrigere Flexibilität beim Ändern des aufgerufenen Codes. Aber da halte ich es gar nicht für ausgemacht, wann die Flexibilität höher ist. Es kommt vermutlich auf den Einzelfall an, ob die Flexibilität höher ist, wenn man Default-Werte per Überladungen (Default-Wert ist in den Aufgerufenen compiliert) oder per optionale Parameter (Default-Wert ist in den Aufrufer compiliert) realisiert. Aber alleine, dass man diese Wahlmöglichkeit jetzt hat, erhöht doch schon die Flexibilität. Die einzige Frage ist, ob diese Flexibilität von den Programmierern auch bewusst eingesetzt wird.
herbivore
|
|
01.07.2009 10:21
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Golo Roden
myCSharp.de-Poweruser/ Experte
Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010 Herkunft: Riegel am Kaiserstuhl
|
|
Das Problem ist letztlich doch, dass optionale Parameter und Überladung von Methoden für den Verwender die exakt gleiche Syntax haben, aber eine unterschiedliche Semantik.
Und das ist *IMMER* eine ganz schlechte Idee.
|
|
01.07.2009 10:58
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
svenson
myCSharp.de-Poweruser/ Experte
Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003 Herkunft: Berlin
|
|
| Zitat von herbivore: |
| Die 32 hätte ja nicht nur per Default-Wert in den Code des Aufrufers kommen können, sondern einfach durch die bewusste Entscheidung des Aufrufers, explizit 32 zu übergeben. Und dann würde es in deinem Beispiel genauso knallen. |
Sicher, aber wie bereits gesagt wurde: Optionale Parameter implizieren die Bedeutung: "Da muss ich mich nicht drum kümmern, wird schon". Also bewußt keine bewußte Entscheidung. Das gleiche Problem gilt übrigens auch für öffentliche Konstanten. Auch die werden beim Aufrufer fest eincompiliert. Daher in öffentlichen Schnittstellen besser readonly-Felder verwenden, sofern sich der Wert später mal ändern könnte.
Hier nochmal eingehender:
http://dotnet.mvps.org/dotnet/articles/optional/
Bemerkenswert die "Kritik an der Kritik":
| Zitat: |
| Die angeführten Gründe halten jedoch einer eingehenden Prüfung nicht stand. Der erste Kritikpunkt ist rein theoretischer Natur, da optionale Parameter mit Standardwerten in Szenarien nicht geeignet sind, in denen der Standardwert nicht unumstößlich feststeht. |
Der Hinweis zur Verwendung ist richtig, aber hier ist der gute Mann doch wohl ein wenig optimistisch, was die Disziplin der Entwickler angeht. C# ist mal unter dem Banner "defensives Programmiermodell" angetreten, mit dem Ziel Qualität über Faulheit stellen. Optionale Parameter sind wohl ein deutliches Zeichen für die Abkehr von dieser Strategie und geben den Kritikern an C# wohl recht, die sagen, dass die Sprache mehr und mehr verwurschtelt wird.
Flexibilität kann ich in diesem Zusammenhang nicht erkennen, außer dass der Entwickler nun so flexibel ist, eine fehleranfällige und eine fehlerunanfällige Implementierung zu wählen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von svenson am 01.07.2009 12:37.
|
|
01.07.2009 11:56
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.495
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo Golo Roden,
| Zitat: |
| Das Problem ist letztlich doch, dass optionale Parameter und Überladung von Methoden für den Verwender die exakt gleiche Syntax haben, aber eine unterschiedliche Semantik. |
nur die Aufrufsyntax ist (aus verständlichen Gründen) gleich. Aber die Definition ist auch für den Aufrufer (da sie Teil der Schnittstelle ist) erkennbar unterschiedlich, was bis in die Dokumentation durchschlägt. Es ist auch dort erkennbar (oder sollte es zumindest sein), ob es sich mehrere um Überladungen handelt oder um eine Methode mit optionalen Parametern.
Hallo svenson,
| Zitat: |
| Sicher, aber wie bereits gesagt wurde: Optionale Parameter implizieren die Bedeutung: "Da muss ich mich nicht drum kümmern, wird schon". |
nur weil es schon gesagt wurde, muss es nicht richtig sein. :-) Ich sehe das nicht so. Was der Aufrufer intendiert, kann man nicht wissen. Ich habe ja, zwei Möglichkeiten genannt: Ist mir egal vs. nur Tipparbeit sparen (eine dritte wäre, dass es einfach übersichtlicher ist, wenn man den Default-Fall wegen seiner kurzen Parameterliste schneller erkennen kann). Wenn ich z.B. eine Datei öffne (File.Open), kann ich auch bestimmte Parameter weglassen, aber dann weiß ich trotzdem, was der Default ist und will das auch so. Es ist mir da keineswegs egal, was die Defaultwerte sind.
| Zitat: |
| Das gleiche Problem gilt übrigens auch für öffentliche Konstanten. Auch die werden beim Aufrufer fest eincompiliert. Daher in öffentlichen Schnittstellen besser readonly-Felder verwenden, sofern sich der Wert später mal ändern könnte. |
Den Fall hatte ich ja selbst angesprochen. Wichtig ist aber, dass er sich eben nicht auf Default-Werte übertragen lässt.
herbivore
|
|
01.07.2009 12:43
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
svenson
myCSharp.de-Poweruser/ Experte
Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003 Herkunft: Berlin
|
|
| Zitat von herbivore: |
| Ich sehe das nicht so. |
Ich antworte darauf nochmal mit dem "Kritiker der Kritik":
| Zitat: |
| Die angeführten Gründe halten jedoch einer eingehenden Prüfung nicht stand. Der erste Kritikpunkt ist rein theoretischer Natur, da optionale Parameter mit Standardwerten in Szenarien nicht geeignet sind, in denen der Standardwert nicht unumstößlich feststeht. |
Aber erkläre mir doch nochmal inwiefern sich Konstanten im Versionierungsproblem von optionalen Parametern untscheiden. Hier ist für den Entwickler wegen des Wortes "const" vielleicht noch eher klar, worum es sich handeln sollte. Aber an der nächsten Ecke lauern auch hier schon wieder die "Performance-Optimierer" die mal gehört haben, dass const schneller ist als readonly. Von den C-Umsteigern, die const aus Gewohnheit verwenden, ganz zu schweigen...
Aber wir reden wohl aneinander vorbei: Es geht mir nicht um die korrekte und dann auch sichere Verwendung von const und optional, sondern um das Gefahrenpotential die sie für unerfahrene Entwickler bergen.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von svenson am 02.07.2009 00:16.
|
|
02.07.2009 00:10
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
jaensen
myCSharp.de-Poweruser/ Experte
Dabei seit: 15.12.2006
Beiträge: 2.717
Entwicklungsumgebung: VS 2012 Herkunft: München
|
|
| Zitat von Briefkasten: |
| Ich bin etwas enttäuscht, dass C# weg von den streng Typisierten Typen will. (var, dynamic). Das geht immer mehr in Richtung Visual Basic.NET. |
| Zitat von winSharp93: |
| Man darf die Dynamik in C# keineswegs als "neuen Weg" sehen. Viel mehr ist es so, dass ein Großteil der Neuerungen der Interoptibiltät dienen (Office, F# (DLR allgemein), etc.). |
@winSharp93: Da habe ich aber die Befürchtung das es gerade Umsteiger von PHP etc. sehr gerne aufnehmen das so eine Gaudi in C# jetzt auch geht und wenn es nur mal kurz und der vollständigkeit halber in einem Lehrbuch auftauchte. Birgt halt wieder die Gefahr falsch gelerntes zu verinnerlichen, zu verwenden und dann letztendlich wieder falsch zu lehren.
|
|
02.07.2009 00:43
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.495
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo svenson,
| Zitat: |
| Aber erkläre mir doch nochmal inwiefern sich Konstanten im Versionierungsproblem von optionalen Parametern untscheiden. |
der Unterschied ist eben, dass man optionale Parameter immer auch explizit angeben kann, d.h. die 32 in deinem Beispiel steht nicht nur dann im ausführbaren Code des Aufrufers, wenn der Default-Wert verwendet wurde, sondern auch, wenn der Aufrufer die 32 explizit angegeben hat. Es ist im ausführbaren Code im Prinzip gar nicht mehr zu erkennen, warum da eine 32 steht, da wir über den Fall reden, in dem der Quellcode des Aufrufers nicht neu compiliert wird. Bei Änderungen der DLL muss diese also so oder so damit klar kommen, dass möglicherweise 32 übergeben wird. Die Default-Parameter ändern also nichts zum Negativen. Es ist sogar eigentlich ein Vorteil, wenn der Default-Wert im Aufrufer steckt. Denn mit diesem wurde er getestet und funktioniert. Wenn die Bibliothek also keine Breaking Changes enthält, wird er auch weiter damit funktionieren. Das wäre nicht unbedingt der Fall, wenn der Aufgerufene einen anderen Default-Wert erzwingen könnte, wie das beim Überladen der Fall ist.
Das ist schon etwas anders als bei const, wo bei Änderungen die Konstantenwerte im ausführbaren Code nicht mehr stimmen, wenn nicht alles compiliert wird. Das ist ein echter Nachteil.
Aber auch ich habe auch den Eindruck, dass wir aneinander vorbei reden. Vielleicht äußern sich ja die anderen, wie sie das ganze sehen, nachdem sie die Argumente für beide Seiten gehört haben.
herbivore
|
|
02.07.2009 02:54
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
|