Vereinfacht ausgedrückt bedeutet die Einschränkung, dass es weniger richtige Möglichkeiten gibt, Dinge zusammenzusetzen, und erstklassige Funktionen erleichtern das Ausklammern von Dingen wie Schleifenstrukturen. Nehmen Sie die Schleife aus dieser Antwort , zum Beispiel:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
Dies ist zufällig die einzige sichere zwingende Möglichkeit in Java, ein Element aus einer Auflistung zu entfernen, während Sie sie durchlaufen. Es gibt viele Möglichkeiten, die sehr genau aussehen, aber falsch sind. Menschen, die sich dieser Methode nicht bewusst sind, gehen manchmal verschlungene Wege, um das Problem zu vermeiden, wie beispielsweise das Durchlaufen einer Kopie.
Es ist nicht sonderlich schwierig, diese generische Version zu erstellen. Strings
Ohne erstklassige Funktionen können Sie das Prädikat (die Bedingung in der if
) jedoch nicht ersetzen. Daher wird dieser Code in der Regel kopiert und eingefügt und leicht modifiziert.
Kombinieren Sie erstklassige Funktionen , die Ihnen geben Fähigkeit , das Prädikat als Parameter übergeben, mit der Einschränkung der Unveränderlichkeit , dass es sehr ärgerlich , wenn man nicht macht, und Sie kommen mit einfachen Bausteinen wie filter
, wie in diesem Scala Code das macht das selbe:
list filter (!_.isEmpty)
Überlegen Sie sich nun, was das Typsystem für Sie beim Kompilieren im Fall von Scala überprüft. Diese Überprüfungen werden jedoch auch von dynamischen Typsystemen durchgeführt, wenn Sie es zum ersten Mal ausführen:
list
muss ein Typ sein, der die filter
Methode unterstützt , nämlich eine Auflistung.
- Die Elemente von
list
müssen eine isEmpty
Methode haben, die einen Booleschen Wert zurückgibt.
- Die Ausgabe wird eine (möglicherweise) kleinere Sammlung mit der gleichen Art von Elementen sein.
Welche anderen Möglichkeiten stehen dem Programmierer zur Verfügung, wenn diese Dinge überprüft wurden? Ich habe versehentlich das vergessen !
, was einen äußerst offensichtlichen Testfallfehler verursachte. Das ist so ziemlich der einzige Fehler, den ich machen konnte, und ich habe ihn nur gemacht, weil ich direkt aus Code übersetzt habe, der auf die Umkehrbedingung getestet wurde.
Dieses Muster wird immer wieder wiederholt. Mit erstklassigen Funktionen können Sie Dinge mit präziser Semantik in kleine wiederverwendbare Dienstprogramme umwandeln. Einschränkungen wie die Unveränderlichkeit geben Ihnen den Anstoß dazu, und die Überprüfung der Parameter dieser Dienstprogramme lässt nur wenig Raum, um sie zu vermasseln.
Dies alles hängt natürlich davon ab, dass der Programmierer weiß, dass die Vereinfachungsfunktion filter
bereits vorhanden ist und dass er sie finden kann oder den Vorteil erkennt, selbst eine zu erstellen. Versuchen Sie, dies überall selbst zu implementieren, indem Sie nur die Schwanzrekursion verwenden, und Sie befinden sich wieder in dem Boot mit der gleichen Komplexität wie die imperative Version, nur noch schlimmer. Nur weil Sie es sehr einfach schreiben können , heißt das nicht, dass die einfache Version offensichtlich ist.