006
02.11.2007, 01:33 Uhr
0xdeadbeef
Gott (Operator)
|
Die C-Geschichte stammt aus der Zeit, bevor C++ standardisiert wurde und namespaces von vielen Compilern nicht unterstützt wurden. Damals hat man oft vor den eigentlichen Namen der Klasse einen eindeutigen Bezeichner für die Bibliothek gesetzt - so zu sehen bei z.B. wxWidgets, wo alle Klassennamen mit wx beginnen, oder Qt, wo alle Klassen ein Q vor dem eigentlichen Namen haben. Inzwischen gibt es namespaces, die da deutlich flexibler sind, so dass eine moderne Bibliothek stattdessen z.B. wx::symbolname bzw. qt::symbolname benutzen würde. C ist eine Art namespace für die MFC (Microsoft Foundation Classes), und du möchtest den selben namespace nicht für zwei verschiedene Bibliotheken benutzen - die Gefahr, da Kollisionen zu kriegen, ist zu groß. Selbst wenns jetzt funktioniert, wird die Bibliothek evtl. irgendwann um eine Klasse erweitert, die mit deinem Code kollidiert.
Nebenher ist das C bei Microsoft eine Art der ungarischen Notation - sie benutzen C für Klassen, I für interfaces, und lpsz für String-Arrays, solche Dinge. Eine Zeit lang war es mal modern, sowas zu machen, um direkt sehen zu können, welchen Typ ein bestimmtes Symbol hat, aber in der Praxis hat sich das relativ schnell als unpraktisch erwiesen - zum Beispiel unter dem Gesichtspunkt von templates, hauptsächlich aber aufgrund der Lesbarkeit; logisch interessiert dich eigentlich nicht, welchen Typ ein Symbol genau hat, du willst beim Lesen des Codes wissen, wozu es gedacht ist. Und
C++: |
for(int nIndex = 0; nIndex < 10; ++nIndex) { DoStuffWith(lpszArray[nIndex]); }
|
wirkt auf die meisten Leute eher konfus. Das selbe Konzept trifft hier auch auf Klassen zu - wenn ein Klassenname im Code steht, weißt du bereits, dass es ein Typname ist, der Bezeichner ist redundant und verwirrt den unbedarften Codeleser eher, als dass er die Lesbarkeit erhöht. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |