Merhaba arkadaslar,
Programlamaya giris egitimlerinde hep sunu söylüyorum:
"Su an birseyleri sorgulayamiyoruz. Ancak ilerleyen seviyelerde bir seyleri sorgulayabilecek, bu neden böyle ya da bu neden böyle degil gibi tartismalar yapabilecegiz." Örnegin, Object Oriented Programming bilmeden önce, neden new anahtar kelimesini kullandigimizi bilmiyoruz ya da static anahtar kelimesinin ne ise yaradigini bilmiyoruz.
Bilgimiz çogaldikça, tüm bu sorularin yanitini buluyoruz ve yeni sorular sormaya basliyoruz. Bunlardan bir tanesi de "Plugin tabanli uygulama nasil gelistirilir?". Iste tam bu noktada Plugin Mimarisi karsimiza çikiyor. Sunu belirmekte fayda var, Plugin Mimarisi ile uygulama gelistirmenin tanimlanabilecek diger adi ise Modüler Yapida Uygulama Gelistirmektir. Her bir eklenti modül olarak adlandirilir.
Örnegin WordPress; Yönetim panelinden eklentiyi yüklüyoruz, aktif ediyoruz ve çalisiyor. Eklenti yüklemek ve aktiflestirmek bu kadar kolay. Dolayisi ile, kaynak kodlari ile islem yapmaya ve ekstra bazi islemler yapmaya gerek kalmiyor. (WordPress ve benzeri Blog,CMS sistemleri (Joomla,Drupal vs.) Plugin Mimarisini kullanan en belirgin örneklerdir.)
Kendi CMS'imizi ya da Blog'umuzu gelistirmek istedigimizde, eger plugin mimarisi ile gelistirmiyorsak yeni bir eklenti, yeni bir özellik getirmek istedigimizde tüm islemleri manuel ve kaynak kod bazinda yapmamiz gerekiyor. E peki bu sürekli gelistirilecek bir uygulama ise, maliyet çok artmayacak mi? Hem zaman, hem is gücü anlaminda çok ciddi bir kayip söz konusu olacaktir.
Peki, biz plugin mimarisi kullanarak uygulama gelistirmek istiyorsak, ne yapmamiz lazim?
Ayni WordPress'in çalisma mantiginda, -ki illa web uygulamalar için degil, masaüstü ve mobil uygulamalar da dahil- eklentiyi hazirlayip, yönetim paneli üzerinden yükleyip aktiflestirmemiz gerekir.
Dikkat edilmesi gereken en önemli konu;
Eklenti gelistirilecek uygulamanin, plugin mimarisi ile yapilmis olmasi. Uygulamaya dahil edilecek eklentiler için belirli bir sablon hazirlanmasi. Modüler yapi kullanan tüm uygulamalarda, gelistiriciler için hazirlanan eklenti gelistirme dökümanlari mevcuttur. Gelistirdigimiz eklenti, uygulama ile ilgili bazi bilgilere ihtiyaç duyacak, örnegin veritabani baglanti bilgisi, uygulama versiyon bilgisi vs. gibi. .NET framework ile bu tarz bir uygulama gelistirdigimizde, bu bilgileri temin edebilecegimiz en dogru yer WebConfig dosyasi olacaktir. WebConfig dosyasinin içerisindeki bazi etiketler bu bilgileri içermeli ve eklentimiz bu bilgileri oradan temin etmeli. Sonrasinda gerekli kurulum yapilmali, örnegin; Veritabani içerisinde tablo olusturmasi gerekiyorsa olusturmali, WebConfig dosyasina herhangi bir bilgiyi eklemesi gerekiyorsa da eklemeli.
Plugin Mimarisi ile uygulama gelistirmek için bilmemiz gereken bazi libraryler ve design patternler var;
Öncelikle, System namespace'inin içerisindeki Reflection kütüphanesini bilmemiz gerekiyor. Reflection, nesnelerin içerisindeki degerleri set etmemizi, istedigimiz nesne/lerin instance/larini almamizi saglayan, nesne içerisindeki tüm üyeleri görüntülememizi hatta herhangi bir üyenin (property,method,delegate,event vs.) adini degistirmemizi, valuelarini set etmemizi saglayan çok önemli bir library. Üstelik tüm bunlari runtime esnasinda yapmamizi sagliyor.
En önemli avantaji ise bu isleri yalnizca kendi olusturdugumuz kütüphanelerde degil, projemizde dahil ettigimiz tüm libraryler için gerçeklestirebiliyoruz.
Tabii islevi bu kadar basit degil, ancak temel anlamda bu sekilde özetleyebiliriz.
Reflection librarysini anlatirken genellikle sunlar çok söylenir: Ne gerek var? Neden runtime esnasinda nesnenin üyelerini set edelim, adini degistirelim ya da örnegini alalim? Gibi çesitli sorular/yorumlar geliyor.
En belirgin örnegi, makalemizin konusu olan Plugin Mimarisi ile uygulama gelistirmek. Az önce yazdigim gibi, uygulama çalistirilirken eklenti yüklenecek ve aktif edilecek. Bunu nasil yapacagiz? Hangi kütüphanelerden, design patternlerden faydalanacagiz? Ilk olarak basvuracagimiz kütüphane Reflection olacaktir.
Tabii ki tek basina reflection yetmiyor, devaminda bilmemiz gereken bazi design patternler var. Bunlarin basinda Dependency Injection geliyor. Dependency Injection, uygulama içerisindeki bagimliliklari azaltmamizi hatta yok etmemizi sagladigi için bu konuda oldukça önem tasiyor. Sonrasinda Plugin Architecture ve sirasiyla Repository, Unit Of Work gibi kullanmamiz gereken çesitli design patternler oluyor.
Çok karisik gibi görünen, aslinda oldukça basit bir yapidir arkadaslar. Gerçi hersey ögrenene kadar zor ve karisik gelebiliyor programlama dünyasinda, ögrendikten sonra oldukça kolay. Ancak bu konu, Object Oriented Programming'e hakim biri için çok zor olmayacaktir. Zira, yaptigimiz islemler tamamen OOP standardizasyon kurallarini uygulayarak, çesitli patternleri implement ederek, belirli notasyonlar dahilinde uygulamamizi eklenti tabanli hale getirmek.
Bir sonraki makalemizde, bu konu ile ilgili örnek uygulama gelistirecegiz arkadaslar.
Hepinize bol kod'lu günler diliyorum.
Yazılım Geliştirici & Yazılım Uzmanı