@Sirius3: Genau. Deswegen geht in C auch als
sowas:
Code: Alles auswählen
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count+7)/8;
switch (count%8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n>0);
}
}
@Üpsilon: Sollte es irgendwann ein Switch-Statement in Python geben, werde ich mir eine andere Sprache suchen. Überproportional viele Neuerungen der letzten 20 Jahre bei der Entwicklung neuer Sprachen/Sprachkonzepte bestanden darin, dass man Möglichkeiten einführte, explizite Fallunterscheidungen loszuwerden. Polymorphismus/OOP wurde ja schon genannt. Ein anderes Beispiel wäre Ausnahmebehandlung. Gäbe es die nicht in Python müste man etwa sowas programmieren:
Code: Alles auswählen
some_result = some_function(x, y, z)
if some_result == IOERROR:
...
elif some_result == FOOERROR:
...
elif some_result == BARERROR:
...
... # andere mögliche Fehler...
else: # alles ok
# mach irgendwas mit some_result
Dabei müssen jedesmal, wenn
some_function() verwendet wird, alle potentiellen Fehler abgefragt werden, bevor man das Ergebnis weiterverwenden kann. Dieser Code ist noch in weiterer Hinsicht problematisch. Nicht nur muss an
dieser Stelle jede mögliche Ausnahme behandelt werden, sondern auch
an jeder anderen Stelle, wo
some_function() aufgerufen wird. Sollte es nötig werden
some_function() so zu erweitern, dass eine neue Ausnahme eintreten kann welche an den Aufrufer zurückgegeben werden muss, dann müssen alle diese Stellen angefasst und um einen Zweig erweitert werden. Das ist insbesondere dann sehr schlecht, wenn
some_function() zu einer API gehört, die von Programmierern verwendet wird, die nicht zum eigenen Umfeld gehören. Stell dir vor, Microsoft würde irgendeine oft verwendete Windowsfunktion ändern, so dass Millionen von Zeilen von Code weltweit durchsucht werden müssen, um jede Stelle, an der diese Windowsfunktion verwendet wird, anzupassen. Nicht, dass so etwas noch nie passiert wäre, aber es ist jedesmal mit erheblichem Zeitaufwand, und damit Geldaufwand, verbunden.
Da Python einen Mechanismus zur Ausnahmebehandlung besitzt, kann man es dagegen so machen:
Code: Alles auswählen
try:
some_result = some_function(x, y, z)
except IOEXCEPTION:
...
# mach irgendwas mit some_result
Sollte hier eine FOOEXCEPTION oder BAREXCEPTION auftreten, muss diese nicht im lokalen Code behandelt werden, sondern kann einfach an den Aufrufer des lokalen Codes weitergereicht werden. Der lokale Code darf also dümmer sein. Dadurch wird ermöglicht, dass
some_function() geändert werden kann (indem eine neue mögliche Ausnahme eingefügt wird), ohne dass jeder Client Code angefasst und angepasst werden muss.
In specifications, Murphy's Law supersedes Ohm's.