Bang-Methoden werden am häufigsten verwendet, um zwischen einer gefährlichen und einer sicheren Version derselben Methode zu unterscheiden. Hier sind einige Beispielfälle, die man mit einer Bang / No-Bang-Kombination unterscheiden könnte:
Die Konvention besteht jedoch darin, den "Bang" zu verlassen, wenn es nur eine Version gibt, die Sinn macht. Zum Beispiel, pop
in einem Array ohne tatsächlich zu ändern, macht keinen Sinn. In diesem Fall würde es sich um eine andere Operation handeln: Array#last
. Viele Methoden ändern das Objekt, an dem sie aufgerufen werden, beispielsweise Setter. Wir müssen diese auch nicht mit einem Knall schreiben, weil es klar ist, dass sie das Objekt verändern.
Schließlich gibt es einige Ausnahmen, bei denen einige Entwickler eine Bang-Methode verwenden, ohne ein bangloses Gegenstück zu implementieren. In diesen Fällen wird der Knall einfach dazu verwendet, die Methodenaufrufe visuell hervorzuheben. Zum Beispiel:
Der Knall wird verwendet, um zwischen einer gefährlichen und weniger gefährlichen Version derselben Methode zu unterscheiden. Es gibt nur eine pop
Methode, also gibt es nichts zu unterscheiden.
Hinweis: Der Name der Methode hat absolut nichts damit zu tun, was sie tut. Ob eine Methode destruktiv ist oder nicht, hängt davon ab, welchen Code sie ausführt und nicht, welchen Namen sie hat.
Ein Suffix von !
bedeutet, dass eine Methode eine gefährliche Version einer anderen Methode ist. Zum Beispiel ist save!
die gefährliche Version von save
. "Gefährlich" kann bedeuten, dass die Bearbeitung an Ort und Stelle erfolgt und etwas mit strengeren Fehlern usw. durchgeführt wird. Es ist nicht erforderlich, das Suffix !
für eine gefährliche Methode zu verwenden, aber kein sichereres Gegenstück. Darüber hinaus ist dies nur eine Namenskonvention, daher beschränkt Ruby nicht das, was Sie tun können und was nicht, wenn eine Methode mit !
endet oder nicht.
Es gibt ein allgemeines Missverständnis, dass jede Methode, die etwas an Ort und Stelle bearbeitet, mit !
enden sollte. Dies ist nicht wahr, !
wird nur benötigt, wenn eine gefährlichere Version einer Methode existiert, die bereits existiert, und dies bedeutet nicht notwendigerweise, dass die gefährliche Methode bearbeitet wird. In Rails ist ActiveRecord::Base#save!
beispielsweise eine Version von ActiveRecord::Base#save
, die Validierungen durchführt.
Die Bedeutung von Bang in Ruby ist "Vorsicht". Es bedeutet, dass Sie die Methode mit Vorsicht verwenden sollten, nicht mehr. Ich kann die Referenz nicht mehr finden, aber die Autoritäten sagten ausdrücklich, dass diese Methode zerstörerisch sei. Bang ist nur ein semantisches Element, das mit Vorsicht assoziiert wird. Es liegt am Programmierer, alles einzumessen und zu entscheiden, wann er bang verwenden soll.
Zum Beispiel verwende ich in meinem Simulations-Juwel die Methode #step
, um die Schrittweite zu erhalten.
und step!
Methode, um den Simulationsschritt tatsächlich durchzuführen.
Aber wie für #reset
Methode, entschied ich, dass das Wort "reset" es ist genug ausführlich und es ist nicht notwendig, bang zu verwenden, um den Benutzer zu warnen, dass der Simulationszustand zerstört wird:
PS .: Jetzt erinnere ich mich, es war einmal, Matz sagte halb scherzhaft, dass er es bereut, Methoden mit Knall in Ruby überhaupt einzuführen, weil Knall semantisch so zweideutig ist.