Al diseñar Babylon.js v2.0(una biblioteca para construir 3D en la web), recientemente me encontré deseando que se fluido-es decir, deseo que la comunidad pueda leer, comprender y ampliar el trabajo con mayor facilidad mientras pasa menos tiempo en los documentos técnicos.
En este tutorial, recorreré las API con fluidez: qué tener en cuenta, cómo escribirlas y las implicaciones de rendimiento en varios navegadores.
UNA API fluida, como se indica en este artículo de Wikipedia, es una implementación de una API orientada a objetos que tiene como objetivo proporcionar un código más legible. JQuery es un gran ejemplo de lo que una API fluida le permite hacer:
PS') .html ("Fluent API are cool!") .addClass ("header") .appendTo ("body");
La API fluida le permite encadenar llamadas de funciones devolviendo este objeto.
Podemos crear fácilmente una API fluida como esta:
var MyClass = function (a) this.a = a; MyClass.prototype.foo = function (b) // Haga un trabajo complejo this.a + = Math.cos (b); devuelve esto
Como puede ver, el truco consiste en devolver el esta
objeto (referencia a la instancia actual en este caso) para permitir que la cadena continúe.
Si no sabe cómo funciona la palabra clave "this" en JavaScript, le recomiendo que lea este excelente artículo de Mike West.
Entonces podemos encadenar llamadas:
var obj = new MyClass (5); obj.foo (1) .foo (2) .foo (3);
Antes de intentar hacer lo mismo con Babylon.js, quería asegurarme de que esto no generaría algunos problemas de rendimiento..
Así que hice un punto de referencia!
cuenta var = 10000000; var MyClass = function (a) this.a = a; MyClass.prototype.foo = function (b) // Haga un trabajo complejo this.a + = Math.cos (b); devuelve esto MyClass.prototype.foo2 = function (b) // Haga un trabajo complejo this.a + = Math.cos (b); var start = new Date (). getTime (); var obj = new MyClass (5); obj.foo (1) .foo (2) .foo (3); para (índice var = 0; índice < count; index++) obj.foo(1).foo(2).foo(3); var end = new Date().getTime(); var start2 = new Date().getTime(); var obj2 = new MyClass(5); for (var index = 0; index < count; index++) obj2.foo2(1); obj2.foo2(2); obj2.foo2(3); var end2 = new Date().getTime(); var div = document.getElementById("results"); div.innerHTML += obj.a + ": With return this: " + (end - start) + "ms
"; div.innerHTML + = obj2.a +": sin devolver esto: "+ (end2 - start2) +" ms ";
Como puedes ver, foo
y foo2
hacer exactamente lo mismo. La única diferencia es que foo
puede ser encadenado mientras foo2
no poder.
Obviamente la cadena de llamadas es diferente entre:
obj.foo (1) .foo (2) .foo (3);
y
obj2.foo2 (1); obj2.foo2 (2); obj2.foo2 (3);
Dado este código, lo ejecuté en Chrome, Firefox e IE para determinar si debo preocuparme por el rendimiento.
Y aquí están los resultados que obtuve:
La cosa es que agregué una operación a la función (Matemáticas.cos
) Simular algún tipo de tratamiento realizado por la función..
Si quito todo y solo guardo el regreso
En todos los navegadores no hay diferencia (en realidad, solo uno o dos milisegundos por 10,000,000 intentos). Puedes probar esto por ti mismo a través de los navegadores. Y si no tiene los dispositivos a mano, hay muchas herramientas gratuitas en dev.modern.IE. Simplemente no pruebe el rendimiento de una máquina virtual con un dispositivo real.
Así que mi conclusión es: es un go!
Una API fluida es excelente: produce un código más legible y puede usarlo sin ningún problema o pérdida de rendimiento!
Puede que te sorprenda un poco, pero Microsoft tiene un montón de aprendizaje gratuito sobre muchos temas de código abierto de JavaScript, y estamos en la misión de crear mucho más con Microsoft Edge. Echa un vistazo a mi propia:
O la serie de aprendizaje de nuestro equipo:
Y algunas herramientas gratuitas: Visual Studio Community, Azure Trial y herramientas de prueba en varios navegadores para Mac, Linux o Windows.
Este artículo es parte de la serie web dev tech de Microsoft. Estamos muy contentos de compartir Microsoft Edge y lo nuevo Motor de renderizado EdgeHTML con usted. Obtenga máquinas virtuales gratuitas o realice pruebas a distancia en su dispositivo Mac, iOS, Android o Windows @ http://dev.modern.ie/.