Dinamik Proqramlaşdırma Dillərində Meymun Yamaqları: JavaScript Nümunəsi

Javascript
Dinamik Proqramlaşdırma
Dinamik Proqramlaşdırma Dillərində Monkey Patching cover image

Giriş

Bu məqalə Dinamik və Statik proqramlaşdırma dillərinin anlayışlarını, ikisi arasındakı əsas fərqləri və üstünlüklər və tələlər baxımından hər bir paradiqmanın nə təmin etdiyini araşdıracaq. Bu kəşfiyyat daha sonra dinamik proqramlaşdırma dillərinə, xüsusən də onun imkan verdiyi əsas nümunələrdən birinə diqqət yetirəcək: Monkey Patch, bu nümunə JavaScript-də nümunənin köməyi ilə nümayiş etdiriləcək.

Dinamik və Statik Proqramlaşdırma Dilləri

Terminologiya

Dinamik və ya statik dilin nədən ibarət olduğunu başa düşmək üçün bu kontekstdə tez-tez istifadə olunan bir neçə əsas termini başa düşməliyik: Tərtib etmə vaxtı, İcra vaxtı və *Növ yoxlaması *.

Compile və Runtime, Compile time ilə başlayan kompüter proqramının həyat dövrünün müxtəlif mərhələlərinə uyğun gələn iki termindir.

Tərtib etmə vaxtı

Kompilyasiya vaxtı proqramın həyat dövrünün ilk addımıdır. Tərtibatçı müəyyən bir proqramlaşdırma dilində kod yazır. Çox vaxt maşın yüksək səviyyəli dildə yazılmış kodu başa düşə bilmir, ona görə də onu icraya hazır olan daha aşağı səviyyəli ara formata tərcümə etmək üçün xüsusi tərtibçi istifadə olunur.

İş vaxtı

Runtime adətən iki addımı əhatə edir: proqramın icrası üçün lazım olan resursları təlimatları ilə birlikdə bölüşdürərək yaddaşa yükləmək və sonra həmin təlimatların ardıcıllığına uyğun olaraq proqramı icra etmək.

Aşağıdakı diaqram bu prosesi göstərir:

Növ yoxlanışı

Tip yoxlaması demək olar ki, bütün proqramlaşdırma dillərində quraşdırılmış funksiyadır. Bu, verilmiş dəyişənə təyin edilmiş dəyərin həmin dəyişənin düzgün tipinə uyğun olub olmadığını yoxlamaq qabiliyyətidir. Hər bir proqramlaşdırma dili yaddaşda verilmiş bir növün dəyərini əks etdirmək üçün fərqli üsula malikdir. Bu müxtəlif təqdimatlar dəyərin növü ilə bu dəyəri təyin etməyə çalışdığınız dəyişənin növü arasındakı uyğunluğu yoxlamağa imkan verir.

İndi proqramın həyat dövrü və növün yoxlanılması haqqında yüksək səviyyəli anlayışımız var, biz statik proqramlaşdırma dillərini araşdırmağa davam edə bilərik.

Statik Proqramlaşdırma Dilləri

Statik tipli dillər kimi də adlandırılan Statik Proqramlaşdırma Dilləri tərtib mərhələsində qeyd etdiyimiz tip yoxlamasını tətbiq edən dillərdir. Bu, effektiv şəkildə o deməkdir ki, dəyişən öz növünü bəyan etmədən saxlayır və ona bəyannamə tipindəki dəyərlərdən başqa heç bir dəyər təyin edilə bilməz. Statik proqramlaşdırma dilləri növlərlə işləyərkən əlavə təhlükəsizlik təklif edir, lakin bu, sərt məhdudiyyətə çevrildikdə müəyyən istifadə vəziyyətlərində inkişaf prosesini ləngidə bilər.

Dinamik Proqramlaşdırma Dilləri

Dinamik proqramlaşdırma dilləri isə iş vaxtında növ yoxlamasını tətbiq edir. Bu o deməkdir ki, istənilən dəyişən proqramın istənilən nöqtəsində istənilən dəyəri saxlaya bilər. Bu faydalı ola bilər, çünki o, tərtibatçıya statik dillərdə olmayan çeviklik səviyyəsini təklif edir. Dinamik dillər statik analoqlarına nisbətən icrada daha yavaş olur, çünki onlar hər bir dəyişənin yazılmasını dinamik şəkildə müəyyən etmək üçün əlavə bir addımı əhatə edir.

Meymun Yaması

Statik və Dinamik Yazma proqramlaşdırma dilində əsas xüsusiyyətdir, bir paradiqma ilə digəri üzərində getmək, keyfiyyəti və inkişaf sürətini əhəmiyyətli dərəcədə yaxşılaşdıra bilən bir çox fərqli nümunə və təcrübəyə imkan verə bilər. Dizayn qərarları qəbul edərkən diqqətli mülahizələr verilmədiyi təqdirdə, bir çox məhdudiyyətlər və anti-naxışlar üçün qapı aça bilər.

Xüsusilə, dinamik tipli proqramlaşdırma dillərinin daha yüksək səviyyəli çeviklik təklif etdiyi məlumdur, çünki onlar dəyişəni tək tiplə məhdudlaşdırmırlar. Bu çeviklik heç bir gözlənilməz davranışın baş vermədiyinə əmin olmaq üçün proqramların həyata keçirilməsi və sazlanması zamanı tərtibatçıya əlavə məsuliyyətin dəyəri ilə gəlir. Meymun yamaq nümunəsi bu fəlsəfədən gəlir.

Monkey Patch, işləmə zamanı komponentin işini genişləndirmək/dəyişdirmək prosesinə aiddir. Sözügedən komponent kitabxana, sinif, metod və ya hətta modul ola bilər. İdeya eynidir: bir kod parçası müəyyən tapşırığı yerinə yetirmək üçün hazırlanır və meymun yamaqlarının məqsədi kodun özünü dəyişdirmədən yeni bir tapşırığı yerinə yetirmək üçün həmin kod parçasının davranışını dəyişdirmək və ya genişləndirməkdir. .

Bu, dinamik proqramlaşdırma dilində mümkündür, çünki hansı növ komponentlə məşğul olmağımızdan asılı olmayaraq, o, hələ də fərqli atributları olan bir obyektin eyni strukturuna malikdir, atributlar obyektdə yeni davranışa nail olmaq üçün yenidən təyin edilə bilən metodları saxlaya bilər. onun daxili hissələrinə və həyata keçirilməsinin təfərrüatlarına varmadan. Bu, üçüncü tərəf kitabxanaları və modulları üçün xüsusilə faydalı olur, çünki onları düzəltmək daha çətindir.

Aşağıdakı nümunə meymun yamaq texnikasından istifadə etməkdən faydalana biləcək ümumi istifadə halını nümayiş etdirəcək. Javascript burada həyata keçirmək üçün istifadə edilmişdir, lakin bu, hər hansı digər dinamik proqramlaşdırma dillərinə geniş şəkildə şamil edilməlidir.

Nümunə

Node-un Native HTTP Modulu ilə Minimal Test Çərçivəsini həyata keçirin

Vahid və inteqrasiya testi Monkey patching-in istifadə hallarına aid edilə bilər. Onlar adətən inteqrasiya sınağı üçün birdən çox xidmətə və ya vahid sınağı üçün API və/yaxud verilənlər bazası asılılığına aid olan test hallarını əhatə edir. Bu iki ssenaridə və ilk növbədə sınaq məqsədlərinə nail olmaq üçün testlərimizin bu xarici resurslardan müstəqil olmasını istərdik. Buna nail olmağın yolu istehzadan keçir. Mocking xarici xidmətlərin davranışını simulyasiya edir, beləliklə test kodun faktiki məntiqinə diqqət yetirə bilər. Meymun yamaqları burada faydalı ola bilər, çünki o, xarici xidmətlərin üsullarını "stub" adlandırdığımız yer tutucu üsullarla əvəz etməklə dəyişdirə bilər. Bu üsullar sınaq hallarında gözlənilən nəticəni qaytarır ki, biz sırf sınaqlar üçün istehsal xidmətlərinə sorğuların başlanmasından qaça bilək.

Aşağıdakı nümunə NodeJs yerli http modulunda Monkey patching-in sadə tətbiqidir. http modulu NodeJs üçün http protokol üsullarını həyata keçirən interfeysdir. Əsasən barebone http serverləri yaratmaq və http protokolundan istifadə edərək xarici xidmətlərlə əlaqə yaratmaq üçün istifadə olunur.

Aşağıdakı nümunədə istifadəçi identifikatorlarının siyahısını əldə etmək üçün xarici xidmətə zəng etdiyimiz sadə bir sınaq işi var. Həqiqi xidmətə zəng etmək əvəzinə biz http get metodunu düzəldirik ki, o, təsadüfi istifadəçi identifikatorları massivi olan gözlənilən nəticəni qaytarsın. Biz sadəcə məlumat əldə etdiyimiz üçün bu o qədər də vacib görünməyə bilər, lakin bir növ məlumatların dəyişdirilməsini nəzərdə tutan başqa bir sınaq işini həyata keçirsək, sınaqları yerinə yetirərkən istehsalla bağlı məlumatları təsadüfən dəyişdirə bilərik.

Bu yolla biz öz funksiyalarımızı həyata keçirə və istehsal xidmətlərimizin təhlükəsizliyini təmin edərkən hər bir funksionallıq üçün testlər yaza bilərik.

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

Yuxarıdakı kod sadədir, biz http modulunu idxal edirik, http.get metodunu sadəcə bir sıra idləri qaytaran yeni metodla yenidən təyin edirik. İndi test vəziyyətində yeni yamaqlı metodu çağırırıq və yeni gözlənilən nəticəni alırıq.

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

Ümumi tələlər və məhdudiyyətlər

Meymun yamaqlarının öz qüsurları və məhdudiyyətləri olması təəccüblü olmamalıdır. Qovşaq modul sistemindəki modullar kontekstində http kimi qlobal modulu yamaq yan təsirləri olan əməliyyat hesab olunur, buna görə http kod bazasının daxilində istənilən nöqtədən əldə edilə bilər və hər hansı digər qurum ondan asılı ola bilər. Bu qurumlar http modulunun adi davranışında işləməsini gözləyirlər, http metodlarından birini dəyişdirməklə biz kod bazasında bütün digər http asılılıqlarını effektiv şəkildə qırırıq.

Dinamik olaraq yazılmış bir dildə işlədiyimiz üçün işlər dərhal uğursuz olmaya bilər və sazlamanı son dərəcə mürəkkəb vəzifəyə çevirən gözlənilməz bir davranışa üstünlük verə bilər. Digər istifadə vəziyyətlərində eyni atributda eyni komponentin iki fərqli yaması ola bilər, bu halda biz həqiqətən də hansı yamağın digərindən üstün olacağını təxmin edə bilmərik və nəticədə daha gözlənilməz kod yaranır.

Onu da qeyd etmək lazımdır ki, meymun yamaqları müxtəlif proqramlaşdırma dilləri arasında davranışda kiçik dəyişikliklərə malik ola bilər. Hamısı dil dizaynından və icra seçimlərindən asılıdır. Məsələn, python-da yamaqlanmış metoddan istifadə edən bütün nümunələr yamaqdan təsirlənməyəcək. Bir nümunə yamaqlanmış metodu açıq şəkildə çağırırsa, o zaman yeni yenilənmiş versiyanı əldə edəcək, əksinə, yalnız yamaqlanmış metoda işarə edən atributlara malik ola bilən və onu açıq şəkildə çağırmayan digər nümunələr orijinal versiyanı alacaq, bu, python-un necə işləməsi ilə bağlıdır. siniflərdə bağlama fəaliyyət göstərir.

Nəticə

Bu məqalədə biz statik və dinamik proqramlaşdırma dilləri arasındakı yüksək səviyyəli fərqləri araşdırdıq, dinamik proqramlaşdırma dillərinin bu dillərin təklif etdiyi özünəməxsus çeviklikdən istifadə edən yeni paradiqma və nümunələrdən necə faydalana biləcəyini gördük. Göstərdiyimiz nümunə, kodun davranışını mənbədən dəyişdirmədən genişləndirmək üçün istifadə edilən bir texnika olan Monkey patching ilə əlaqəli idi. Bu texnikanın istifadəsinin potensial çatışmazlıqları ilə yanaşı faydalı olacağı bir hal gördük. Proqram təminatının inkişafı tamamilə mübadilələrə aiddir və problemin düzgün həllindən istifadə etmək tərtibatçıdan ətraflı mülahizələri və memarlıq prinsipləri və əsaslarını yaxşı başa düşməyi tələb edir.


Career Services background pattern

Karyera Xidmətləri

Contact Section background image

Əlaqə saxlayaq

Code Labs Academy © 2024 Bütün hüquqlar qorunur.