Hagen+2008-06-17 21:27:27--Kann mir jemand erklären, warum "eval" ein schlechter Programmierstil ist?
Das "Blockeval" (
eval { ... }) ist kein schlechter Programmierstil, sondern eine sinnvolle Möglichkeit zur Fehlerbehandlung.
Das "Stringeval" (
eval "...") ist meistens schlechter Programmierstil. Zunächst einmal gibt es nur extrem selten Anwendungen, wo seine Verwendung nicht vermeidbar ist in den meisten Fällen kann es zum Beispiel elegant durch das Benutzen von Codereferenzen ersetzt werden. Und die Vermeidung von
eval "..." zahlt sich ferner dadurch aus, dass man von vornherein eine ganze Reihe von Sicherheits-, Debugging- und Performanceproblemen vermeidet:
- Da der String, den man an
eval übergibt erst zur Laufzeit des Skriptes geparst und kompiliert wird, ist es bei mehrmaliger Verwendung des Codes auf jeden Fall langsamer als eine Codereferenz.
- Da der String erst zur Laufzeit kompiliert wird, werden auch syntaktische Fehler erst spät erkannt.
- Wenn man den String dynamisch zusammensetzt, muss man peinlich darauf achten, dass man keine Möglichkeit schafft, durch Benutzereingaben beliebigen Code in das Skript zu injizieren. Ausserdem ist das Auffinden von Fehlern in derartigem dynamisch generiertem Code aufwändig.
Andererseits ist das Stringeval natürlich ein mächtiges Werkzeug. Ich würde nicht soweit gehen, zu sagen, dass man es auf keinen Fall verwenden sollte, aber man sollte sich Gedanken darüber machen, wann es wirklich sinnvoll ist. Von Anfängern wird der Befehl einfach viel zu gerne misbraucht.
Bevor man zu
eval greift, sollte man sich vielleicht einfach überlegen, ob man in einem äquivalenten C-Programm an der gleichen Stelle wirklich dynamisch Maschinenbefehle in einem Speicherblock platzieren und diese dann als Funktionspointer anspringen würde. Wenn man diese Frage guten Gewissens bejahen kann, ist auch die Verwendung von
eval angebracht ;-)
When C++ is your hammer, every problem looks like your thumb.