Tijdens het ontwerpen van Babylon.js v2.0(een bibliotheek voor het bouwen van 3D op internet), ik merkte onlangs dat ik wilde dat er meer API's waren vloeiend-dat wil zeggen, ik zou willen dat de gemeenschap het werk gemakkelijker kon lezen, begrijpen en erop kon voortbouwen, terwijl ze minder tijd doorbracht in de technische documenten.
In deze zelfstudie doorloop ik vloeiende API's: waar ik aan moet denken, hoe ik ze moet schrijven en wat de implicaties van cross-browserprestaties zijn.
EEN vloeiende API, zoals gesteld door dit Wikipedia-artikel, is een implementatie van een object-georiënteerde API die als doel heeft om meer leesbare code te bieden. JQuery is een goed voorbeeld van wat een vloeiende API je kunt doen:
$ ('') .html ("Fluent API is cool!") .addClass ("header") .appendTo ("body");
Met de vloeiende API kunt u functieaanroepen ketenen door dit object te retourneren.
We kunnen eenvoudig een vloeiende API zoals deze maken:
var MyClass = function (a) this.a = a; MyClass.prototype.foo = function (b) // Doe wat complex werk this.a + = Math.cos (b); geef dit terug;
Zoals je ziet, is de truc zowat de terugkeer van de deze
object (verwijzing naar huidige instantie in dit geval) om de keten door te laten gaan.
Als u niet weet hoe het "dit" sleutelwoord in JavaScript werkt, raad ik aan dit geweldige artikel te lezen Mike West.
We kunnen dan oproepen koppelen:
var obj = nieuwe MyClass (5); obj.foo (1) .foo (2) .foo (3);
Voordat ik hetzelfde probeerde te doen met Babylon.js, wilde ik er zeker van zijn dat dit geen prestatieproblemen zou opleveren.
Dus ik deed een benchmark!
var count = 10000000; var MyClass = function (a) this.a = a; MyClass.prototype.foo = function (b) // Doe wat complex werk this.a + = Math.cos (b); geef dit terug; MyClass.prototype.foo2 = function (b) // Doe wat complex werk this.a + = Math.cos (b); var start = new Date (). getTime (); var obj = nieuwe MyClass (5); obj.foo (1) .foo (2) .foo (3); for (var index = 0; index < 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 +": Zonder dit te retourneren: "+ (end2 - start2) +" ms ";
Zoals je kunt zien, foo
en foo2
doe precies hetzelfde. Het enige verschil is dat foo
kan worden geketend terwijl foo2
kan niet.
Uiteraard is de belketen verschillend tussen:
obj.foo (1) .foo (2) .foo (3);
en
obj2.foo2 (1); obj2.foo2 (2); obj2.foo2 (3);
Met deze code heb ik het uitgevoerd in Chrome, Firefox en IE om te bepalen of ik me zorgen moet maken over de prestaties.
En hier zijn de resultaten die ik kreeg:
Het punt is dat ik een bewerking aan de functie heb toegevoegd (Math.cos
) om een of andere vorm van behandeling door de functie te simuleren.
Als ik alles verwijder en gewoon de terugkeer
verklaring, in alle browsers is er geen verschil (eigenlijk slechts één of twee milliseconden voor 10.000.000 pogingen). U kunt dit voor uzelf testen in de browsers. En als je de apparaten niet bij de hand hebt, zijn er veel gratis tools beschikbaar op dev.modern.IE. Test de prestaties van een virtuele machine niet tegen een echt apparaat.
Dus mijn conclusie is: het is een poging!
Een vloeiende API is geweldig - het produceert meer leesbare code en je kunt het zonder enig probleem of prestatieverlies gebruiken!
Het zal je misschien een beetje verbazen, maar Microsoft heeft een heleboel gratis leren over veel open-source JavaScript-onderwerpen, en we zijn op een missie om nog veel meer te creëren met Microsoft Edge coming. Bekijk mijn eigen:
Of de leerserie van ons team:
En enkele gratis tools: Visual Studio Community, Azure Trial en cross-browser testtools voor Mac, Linux of Windows.
Dit artikel maakt deel uit van de web dev tech-serie van Microsoft. We zijn verheugd om te delen Microsoft Edge en het nieuwe EdgeHTML-renderingengine met jou. Download gratis virtuele machines of test op afstand op uw Mac, iOS, Android of Windows-apparaat @ http://dev.modern.ie/.