ich halte das Beispiel für problematisch, um daran über sprechenden Code zu diskutieren, schließlich sind schon zwei Funktionen vorgegeben:
Ja. Ich hab das auch nur nebenbei aufgeschnappt und hab das eher genommen, weil es das aktuellste war, wo ich über so etwas nachgedacht habe. Und die API ist doof, aber ich wollte da ja nur ein Gegenbeispiel bringen.
nodes.fontnames.unique.length > 2
nodes.map(:fontname).unique().length > 2
nodes.unique?(:fontname, 2)
Ich vermeide unique, wenn ich keinen Überblick über die ungefähre Datenmenge habe, weil zu viele Vergleiche und zuviel benötigter Zwischenspeicher. Premature, vielleicht, aber irgendwo in mir eingegraben. Und hier weiß ich ja nicht, was der Kerl eigentlich bezwecken will. ;)
(Es gibt irgendwo ein unique, dass so überladen ist? Doch nicht in Ruby, oder? Ich war ja da kurz davor, mir ein Array.prototype.differentValues zu monkeypatchen.)
fontNames = nodes.map(function (node) { return node.fontName });
...
fontNames = nodes.map(function (node) {
// Get the node's font name
return ugly.api.getEffectiveValue(node, "fontname", null, ugly.api.FOO | ugly.api.BAR, -2);
});
...
editableTextNodes = nodes.filter(function (node) { return isEditable(node) && node.nodeType == Node.TEXT_NODE });
Das ist eine anderer Programmierstil, den ich mag – die deskriptive Information steckt in der Bezeichnung der Collection, Filtern passiert subsequent. Was auch eine Art deklarativer Stil ist. Ich hab diese Präsentation da als etwas in Erinnerung, was mich mal stark beeinflusst hat. Python, ab Seite 100 oder so wird's aber sehr rocket sciencig.