Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 9589|Vastaus: 0

[JavaScript] Hanki syvällinen ymmärrys Javascrip{filter}t:stä: suunnittelumallin metamoodista

[Kopioi linkki]
Julkaistu 30.7.2018 10.30.45 | | |
Johdanto

Flyweight-tila tukee tehokkaasti suurta määrää hienojakoisia objekteja ajamalla jakamisteknologiaa, välttäen suuren määrän saman sisällön sisältävien luokkien (kuten muistin kulutuksen) ylikuormituksen ja sallien kaikkien jakaa yhden luokan (meta-luokka).

Ohjelmoinnissa on joskus tarpeen tuottaa suuri määrä hienojakoisia luokkainstansseja datan esittämiseksi, ja jos näillä instansseilla on käytännössä sama ylikuorma muutamaa parametria lukuun ottamatta, luokkien määrä voidaan merkittävästi pienentää. Jos voit siirtää nämä parametrit luokka-instanssin ulkopuolelle ja välittää ne sisään, kun metodia kutsutaan, voit vähentää yksittäisten instanssien määrää jakamalla.

Mitä sitten, jos soveltaisit metatilaa JavaScriptissä? On kaksi tapaa: ensimmäinen sovelletaan datakerrokseen, pääasiassa suureen määrään samankaltaisia objekteja muistissa; Toinen lisäys on DOM-kerrokseen, jota voidaan käyttää keskustapahtumanhallinnassa välttämään tapahtumakahvojen liittäminen jokaiseen lapsielementtiin vanhemmassa kontissa.

Nauti metaversumista ja datakerroksista

Flyweightissa on kaksi tärkeää käsitettä – sisäinen tila sisäinen ja ulkoinen tila ulkoinen; sisäistä tilaa hallitaan objektissa sisäisin menetelmin, ja ulkoinen tieto voidaan poistaa tai tallentaa ulkoisesti.

Suoraan sanottuna se tarkoittaa ensin alkuperäisen mallin nipistämistä, sitten eri tilanteissa ja ympäristöissä, ja sen jälkeen tiettyjen mallien tuottamista omine ominaisuuksineen, tietenkin eri uusia objekteja täytyy tuottaa tässä, joten tehdastila esiintyy usein Flyweight-tilassa, Flyweightin sisäinen tila jaetaan ja Flyweight-tehdas vastaa Flyweight-poolin (kuviopoolin) ylläpidosta sisäisen tilan objektien tallentamiseen.

Käytä Yuanyuan-tilaa

Näytetään, että jos meillä olisi kirjasto, joka hallinnoisi kaikkia kirjoja, jokaisen kirjan metatiedot näyttäisivät alustavasti tältä:

ID
Nimike
Kirjailija
Genre
Sivumäärä
Julkaisijan tunnus
ISBN

Meidän täytyy myös määritellä, milloin ja kenen toimesta kukin kirja lainattiin, sekä palautuspäivä ja saatavuus:

katso ulos Päivämäärä
checkoutJäsen
dueReturnDate
Saatavuus

Koska kirja-objekti on asetettu seuraavaan koodiin, huomaa, että koodia ei ole vielä optimoitu:


Ohjelma voi toimia aluksi hyvin, mutta ajan myötä kirjojen määrä voi kasvaa suurissa määrissä, ja jokaisella kirjalla on oma versio ja määränsä, ja huomaat, että järjestelmä hidastuu yhä enemmän. Tuhansia kirjan objekteja voi kuvitella muistissa, ja meidän täytyy optimoida ne jakamismoodilla.

Voimme jakaa datan kahteen tyyppiin: sisäiseen ja ulkoiseen, ja kirjan objektiin liittyvä data (otsikko, tekijä jne.) voidaan liittää sisäisiin attribuutteihin, kun taas (checkoutMember, dueReturnDate jne.) voidaan liittää ulkoisiin attribuutteihin. Näin seuraava koodi voi jakaa saman objektin samassa kirjassa, koska riippumatta siitä, kuka kirjan lainaa, niin kauan kuin kirja on sama kirja, perustiedot ovat samat:



Määrittele perustehdas

Määritellään perustehdas, joka tarkistaa, onko kirjan objekti luotu aiemmin, palautetaan jos on, ja luodaan uudelleen ja tallennetaan jos ei, mikä varmistaa, että luomme vain yhden objektin jokaiselle kirjatyypille:



Hallinnoi ulkoista tilaa


Ulkoinen tila on suhteellisen yksinkertainen, lukuun ottamatta kirjaa, jonka kapseloimme, kaikki muu täytyy hallita tässä:



Näin voimme tallentaa saman tiedon samasta kirjasta kirjanhallintaobjektiin, ja vain yhden kappaleen; Aiempaan koodiin verrattuna on havaittavissa, että paljon muistia on tallennettu.

Nauti meta-tilasta ja DOM:sta


En puhu paljoa DOM-kuplimistapauksesta, uskon että kaikki tietävät jo, annetaan kaksi esimerkkiä.

Esimerkki 1: Keskitetty tapahtumien hallinta
Esimerkiksi, jos meillä on monia samankaltaisia elementtejä tai rakenteita (kuten valikoita tai useita li:tä ul:ssa), jotka tarvitsevat hänen klikkaustapahtumansa seuraamista, meidän täytyy sitoa jokainen lisäelementti tapahtumasidontaan; jos elementtejä on hyvin, hyvin paljon, suorituskyky voidaan kuvitella, ja yhdistettynä kuplimisen tuntemukseen jokin lapsielementti laukaisee, tapahtuma kuplii korkeampaan elementtiin laukaistuessaan, joten tämän ominaisuuden avulla voimme käyttää Xiangyuan-tilaa. Voimme seurata näiden samankaltaisten elementtien emoelementtien tapahtumia ja määrittää, mikä lapsielementti saa tapahtuman ennen jatkotoimia.

Tässä yhdistämme jQueryn bind/unbind-menetelmät esimerkiksi.

HTML:



JavaScript:



Esimerkki 2: Sovella Xiangyuan-tilaa suorituskyvyn parantamiseksi

Toinen esimerkki, joka liittyy edelleen jQueryyn, käytämme yleensä elementtiobjektia tapahtuman callback-funktiossa, käytämme usein muotoa $(this), itse asiassa se luo toistuvasti uuden objektin, koska tämä callback-funktiossa on jo itse DOM-elementti, meidän täytyy käyttää seuraavaa koodia:



Itse asiassa, jos meidän täytyy käyttää jotain kuten $(this), voimme myös toteuttaa oman versionsa yksittäisestä instanssikuviosta, esimerkiksi voimme toteuttaa funktion kuten jQuery.signle(this), joka palauttaa itse DOM-elementin:



Näin käytetään:



Tämä palauttaa DOM-elementin sellaisenaan, ilman että jQuery-objektia syntyy.

yhteenveto


Flyweight-tila on tila, joka parantaa ohjelman tehokkuutta ja suorituskykyä, mikä nopeuttaa ohjelman suoritusnopeutta huomattavasti. Sovelluksia on monia: esimerkiksi jos haluat lukea sarjan merkkijonoja tietokannasta, joista monet ovat duplikaatteja, voimme tallentaa nämä merkkijonot Flyweight-pooliin.

Jos sovellus käyttää suurta määrää objekteja ja nämä suuret objektimäärät aiheuttavat paljon tallennustilaa, sen tulisi harkita jakamistilan käyttöä; Jos poistat objektin ulkoisen tilan, voit korvata monia olioryhmiä suhteellisen vähillä jaetuilla objekteilla, ja voit harkita Xiangyuan-tilan käyttöä.

Viiteosoite:http://www.addyosmani.com/resour ... ok/#detailflyweight





Edellinen:Suosittelen kolmea verkkosivustoa ikonikuvakkeiden löytämiseksi
Seuraava:Odottavien viestien määrä, Viestit jonossa, Viesti...
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com