Динамикалык программалоо тилдериндеги маймылдарды жамоо: JavaScript мисалы

Javascript
динамикалык программалоо
Динамикалык программалоо тилдеринде маймылдарды жамоо cover image

Киришүү

Бул макалада Динамикалык жана Статикалык программалоо тилдеринин түшүнүктөрү, экөөнүн ортосундагы негизги айырмачылыктар жана ар бир парадигма артыкчылыктар жана тузактар ​​жагынан эмне менен камсыз кылары изилденет. Бул изилдөө андан ары динамикалык программалоо тилдерине, атап айтканда, ал мүмкүнчүлүк берген маанилүү үлгүлөрдүн бирине көңүл бурат: Monkey Patch, бул үлгү JavaScript ичиндеги мисалдын жардамы менен көрсөтүлөт.

Динамикалык жана статикалык программалоо тилдери

Терминология

Динамикалык же статикалык тил деген эмне экенин түшүнүү үчүн биз бул контекстте кеңири колдонулган бир нече негизги терминдерди түшүнүшүбүз керек: Компиляция убактысы, Аткаруу убактысы жана *Түрдү текшерүү *.

Compile жана Runtime - компиляция убактысынан баштап компьютердик программанын жашоо циклинин ар кандай этаптарына туура келген эки термин.

Түзүү убактысы

Компиляция убактысы программанын жашоо циклиндеги биринчи кадам болуп саналат. Иштеп чыгуучу берилген программалоо тилинде код жазат. Көбүнчө, машина жогорку деңгээлдеги тилде жазылган кодду түшүнө албайт, андыктан атайын компилятор аны аткарууга даяр болгон төмөнкү деңгээлдеги орто форматка которуу үчүн колдонулат.

Runtime

Runtime адатта эки кадамды камтыйт: программаны аткаруу үчүн керектүү ресурстарды анын нускамалары менен бирге бөлүштүрүү аркылуу эс тутумга жүктөө жана андан кийин программаны ошол нускамалардын тартибине ылайык аткаруу.

Төмөнкү диаграмма бул процессти көрсөтөт:

Түр текшерүү

Типти текшерүү дээрлик бардык программалоо тилдеринде орнотулган функция. Бул берилген өзгөрмөгө берилген маани ошол өзгөрмөнүн туура түрүнө туура келерин текшерүү мүмкүнчүлүгү. Ар бир программалоо тилинин эстутумда берилген типтеги маанини көрсөтүүнүн башка жолу бар. Бул ар түрдүү өкүлчүлүктөр маанинин түрү менен сиз ошол маанини дайындоого аракет кылган өзгөрмөнүн түрүнүн ортосундагы дал келүүнү текшерүүгө мүмкүндүк берет.

Эми биз программанын жашоо циклин жана түрүн текшерүүнү жогорку деңгээлде түшүнгөнүбүздөн кийин, биз статикалык программалоо тилдерин изилдөөнү уланта алабыз.

Статикалык программалоо тилдери

Статикалык программалоо тилдери, ошондой эле статикалык терилген тилдер деп аталат, бул биз компиляция этабында айткан типти текшерүүнү колдонгон тилдер. Бул эффективдүү түрдө өзгөрмө өзүнүн түрүн жарыялоодон сактайт жана ага жарыялоо түрүндөгү маанилерден башка эч кандай маани берилбейт дегенди билдирет. Статикалык программалоо тилдери типтер менен иштөөдө кошумча коопсуздукту сунуштайт, бирок бул катаал чектөөгө айланган кээ бир учурларда иштеп чыгуу процессин жайлатышы мүмкүн.

Динамикалык программалоо тилдери

Динамикалык программалоо тилдери, экинчи жагынан, иштөө убагында типти текшерүүнү колдонушат. Бул каалаган өзгөрмө программанын каалаган жеринде каалаган маанини кармай алат дегенди билдирет. Бул пайдалуу болушу мүмкүн, анткени ал иштеп чыгуучуга статикалык тилдерде жок ийкемдүүлүк деңгээлин сунуштайт. Динамикалык тилдер статикалык кесиптештерине караганда аткарууда жайыраак болот, анткени алар ар бир өзгөрмөнүн терүүнү динамикалык түрдө аныктоонун кошумча кадамын камтыйт.

Маймыл патч

Static vs Dynamic Typing - бул программалоо тилинин негизги өзгөчөлүгү, бир парадигма менен экинчисине өтүү сапатты жана өнүгүү ылдамдыгын бир топ жакшыртуучу ар кандай үлгүлөрдү жана практикаларды камсыздай алат. Дизайн чечимдерин кабыл алууда кылдаттык менен көңүл бурулбаса, ал көптөгөн чектөөлөр жана анти-үлгүлөр үчүн эшик ача алат.

Айрыкча, динамикалык түрдө терилген программалоо тилдери өзгөрмөнүн бир түрү менен чектелбегендиктен, ийкемдүүлүктүн жогорку деңгээлин сунуштайт. Бул ийкемдүүлүк программаларды ишке ашырууда жана мүчүлүштүктөрдү оңдоодо иштеп чыгуучуга кошумча жоопкерчиликти талап кылат жана күтүүсүз жүрүм-турум болуп кетпесин. Маймыл жамаачы үлгүсү ушул философиядан келип чыккан.

Monkey Patch иштөө учурунда компоненттин иштөөсүн кеңейтүү/өзгөртүү процессин билдирет. Каралып жаткан компонент китепкана, класс, метод же ал тургай модул болушу мүмкүн. Идея бир: коддун бир бөлүгү белгилүү бир тапшырманы аткаруу үчүн жасалат жана маймылдарды жамоонун максаты - коддун өзүн өзгөртпөстөн, жаңы тапшырманы аткаруу үчүн ошол коддун жүрүм-турумун өзгөртүү же кеңейтүү. .

Бул динамикалык программалоо тилинде мүмкүн болот, анткени биз кайсы түрдөгү компонент менен алектенбейли, ал дагы эле ар кандай атрибуттары бар объекттин бирдей структурасына ээ, атрибуттар объектте жаңы жүрүм-турумга жетүү үчүн кайра дайындала турган ыкмаларды кармай алат. анын ички жана ишке ашыруу деталдарына кирбестен. Бул үчүнчү тараптын китепканалары жана модулдары үчүн өзгөчө пайдалуу болот, анткени аларды өзгөртүү кыйыныраак.

Төмөнкү мисал маймыл жамаачы техникасын колдонуудан пайда ала турган жалпы колдонуу учурун көрсөтөт. Javascript бул жерде ишке ашыруу үчүн колдонулган, бирок бул дагы эле башка динамикалык программалоо тилине кеңири колдонулушу керек.

Мисал

Түйүндүн Native HTTP модулу менен минималдуу тестирлөө алкагын ишке ашыруу

Бирдикти жана интеграциялык тестирлөө Monkey Patching колдонуу учурларына туура келиши мүмкүн. Алар, адатта, интеграциялык тестирлөө үчүн бирден ашык кызматты камтыган тест учурларын же бирдикти тестирлөө үчүн API жана/же маалымат базасына көз карандылыкты камтыйт. Бул эки сценарийде жана биринчи кезекте тестирлөөнүн максаттарын ишке ашыруу үчүн биз тесттерибиздин бул тышкы ресурстардан көз карандысыз болушун каалайбыз. Буга жетүүнүн жолу – шылдыңдоо. Мазактоо тышкы кызматтардын жүрүм-турумуна окшоштурулуп жатат, андыктан тест коддун чыныгы логикасына басым жасай алат. Маймылдарды жамоо бул жерде пайдалуу болушу мүмкүн, анткени ал тышкы кызматтардын ыкмаларын биз "stub" деп атаган толтургуч методдоруна алмаштыруу менен өзгөртө алат. Бул ыкмалар сыноо учурларында күтүлгөн натыйжаны кайтарып берет, ошондуктан биз сыноолор үчүн өндүрүш кызматтарына суроо-талаптарды баштоодон качабыз.

Төмөнкү мисал NodeJs жергиликтүү http модулунда Monkey патчингинин жөнөкөй ишке ашырылышы. http модулу NodeJs үчүн http протоколунун ыкмаларын ишке ашырган интерфейс. Ал негизинен http протоколу аркылуу жалаң http серверлерин түзүү жана тышкы кызматтар менен байланышуу үчүн колдонулат.

Төмөндөгү мисалда биз колдонуучу идентификаторлорунун тизмесин алуу үчүн тышкы кызматты чакырган жөнөкөй сыноо учуру бар. Чыныгы кызматты чакыргандын ордуна, биз http get ыкмасын түзөбүз, андыктан ал жөн гана күтүлгөн натыйжаны кайтарат, бул кокус колдонуучу идентификаторлорунун массивинен. Бул чоң мааниге ээ эместей сезилиши мүмкүн, анткени биз жөн гана маалыматтарды алып жатабыз, бирок кандайдыр бир маалыматтарды өзгөртүүнү камтыган дагы бир сыноо ишин ишке ашырсак, тесттерди өткөрүүдө өндүрүш боюнча маалыматтарды кокусунан өзгөртүшүбүз мүмкүн.

Ушундай жол менен биз өз функцияларыбызды ишке ашыра алабыз жана өндүрүш кызматтарыбыздын коопсуздугун камсыз кылуу менен бирге ар бир функция үчүн тесттерди жаза алабыз.

// 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");
});

Жогорудагы код жөнөкөй, биз http модулун импорттойбуз, http.get ыкмасын жаңы ыкма менен кайра дайындайбыз, ал жөн гана id массивдерин кайтарып берет. Эми биз тесттин ичинде жаңы жамаачыланган ыкманы чакырабыз жана күтүлгөн жаңы натыйжаны алабыз.

~/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.

Жалпы тузактар ​​жана чектөөлөр

Маймылдарды жамоонун өзүнүн кемчиликтери жана чектөөлөрү бар экенине таң калуунун кереги жок. Түйүн модулунун тутумундагы модулдардын контекстинде, http сыяктуу глобалдык модулду жамоо терс таасирлери бар операция катары каралат, себеби http код базасынын каалаган жеринен жеткиликтүү жана башка бардык объектилер ага көз каранды болушу мүмкүн. Бул объекттер http модулунун кадимки жүрүм-турумунда иштешин күтүшөт, http методдорунун бирин өзгөртүү менен биз код базасынын ичиндеги бардык башка http көз карандылыктарын эффективдүү түрдө жок кылабыз.

Биз динамикалык түрдө терилген тилде иштеп жаткандыктан, нерселер дароо иштебей калышы мүмкүн жана демейкиде күтүүсүз жүрүм-турумга өтүшүбүз мүмкүн, бул мүчүлүштүктөрдү оңдоону өтө татаал тапшырмага айлантат. Башка колдонуу учурларда, бир эле атрибутта бир эле компоненттин эки башка патчтары болушу мүмкүн, бул учурда кайсы патч экинчисинен артыкчылыкка ээ болорун алдын ала айта албайбыз, натыйжада андан да күтүүсүз код пайда болот.

Маймылдарды жамоо ар кандай программалоо тилдеринин ортосундагы жүрүм-турумда бир аз айырмачылыктарга ээ болушу мүмкүн экенин да белгилей кетүү керек. Мунун баары тил дизайнына жана ишке ашыруу тандоосуна жараша болот. Мисалы, питондо, жамаачыланган ыкманы колдонгон бардык инстанциялар патчка таасир этпейт. Эгерде инстанция такталган ыкманы ачык эле чакырса, анда ал жаңы жаңыртылган версияны алат, тескерисинче, жамаачыланган методду көрсөткөн атрибуттары гана болушу мүмкүн болгон жана аны ачык чакырбаган башка инстанциялар баштапкы версияны алышат, бул питондун кандайча иштешине байланыштуу. класстарда милдеттүү түрдө иштейт.

Корутунду

Бул макалада биз статикалык жана динамикалык программалоо тилдеринин ортосундагы жогорку деңгээлдеги айырмачылыктарды изилдеп көрдүк, динамикалык программалоо тилдери бул тилдер сунуш кылган ийкемдүүлүктү колдонгон жаңы парадигмалар жана моделдер кандай пайда алаарын көрдүк. Биз көрсөткөн мисал Monkey patching менен байланышкан, бул ыкма коддун жүрүм-турумун булактан өзгөртпөстөн кеңейтүү үчүн колдонулган. Биз бул ыкманы колдонуу анын мүмкүн болуучу кемчиликтери менен бирге пайдалуу боло турган учурду көрдүк. Программалык камсыздоону иштеп чыгуу – бул бүтүмдөрдүн бардыгы жана көйгөйдү туура чечүү үчүн иштеп чыгуучудан кылдат ой жүгүртүүнү жана архитектуранын принциптерин жана негиздерин жакшы түшүнүүнү талап кылат.


Career Services background pattern

Карьера кызматтары

Contact Section background image

байланышта бололу

Code Labs Academy © 2024 Бардык укуктар корголгон.