Photo by Kai Dahms on Unsplash

JS TARIHÇESI

JS’de MetaProgramming — 3

Bu yazıda’ da Proxy için Kullanım Senaryoları üzerinde duruyor olacağız.

1. Objenin Özelliklerine Erişimleri Yakalamak

Oluşturulan nesne üzerinde property erişimlerini yakalayıp bir yerlerde göstermek, kodunuzda bir hata problem veya davranışı hakkında bilgi almanızı sağlar.

Aşağıdaki örneği incelersek. Point nesnemizin x özelliğine atama veya okuma yapıldığında bilgileri console/file/network vb.. yerlere yazmak istediğimizde bu point tracePropertyAccess ile modify ederek artık tüm erişimlerin return eden WrapperObj üzerinden yapılmasını sağlıyoruz.

https://exploringjs.com/deep-js/ch_proxies.html#tracing-property-accesses-get-set

Peki tracePropertyAccess nasıl bir kod olması gerekir. Bunun bir Proxy kullanmadan birde Proxy kullanarak yapılacak 2 gerçekleştirimi bulunuyor. Proxy ve Reflect ile bu kod gerçekleştiriminiz daha temiz bir kod olduğunu görebilirsiniz.

https://exploringjs.com/deep-js/ch_proxies.html#tracing-property-accesses-get-set

2. Objenin Olmayan Özelliklerine Erişim’de Uyarı Vermek

Aslında bu tip durumlar için biz type check koyuyoruz JS tarafına. ama ciddi anlamda bu tarz Objenin içerisinde olmayan bir prop atama veya okumayı engellemek istiyorsak belki bunu Runtime değilde CompileTime Typescript ile yapmak daha mantıklı olabilir.

Her neyse konumuza dönersek .. Objemizi bir PrototypeChecker ile sarmaladığımızda, artık get kısmında olmayan property çağırımları için hata fırlatacak.. Aşağıdaki örnekte name:jane okurken yanlışlıkla property nmae şeklinde erişim sonucunda hata fırlattığını görebilirsiniz.

https://exploringjs.com/deep-js/ch_proxies.html#warning-about-unknown-properties-get-set

3. Array Negatif indeks destekler Hale Getirmek

Bildiğiniz gibi array 0 ile lenght-1 arasında değerleri döner. Bunu -1 değerlerde length terse doğru indeks alacak şekilde geliştirme yapmak istersek.

https://exploringjs.com/deep-js/ch_proxies.html#negative-array-indices-via-proxies

4. Data Binding

MVC mimari örüntüsü View ve Modeli birbirinden ayırıp, Controller katmanı sayesinde View ve Model sync olmasını sağlarız. Daha detaylı bilgi için bu konuda yazmış olduğum MVC (Model View Controller) blog okuyabilirsiniz.

Aşağıdaki örnekte Proxy üzerinden değişimleri dinleyecek bir Callback mekanizması kurulmuş. Bu sayede Model üzerinden Observer yapıları kurmak yerine Proxy üzerinden bir Observer ile model güncellemesi için tetikleme kodu Proxy içerisine tutulabilir.

https://exploringjs.com/deep-js/ch_proxies.html#data-binding-set

5. HTTP Request / Network Bağlantılarında Karmaşıklığı Ortadan Kaldırmak için

Bu konuda Proxy Örüntüsünü anlatırken en önemli konulardan biri Network erişimlerinde ara bir kademede değişik state(durumları) ele alarak bunları yazılım geliştiriciden soyutlar. Bu aşağıdaki örnektede benzer durum söz konusu..

https://exploringjs.com/deep-js/ch_proxies.html#accessing-a-restful-web-service-method-calls

6. Revocable references (Method Çağrımları Durdurabilen Referanslar)

Bazı nesnelerin çağrımı yetki veya bir kere erişim vb.. farklı durumlarda engellenmesi gerekebilir. Bu tarz durumlar için bir Proxy Objesi ile mevcut Target nesneyi sarmalayıp, Devre Açık / Devre Kapalı kodunu Proxy sağladığı fonksiyonlar ile yapabiliyor olmak bize ciddi kod okunabilirliği kazandırır.

Aşağıdaki örnekte Proxy enabled/disabled ile bu devreyi açıp kapatma işlemimi kurgulayabilirsiniz.

https://exploringjs.com/deep-js/ch_proxies.html#revocable-references

7. Diğer Kullanım Alanları

Proxy diğer kullanım alanlarını aşağıda listelersek…

  • DOM yapısını JS ile oluşturma (jsDom , vb…)
  • Local Object’ler yerine Remote Objectler üzerinden işlemleri yaptırma
  • Veritabanlarına erişim için Veri Erişiminde kullanmak
  • Algoritma ve işlemlerde geçen süreleri ve akışları izlemek için

Esktra: Proxy yapısını kullanan kütüphanelerede bu linkten erişebilirsiniz.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store