Monkey Patching programazio-lengoaia dinamikoetan: JavaScript adibide bat

Javascript
programazio dinamikoa
Monkey Patching programazio-lengoaia dinamikoetan cover image

Sarrera

Artikulu honetan programazio-lengoaia dinamiko eta estatikoen kontzeptuak, bien arteko desberdintasun nagusiak eta paradigma bakoitzak abantaila eta hutsuneei dagokienez ematen duena aztertuko da. Esplorazio honek programazio lengoaia dinamikoetan arreta gehiago jarriko du, batez ere ahalbidetzen duen funtsezko ereduetako batean: Monkey Patch, eredu hau JavaScript-en adibide baten laguntzaz erakutsiko da.

Programazio-lengoaia dinamikoak eta estatikoak

Terminologia

Hizkuntza dinamikoa edo estatikoa zer den ulertzeko, testuinguru honetan erabili ohi diren gako-termino batzuk ulertu behar ditugu: Konpilazio denbora, Exekuzio denbora eta *Type checking. *.

Konpilatu eta Exekutatu denbora programa informatiko baten bizitza-zikloko etapa ezberdinei dagozkien bi termino dira, Konpilazio denboratik hasita.

Konpilazio denbora

Konpilazio denbora programa baten bizi-zikloaren lehen urratsa da. Garatzaile batek kodea idazten du programazio-lengoaia jakin batean. Gehienetan, makinak ezin du goi-mailako hizkuntza batean idatzitako kodea ulertu, beraz, konpilatzaile dedikatu bat erabiltzen da exekutatzeko prest dagoen maila baxuagoko bitarteko formatu batera itzultzeko.

Exekuzioa

Exekuzio-denborak normalean bi urrats biltzen ditu: programa memorian kargatzea bere exekuziorako beharrezkoak diren baliabideak bere jarraibideekin batera esleituz eta, ondoren, programa exekutatu instrukzio horien ordena jarraituz.

Ondorengo diagramak prozesu hau erakusten du:

Mota egiaztatzea

Mota egiaztatzea ia programazio-lengoaia guztietan integratutako funtzioa da. Aldagai jakin bati esleitutako balio bat aldagai horren mota zuzenari dagokion egiaztatzeko gaitasuna da. Programazio-lengoaia bakoitzak modu ezberdin bat du memorian mota jakin bateko balio bat irudikatzeko. Irudikapen ezberdin hauek balio baten motaren eta balio hori esleitzen saiatzen zaren aldagai motaren arteko korrespondentzia egiaztatzea ahalbidetzen dute.

Orain, programa baten bizi-zikloaren eta motaren egiaztapenaren goi-mailako ulermena dugunean, programazio-lengoaia estatikoak aztertzen jarrai dezakegu.

Programazio Lengoaia Estatikoak

Programazio Lengoaia Estatikoak, estatikoki idatzitako lengoaiak ere deitzen direnak, konpilazio fasean aipatu dugun mota egiaztatzea aplikatzen duten hizkuntzak dira. Horrek esan nahi du aldagai batek bere mota deklaraziotik mantentzen duela eta ezin zaiola baliorik esleitu bere deklarazio motako balioak ez ezik. Programazio-lengoaia estatikoek segurtasun gehigarria eskaintzen dute motekin tratatzerakoan, baina garapen-prozesua moteldu dezakete erabilera-kasu jakin batzuetan hori murrizketa gogorra bihurtzen denean.

Programazio Lengoaia Dinamikoak

Programazio-lengoaia dinamikoek, berriz, exekuzio garaian mota egiaztatzea aplikatzen dute. Horrek esan nahi du edozein aldagaik edozein balio eduki dezakeela programako edozein puntutan. Hau onuragarria izan daiteke, hizkuntza estatikoetan ez dagoen malgutasun maila eskaintzen diolako garatzaileari. Hizkuntza dinamikoak exekuzioan motelagoak izan ohi dira haien pareko estatikoak baino, aldagai bakoitzaren idazketa dinamikoki zehazteko urrats gehigarri bat dakarrelako.

Tximinoaren adabakia

Idazketa estatikoa vs dinamikoa programazio-lengoaia batean oinarrizko ezaugarria da, paradigma bat bestearen aldean joateak eredu eta praktika ezberdin ugari ahalbidetu ditzake, kalitatea eta garapen-abiadura nabarmen hobetu ditzaketenak. Muga eta ereduen aurkako ateak ere ireki ditzake diseinuaren erabakiak hartzerakoan kontu handirik hartzen ez bada.

Bereziki, dinamikoki idatzitako programazio lengoaiek malgutasun maila handiagoa eskaintzen dutela ezagutzen da, aldagai bat mota bakarrera mugatzen ez dutelako. Malgutasun horrek garatzaileari erantzukizun gehigarriaren kostua dakar programak ezartzean eta arazketan, ezusteko jokabiderik gertatzen ez dela ziurtatzeko. Tximinoaren adabaki eredua filosofia honetatik dator.

Monkey Patch-ek osagai baten funtzionamendua hedatzeko/aldatzeko prozesuari egiten dio erreferentzia exekuzioan. Aipatutako osagaia liburutegi bat, klase bat, metodo bat edo modulu bat izan daiteke. Ideia bera da: kode zati bat eginkizun jakin bat betetzeko egiten da, eta tximinoen adabakiaren helburua kode horren portaera aldatzea edo zabaltzea da, zeregin berri bat bete dezan, dena kodea bera aldatu gabe. .

Hori posible da programazio-lengoaia dinamikoan, zeren zein osagai motarekin ari garen edozein dela ere, objektu baten egitura berdina du atributu desberdinak dituena, atributuek objektuan portaera berri bat lortzeko berriro esleitu daitezkeen metodoak eduki ditzakete. bere barnean eta ezarpenaren xehetasunetan sartu gabe. Hau bereziki erabilgarria da hirugarrenen liburutegi eta moduluen kasuan, horiek doitzea zailagoa izaten baita.

Ondorengo adibidean tximinoaren adabaki teknika erabiltzeak onuragarria izan daitekeen ohiko erabilera kasu bat erakutsiko du. Javascript-a hemen inplementatzeko erabili zen, baina hau, oro har, beste edozein programazio-lengoaia dinamikotan aplikatu beharko litzateke.

Adibidea

Ezar ezazu proba-esparru minimo bat Node-ren jatorrizko HTTP moduluarekin

Unitate eta integrazio probak Monkey adabakiaren erabilera kasuetan egon daitezke. Normalean, integrazio-probak egiteko zerbitzu bat baino gehiagotan edo API eta/edo datu-baseen menpekotasunetan parte hartzen dute unitate-probak egiteko. Bi eszenatoki hauetan, eta probaren helburuak lehenik eta behin betetzeko, gure probak kanpoko baliabide horietatik independenteak izatea nahi genuke. Hori lortzeko bidea burla egitea da. Burla kanpoko zerbitzuen portaera simulatzen ari da, proba kodearen benetako logikan zentratu ahal izateko. Tximinoaren adabakia lagungarria izan daiteke hemen, kanpoko zerbitzuen metodoak alda ditzakeelako "stub" deitzen dugun leku-marken metodoekin ordezkatuz. Metodo hauek proba-kasuetan espero den emaitza itzultzen dute, ekoizpen-zerbitzuei eskaerak hastea saihestu ahal izateko probak egiteko.

Hurrengo adibidea Monkey adabakiaren inplementazio sinple bat da NodeJs jatorrizko http moduluan. http modulua NodeJs-en http protokolo metodoak inplementatzen dituen interfazea da. Batez ere http zerbitzari hutsak sortzeko eta kanpoko zerbitzuekin komunikatzeko erabiltzen da http protokoloa erabiliz.

Beheko adibidean proba-kasu sinple bat dugu, non kanpoko zerbitzu bati deitzen diogun erabiltzailearen IDen zerrenda lortzeko. Benetako zerbitzura deitu beharrean, http get metodoa adabakitzen dugu, espero den emaitza itzultzeko, hau da, ausazko erabiltzailearen IDen multzoa. Baliteke horrek ez duela garrantzi handirik irudituko datuak eskuratzen ari garelako, baina nolabaiteko datuak aldatzea dakarren beste proba kasu bat ezartzen badugu, ustekabean ekoizpenari buruzko datuak alda ditzakegu probak exekutatzen direnean.

Horrela gure funtzionalitateak inplementa ditzakegu, eta funtzionalitate bakoitzeko probak idatzi ditzakegu gure ekoizpen zerbitzuen segurtasuna bermatuz.

// import the http module
let http = require("http");

// patch the get method of the http module
http.get = async function(url) {
  return {
    data: ["1234", "1235", "1236", "1236"]
  };
}

// example test suite, call new patched get method for testing
test('get array of user ids from users api', async () => {
  const res = await http.get("https://users.api.com/ids");
  const userIds = res.data;
  expect(userIds).toBeDefined();
  expect(userIds.length).toBe(4);
  expect(userIds[0]).toBe("1234");
});

Goiko kodea erraza da, http modulua inportatzen dugu, http.get metodoa berriro esleitzen dugu id-maiz bat besterik ez duen metodo berri batekin. Orain adabakitutako metodo berriari deitzen diogu proba kasuaren barruan eta espero dugun emaitza berria lortzen dugu.

~/SphericalTartWorker$ npm test

> nodejs@1.0.0 test
> jest

PASS  ./index.test.js
  ✓ get array of user ids from users api (25 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.977 s, estimated 2 s
Ran all test suites.

Ohiko hutsuneak eta mugak

Ez da harritzekoa izango tximinoen adabakiak bere akatsak eta mugak izatea. Nodo-modulu-sistemako moduluen testuinguruan, http bezalako modulu global bat adabakitzea albo-ondorioak dituen eragiketatzat hartzen da, hau da, http kode-basearen edozein puntutatik eskura daitekeelako eta beste edozein entitatek haren menpekotasuna izan dezakeelako. Entitate hauek http moduluak bere ohiko portaeran funtzionatzea espero dute, http metodoetako bat aldatuz kode-oinarriaren barruan dauden beste http mendekotasun guztiak modu eraginkorrean hautsiko ditugu.

Dinamikoki idatzitako hizkuntza baten barruan ari garenez, baliteke gauzek ez dutela berehala hutsik egin eta nahiago dute ezusteko jokabide bat izatea, eta horrek arazketa zeregin oso konplexua bihurtzen du. Beste erabilera-kasu batzuetan, osagai bereko bi adabaki ezberdin egon daitezke atributu berean, eta, kasu horretan, ezin dugu benetan aurreikusi zein adabaki izango duen bestearen gainetik, eta ondorioz, kode are ezustekoagoa izango da.

Garrantzitsua da aipatzea ere tximinoen adabakiak programazio-lengoaia ezberdinen artean portaeran aldaketa txikiak izan ditzakeela. Guztia hizkuntza-diseinuaren eta ezarpenaren aukeren araberakoa da. Adibidez, python-en, adabakiak metodo bat erabiltzen duten instantzia guztiek ez dute adabakiak eragingo. Instantzia batek adabakitutako metodoari esplizituki deitzen badio, bertsio eguneratu berria lortuko du, aitzitik, adabakitako metodora seinalatzen duten eta berari esplizituki deitzen ez duten beste instantziek jatorrizko bertsioa lortuko dute. klaseetan lotesleak funtzionatzen du.

Ondorioa

Artikulu honetan programazio-lengoaia estatiko eta dinamikoen arteko maila altuko bereizketak aztertu ditugu, programazio-lengoaia dinamikoek paradigma eta eredu berrietatik nola onura daitezkeen ikusi genuen hizkuntza hauek eskaintzen duten berezko malgutasuna aprobetxatuz. Erakutsi genuen adibidea Monkey adabakiarekin erlazionatuta zegoen, kodearen portaera iturburutik aldatu gabe zabaltzeko erabiltzen den teknika. Teknika honen erabilera onuragarria izango zen kasu bat ikusi genuen, izan ditzakeen eragozpenekin batera. Softwarearen garapena konpromezuei buruzkoa da, eta arazoaren irtenbide egokia erabiltzeak garatzailearen gogoeta landuak eta arkitekturaren printzipioak eta oinarriak ondo ulertzea eskatzen du.


Career Services background pattern

Lanbide Zerbitzuak

Contact Section background image

Jarrai gaitezen harremanetan

Code Labs Academy © 2024 Eskubide guztiak erreserbatuta.