Hallo,
function cycleColors(elemStyle, rgbVals, rgbRanges) {
Würde ich createColorCycler oder ähnlich nennen, da eine Funktion zurückgegeben wird.
OO
var MyBgColor = {
red : false,
green : false,
blue : false,
style : false,
createColorObj : function (value, range) {
return {
"value": value,
"max" : value,
"range" : range,
"dir" : 1
};
},
Ich würde nicht behaupten, das das unbedingt eleganterer Code ist, er ist auf jeden Fall konventioneller und daher besser verständlich.
Die Idee von Crockford ist ja im Grunde, sich auf Konventionen zu einigen, die »sicher« sind im Sinne von Vermeidung von Fallstricken, wenn Programmierer unterschiedlicher Erfahrung zusammenkommen. Stark funktionale Programmierung mag der Sprache natürlich angemessener sein, erfordert aber Wissen, Erfahrung und Einarbeitungszeit. Mehrfach verschachtelte Funktionen, die Funktionen zurückgeben, sind einfach unübersichtlicher als ein flacher Objektliteral.
nextVal : function (colorName) {
if (this[colorName].value <= this[colorName].max - this[colorName].range
|| this[colorName].value >= this[colorName].max) {
this[colorName].dir *= -1;
}
this[colorName].value += this[colorName].dir;
return this[colorName].value;
Hier wiederholt sich this[colorName] acht Mal. Besser wäre es, eine Shortcut-Variable anzulegen. Das macht es performanter und besser lesbar. (Auch max und value wird auch mehrfach zugegriffen.)
Der funktionale Ansatz arbeitet mit privaten Variablen, was ja eigentlich doch sinnig erscheint (s. a. Crockford: http://javascript.crockford.com/private.html "This pattern of public, private, and privileged members is possible because JavaScript has closures. What this means is that an inner function always has access to the vars and parameters of its outer function, even after the outer function has returned. This is an extremely powerful property of the language.")
Wie gesagt, Kapselung ist mehr ein Pattern denn notwendig ein konkretes Sprachfeature. Es besteht kein Zwang dazu, effektiv zu kapseln, und selbst bei vielen klassenbasierten Sprachen, die native private Eigenschaften haben, gibt es keine effektive (unüberwindbare) Kapselung.
http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/#encapsulation
Objektorientierung und private Variablen widersprechen sich nicht. Closures kann man auch bei Konstruktoren einsetzen, und auch das Revealing Module Pattern trennt zwischen privaten und öffentlichen Daten. JavaScript gibt da einem viele Möglichkeiten und in Zukunft kommen noch weitere hinzu.
Mathias