Dinamik Programlama Dillerinde Maymun Yaması: Bir JavaScript Örneği

Javascript
Dinamik Programlama
Dinamik Programlama Dillerinde Maymun Düzeltme Eki cover image

Giriiş

Bu makale Dinamik ve Statik programlama dilleri kavramlarını, ikisi arasındaki temel farkları ve her paradigmanın avantajlar ve tuzaklar açısından neler sağladığını inceleyecektir. Bu inceleme ayrıca dinamik programlama dillerine, özellikle de sağladığı temel kalıplardan birine odaklanacaktır: Monkey Patch, bu kalıp JavaScript'teki bir örnek yardımıyla gösterilecektir.

Dinamik ve Statik Programlama Dilleri

Terminoloji

Dinamik bir dili veya statik dili neyin oluşturduğunu anlamak için, bu bağlamda yaygın olarak kullanılan birkaç anahtar terimi anlamamız gerekir: Derleme zamanı, Çalışma zamanı ve *Tür kontrolü *.

Derleme ve Çalışma Zamanı, bir bilgisayar programının yaşam döngüsündeki Derleme zamanı ile başlayan farklı aşamalara karşılık gelen iki terimdir.

Derleme Zamanı

Derleme zamanı bir programın yaşam döngüsünün ilk adımıdır. Bir geliştirici belirli bir programlama dilinde kod yazar. Çoğu zaman, makine yüksek seviyeli bir dilde yazılmış kodu anlayamaz, bu nedenle özel bir derleyici, onu yürütmeye hazır hale gelen daha düşük seviyeli bir ara formata çevirmek için kullanılır.

Çalışma zamanı

Çalışma zamanı genellikle iki adımı kapsar: talimatlarıyla birlikte yürütülmesi için gereken kaynakları tahsis ederek programın belleğe yüklenmesi ve ardından programın bu talimatların sırasını izleyerek çalıştırılması.

Aşağıdaki diyagram bu süreci göstermektedir:

Tip Kontrolü

Tip kontrolü neredeyse tüm programlama dillerinde yerleşik bir özelliktir. Belirli bir değişkene atanan değerin, o değişkenin doğru türüne karşılık gelip gelmediğini kontrol etme yeteneğidir. Her programlama dilinin, belirli bir türdeki değeri bellekte temsil etmenin farklı bir yolu vardır. Bu farklı gösterimler, bir değerin türü ile bu değeri atamaya çalıştığınız değişkenin türü arasındaki uygunluğu kontrol etmeyi mümkün kılar.

Artık program yaşam döngüsü ve tür kontrolü konusunda üst düzey bir anlayışa sahip olduğumuza göre, statik programlama dillerini keşfetmeye devam edebiliriz.

Statik Programlama Dilleri

Statik Programlama Dilleri, diğer adıyla statically typed dilleri, derleme aşamasında bahsettiğimiz tip kontrolünü uygulayan dillerdir. Bu, etkili bir şekilde bir değişkenin türünü bildirimden koruduğu ve ona bildirim türünden değerler dışında hiçbir değer atanamayacağı anlamına gelir. Statik programlama dilleri, türlerle uğraşırken ekstra güvenlik sağlar ancak bazı kullanım durumlarında, bunun sert bir kısıtlama haline geldiği durumlarda geliştirme sürecini yavaşlatabilir.

Dinamik Programlama Dilleri

Dinamik programlama dilleri ise çalışma zamanında tip kontrolü uygular. Bu, herhangi bir değişkenin programın herhangi bir noktasında herhangi bir değeri tutabileceği anlamına gelir. Bu, geliştiriciye statik dillerde bulunmayan bir düzeyde esneklik sunduğundan faydalı olabilir. Dinamik diller, her değişkenin yazılmasının dinamik olarak anlaşılması için ek bir adım içerdiğinden, yürütmede statik dillere göre daha yavaş olma eğilimindedir.

Maymun Yaması

Statik ve Dinamik Yazma, bir programlama dilinde temel bir özelliktir; bir paradigmayı diğerine tercih etmek, geliştirme kalitesini ve hızını önemli ölçüde artırabilecek bir dizi farklı model ve uygulamayı mümkün kılabilir. Tasarım kararları alınırken dikkatli bir şekilde dikkate alınmazsa, birçok sınırlamaya ve anti-örüntüye de kapı açabilir.

Özellikle dinamik olarak yazılan programlama dillerinin, bir değişkeni tek bir türle sınırlamadıkları için daha yüksek düzeyde esneklik sundukları bilinmektedir. Bu esneklik, öngörülemeyen davranışların meydana gelmediğinden emin olmak için programların uygulanması ve hata ayıklaması sırasında geliştiriciye ek sorumluluk maliyeti getirir. Maymun yama deseni bu felsefeden geliyor.

Monkey Patch, bir bileşenin çalışma zamanında genişletilmesi/değiştirilmesi sürecini ifade eder. Söz konusu bileşen bir kitaplık, bir sınıf, bir yöntem ve hatta bir modül olabilir. Fikir aynı: Belirli bir görevi gerçekleştirmek için bir kod parçası yapılır ve maymun yamalamanın amacı, bu kod parçasının davranışını, kodun kendisini değiştirmeden yeni bir görevi gerçekleştirecek şekilde değiştirmek veya genişletmektir. .

Bu, dinamik programlama dilinde mümkün kılınmıştır, çünkü ne tür bir bileşenle uğraşırsak uğraşalım, farklı niteliklere sahip bir nesnenin aynı yapısına sahiptir, nitelikler, nesnede yeni bir davranış elde etmek için yeniden atanabilecek yöntemleri tutabilir. iç kısımlarına ve uygulamanın ayrıntılarına girmeden. Bu, özellikle üçüncü taraf kitaplıklarda ve modüllerde ince ayar yapılması daha zor olduğundan kullanışlı hale gelir.

Aşağıdaki örnek, maymun yama tekniğinin kullanılmasından yararlanabilecek yaygın bir kullanım durumunu sergileyecektir. Burada uygulama amacıyla Javascript kullanıldı, ancak bu yine de genel olarak diğer dinamik programlama dilleri için geçerli olmalıdır.

Örnek

Düğümün Yerel HTTP Modülüyle Minimal Bir Test Çerçevesi Uygulama

Birim ve entegrasyon testleri, Monkey yamasının kullanım örnekleri kapsamına girebilir. Bunlar genellikle entegrasyon testi için birden fazla hizmete veya birim testi için API ve/veya veritabanı bağımlılıklarına yayılan test senaryolarını içerir. Bu iki senaryoda, test hedeflerini gerçekleştirmek için ilk etapta testlerimizin bu dış kaynaklardan bağımsız olmasını isteriz. Bunu sağlamanın yolu da alay etmekten geçer. Alay etme, testin kodun gerçek mantığına odaklanabilmesi için harici hizmetlerin davranışını simüle etmektir. Monkey patching, harici servislerin metotlarını “saplama” dediğimiz yer tutucu yöntemlerle değiştirerek değiştirebildiği için burada faydalı olabilir. Bu yöntemler test vakalarında beklenen sonucu döndürür, böylece yalnızca test amacıyla üretim hizmetlerine istek başlatmaktan kaçınabiliriz.

Aşağıdaki örnek, NodeJ'in yerel http modülünde Monkey yamasının basit bir uygulamasıdır. http modülü, NodeJ'ler için http protokol yöntemlerini uygulayan arayüzdür. Esas olarak barebone http sunucuları oluşturmak ve http protokolünü kullanarak harici hizmetlerle iletişim kurmak için kullanılır.

Aşağıdaki örnekte, kullanıcı kimlikleri listesini getirmek için harici bir hizmeti çağırdığımız basit bir test durumumuz var. Gerçek hizmeti çağırmak yerine http get yöntemini yamalıyoruz, böylece rastgele kullanıcı kimliklerinin bir dizisi olan beklenen sonucu döndürüyor. Sadece veri getirdiğimiz için bu çok önemli görünmeyebilir, ancak bir tür veriyi değiştirmeyi içeren başka bir test senaryosu uygularsak, testleri çalıştırırken üretimdeki verileri yanlışlıkla değiştirebiliriz.

Bu şekilde, üretim hizmetlerimizin güvenliğini sağlarken işlevlerimizi uygulayabilir ve her işlevsellik için testler yazabiliriz.

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

Yukarıdaki kod basittir, http modülünü içe aktarırız, http.get yöntemini yalnızca bir kimlik dizisi döndüren yeni bir yöntemle yeniden atarız. Şimdi test senaryosunun içinde yeni yamalı yöntemi çağırıyoruz ve beklenen yeni sonucu alıyoruz.

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

Yaygın Tuzaklar ve Sınırlamalar

Maymun yamalamanın kendi kusurları ve sınırlamaları olması sürpriz olmamalıdır. Düğüm modülü sistemindeki modüller bağlamında, http gibi genel bir modülün yamalanması, yan etkileri olan bir işlem olarak kabul edilir; bunun nedeni, http'ye kod tabanı içindeki herhangi bir noktadan erişilebilmesi ve herhangi bir başka varlığın ona bağımlı olabilmesidir. Bu varlıklar http modülünün olağan davranışında çalışmasını beklerler; http yöntemlerinden birini değiştirerek kod tabanı içindeki diğer tüm http bağımlılıklarını etkili bir şekilde ortadan kaldırırız.

Dinamik olarak yazılmış bir dilde çalıştığımızdan, işler hemen başarısız olmayabilir ve bunun yerine, hata ayıklamayı son derece karmaşık bir görev haline getiren öngörülemeyen bir davranışı varsayılan olarak tercih edebiliriz. Diğer kullanım durumlarında, aynı öznitelik üzerinde aynı bileşenin iki farklı yaması olabilir; bu durumda hangi yamanın diğerine göre öncelikli olacağını gerçekten tahmin edemeyiz ve bu da daha da öngörülemez bir kodla sonuçlanır.

Maymun yama uygulamasının farklı programlama dilleri arasında davranış açısından küçük farklılıklar gösterebileceğini belirtmek de önemlidir. Her şey dil tasarımına ve uygulama seçimlerine bağlıdır. Örneğin Python'da yamalı yöntem kullanan örneklerin tümü yamadan etkilenmeyecektir. Bir örnek açıkça yamalı yöntemi çağırırsa yeni güncellenmiş sürümü alır; bunun tersine, yalnızca yamalı yöntemi işaret eden ve onu açıkça çağırmayan niteliklere sahip olabilecek diğer örnekler orijinal sürümü alır; bunun nedeni Python'un nasıl olduğudur. sınıflarda bağlama çalışır.

Çözüm

Bu makalede statik ve dinamik programlama dilleri arasındaki üst düzey ayrımları araştırdık; dinamik programlama dillerinin, bu dillerin sunduğu doğal esneklikten yararlanarak yeni paradigmalardan ve kalıplardan nasıl yararlanabileceğini gördük. Gösterdiğimiz örnek, kodun davranışını kaynaktan değiştirmeden genişletmek için kullanılan bir teknik olan Monkey yaması ile ilgiliydi. Bu tekniğin kullanımının faydalı olabileceği gibi dezavantajlarının da olduğu bir durumu gördük. Yazılım geliştirme tamamen ödünleşimlerle ilgilidir ve sorun için doğru çözümün kullanılması, geliştiricinin ayrıntılı değerlendirmeler yapmasını ve mimari ilkeleri ve temellerinin iyi anlaşılmasını gerektirir.


Career Services background pattern

Kariyer Hizmetleri

Contact Section background image

İletişimde kalalım

Code Labs Academy © 2024 Her hakkı saklıdır.