Photo by Raphaël Biscaldi on Unsplash

JS'de MetaProgramming — 1

Bu yazıda JS MetaProgramming kavramını anlamak için Axel Rauschmayer, Deep JS kitabından notlar çıkararak konuyu anlatmaya çalışacağım.

MetaProgramming dilin standart kullanımı dışında iskelet yapısı üzerinden dinamik erişmenizi sağlayan programlama yöntemidir. Java dilindeki Reflection API gibi.. Class, Metodlarına vb.. bilgilere dinamik olarak erişip, dinamik kod çağrımları gerçekleştirmek.

JS kendi iç mekanikleri zaten bu şekilde dinamik çalışabilirlik üzerine hazırlanmış . Örneğin eval fonksiyonunu kullanarak istediğiniz bir string veya bir dosyadan, network okuduğunu kodu dinamik çalıştırabilirsiniz. Aşağıdaki örnekte bu durumu anlatan kodu görebilirsiniz.

eval fonksiyonunu kullanma

İkinci Olarak Object.* ile oluşturulan Obje içerisindeki tüm değerleri ve yapıları görebilirsiniz. JS engine nasıl işletildiğini anlattığımız bu yazıdan konunun detaylarına ve nasıl bir Obje içerisindeki tüm Property erişebildiğimizi öğrenebilirsiniz.

Normal JS kodu yazarken Object direk olarak kullanırız normalde. Objeyi tanımlar ve içerisindeki property .name .sayHello()

Object Standart Kullanımı

ama biliyorsunuzki..biz objenin içerisindeki değerlere string üzerinden ['name'] ['sayHello()'] erişebilme imkanı aslında dilin ne kadar dinamik bir yapıda ve erişebilir olduğunu görebilirsiniz.

Objenin Property Dinamik Erişim..

Hatta bize gelen bir Objenin hangi Property olduğunu hiç bilmiyor olsak bile bu objenin property bir döngü içerisinde Object.keys ile dönüp erişebilme imkanına sahipsiniz.

Object.keys

Biraz daha derine inmek istersek Object.getOwnProperyDescriptor ile bu property tanımlamalarına erişebilir

Object.getOwnPropertyDescriptor

Kichales kitabında metaprogramming ile 3 türde kendi programlama yapısının atomlarına eriştiği ve değiştirebildiğinden bahsediyor.

  • Introspection: Sadece Meta Yapıya Okuma Amaçlı Erişim
  • Self-modification: Meta Yapıyı değiştirme
  • Intercession: Bazı dil işlemlerinin yapılarını yeniden tanımlama

Intospection, Object.keys vb… yöntemlerle sağlayabildiğimizi yukarıdaki örneklerden anlatmıştık

Self-modification, Objeye yeni property atamak, tanımlamak veya varolan bir property silme işlemini Object[…] üzerinden gerçekleştirebiliyoruz. Aynen aşağıdaki örnekte görebileceğiniz gibi.. Mevcut Objenin yapısını istediğim gibi değiştirebiliyorum.

Self Modification

Yukarıdaki kavramlara sadece Objeler üzerinde değil Fonksiyonlar üzerinde de MetaProgramming yeteneklerine sahibiz. Bu konuya Prototype konusunu anlatırken detaylıca şu yazıda bahsetmiştim.

Intercession yeteneği ES5 dil özellikleri içerisinde yer almıyordu. Dilin sağladığı bazı operasyonları değiştirebilme yeteneği.. Operator kavramını bu yazıda detaylı olarak anlatmıştım. JS, C++ benzer bir Operator Overloading yok ama en temel kullandığımız Object.* özelliklerini kullanımda araya girebilen Proxy nesnesi sayesinde normal object özelliklerini kullanırken bir kontrol mekanizması kurabilmemize imkan sağlamıştır.

Proxy Kullanımı

Kullanımı yukarıdaki örnekte olduğu gibi herhangi bir nesneniz, bir handler ile Proxy aracılığı ile onun çevresine sarılınca artık bizim nesneye olan erişimlerimiz Handler üzerinden akmaya başlayacaktır. Bu bir tasarım örüntüsüdür. Proxy Tasarım Örüntüsünü isterseniz bu yazıdan erişebilirsiniz.

Özetle hem okuma hemde bir değer atama sırasında istediğim gibi araya girebilme yeteneğine sahip olmuş olduk.

const name=user.firstName //Reading...
user.firstName="ahmet" //Writing...

Bu bazı Kullanım Senaryolar’da bize kodun daha temiz ve dilin önerdiği yapıda yazılmasını sağlayacak altyapıyı sağlamış olur.

Not: Proxy konusunu geniş bir konu yazıya 2,3 seri yazılar halinde devam ediyor olacağım.

Örnek Kodlar

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