Ich habe gerade einen Artikel von Joel gelesen, in dem er sagt:
Im Allgemeinen muss ich zugeben, dass ich ein bisschen Angst vor Sprachfeatures habe, die Dinge verbergen . Wenn Sie den Code sehen
i = j * 5;
… In C wissen Sie zumindest, dass j mit fünf multipliziert und die Ergebnisse in i gespeichert werden.
Wenn Sie jedoch denselben Codeausschnitt in C ++ sehen, wissen Sie nichts. Nichts. Die einzige Möglichkeit, um zu wissen, was in C ++ wirklich passiert, besteht darin, herauszufinden, welche Typen i und j sind, was möglicherweise an einer anderen Stelle deklariert wird. Das liegt daran, dass j möglicherweise von einem Typ ist, der
operator*
überladen ist und schrecklich witzig ist, wenn Sie versuchen, es zu multiplizieren.
(Hervorheben von mir.) Angst vor Sprachmerkmalen, die Dinge verbergen? Wie können Sie sich davor fürchten? Ist das Verstecken von Dingen (auch als Abstraktion bekannt ) nicht eine der Schlüsselideen der objektorientierten Programmierung? Jedes Mal, wenn Sie eine Methode aufrufen a.foo(b)
, haben Sie keine Ahnung, was dies bewirken könnte. Sie müssen herausfinden, welche Typen a
und welche Typen es b
gibt, etwas, das an einer anderen Stelle deklariert werden könnte. Sollen wir also die objektorientierte Programmierung abschaffen, weil sie dem Programmierer zu viele Dinge verbirgt?
Und was j * 5
unterscheidet sich davon j.multiply(5)
, dass Sie möglicherweise in einer Sprache schreiben müssen, die das Überladen von Operatoren nicht unterstützt? Auch hier müssten Sie die Art j
der multiply
Methode herausfinden und einen Blick in sie werfen, denn siehe da, sie j
könnte von einer Art sein, die eine multiply
Methode hat, die etwas furchtbar Witziges tut.
"Muahaha, ich bin ein böser Programmierer, der eine Methode benennt multiply
, aber was sie tatsächlich tut, ist völlig undurchsichtig und nicht intuitiv und hat überhaupt nichts damit zu tun, Dinge zu multiplizieren." Ist das ein Szenario, das wir beim Entwerfen einer Programmiersprache berücksichtigen müssen? Dann müssen wir die Bezeichner aus den Programmiersprachen weglassen, weil sie irreführend sein könnten!
Wenn Sie wissen möchten, was eine Methode bewirkt, können Sie entweder einen Blick auf die Dokumentation werfen oder einen Blick in die Implementierung werfen. Das Überladen von Operatoren ist nur syntaktischer Zucker, und ich verstehe nicht, wie es das Spiel überhaupt verändert.
Bitte erleuchte mich.