| 

.NET C# Java Javascript Exception

8
Ich habe unter http://msdn.microsoft.com/de-de/library/bb979356.aspx ein Beispiel zum Überladen von Operatoren gefunden, dass sich auf die Vektorrechnung bezieht und als Beispiel durchaus nachvollziehar ist. Der Operator + kann beispielsweise so überladen werden, dass er auch Vektoren addieren kann. Entsprechend könnte ich jetzt eine Addition von Erbsen- und Tomatensuppe machen ;-). Okay, das ist jetzt bildlich gesprochen. Mir stellt sich eher die Frage, worin hier der eigentliche Sinn liegt, denn eine Vektoraddition könnte ich doch Alternativ auch mit einer Methode VectorAdd und eine Suppenmischung mit MischeErbsenUndTomatensuppe erreichen. Soll durch das Überladen der Operatoren nur die Vereinheitlichung der Operatoren erreicht werden oder gibt es noch andere Vorteile?
23.11.2011
rrpandiarajan 51 3
2 Antworten
3
Wie Du schon selbst erkannt hast: überladene Operatoren sind nicht alternativlos, letztlich könnte man auch immer eine Methode dafür hernehmen. Java zum Beispiel kennt keine überladenen Operatoren und es ist noch kein Projekt daran gescheitert. Aber es gibt vermutlich auch keinen Java-Programmierer, der nicht schon mal versehentlich "text1 == text2" geschrieben hätte statt "text1.equals(text2)" (und manch einer, so auch ich, flucht innerlich, wenn er mal wieder Java-Code lesen muss und feststellt, dass equals sich nicht soleicht liest wie ==). Und damit sind wir beim Sinn: mit überladenen Operatoren läßt sich, wenn sie klug eingesetzt werden, ein Typ einfacher und intuitiver verwenden. Wir sind es gewohnt, auf dem Papier "a+b" zu schreiben, auch wenn a und b Vektoren oder komplexe Zahlen sind. Es fühlt sich unnatürlich an, beim Programmieren daran denken zu müssen, ob a ein Skalar oder ein Vektor ist. Ähnlich mit == und !=. Wenn ein Typ Wertsemantik hat, so ist es intuitiver, wenn == die Werte vergleicht statt der Referenzen.

In den .NET Framework Design Guidelines von Cwalina und Abrams finden sich einige Regeln, die ich sinnvoll finde und die auch recht gut illustrieren, wofür Operator-Überladung gut ist (und wofür nicht):

  • Operatoren-Überladung vermeiden, außer in Typen, die sich wie primitive Typen verhalten sollen
  • Operatoren-Überladung in Betracht ziehen in Typen, die sich wie primitive Typen verhalten sollen
  • Operatoren-Überladung verwenden in Strukturen,die Zahlen repräsentieren
  • Nicht besonders "schlau" sein wollen, die Bedeutung sollte intuitiv sein, z.B. Subtraktion von zwei DateTimes ergibt einen TimeSpann, hingegen nicht && für die Verknüpfung von zwei DB-Queries oder << für das Schreiben in einen Stream
  • Mindestens einer der beiden Operatoren muss von dem Typ sein, der den Operator definiert
  • Operatoren symmetrisch überladen (== und !=, + und - usw.)
  • In Betracht ziehen, für jeden überladenen Operator parallel eine Methode anzubieten (nicht alle .NET-Sprachen unterstützen überladene Operatoren)

Von daher: + und - für Vektoren zu überladen, scheint mir eine gute Idee zu. Trotzdem noch eine Add-Methode anzubieten, wäre auch nicht verkehrt. Bei den Tütensuppen würde ich hingegen eher davon abraten, weil wohl kaum jemand auf die Idee käme, das Mischen von Tütensuppen durch ein + auszudrücken. (Man bedenke, dass überladene Operatoren nicht im Intellisense auftauchen, d.h. der Programmierer muß von selbst drauf kommen, dass das geht, und der Leser muss ohne weitere Hilfe verstehen können, was der Operator bewirkt.)
23.11.2011
Matthias Hlawatsch 13,2k 4 9
2
Richtlinien zur Operatorüberladung
Die Operatorüberladung ist eine Funktion, die nur eingesetzt werden sollte, wenn sie erforderlich ist. Mit »erforderlich« meine ich, dass die Verwendung zu einer Vereinfachung für den Benutzer führt.
23.11.2011
Jürgen Luhr 7,1k 2 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH