“YSignalSlot” Kütüphanesi Tanıtımı

YSignalSlot_logo

Yeni göz bebeğim “YSignalSlot” kütüphanesi ile tanışın.

Bu kütüphane ile QT, Boost ve daha birçok kendini kanıtlamış şirketin kullandığı signal-slot mekanizmasına kendi yorumumu getirmiş oldum. C++ dili ile yazılmış bu kütüphane umarım kullanıcılarına faydalı olur.

Kütüphane Adı: YSignalSlot
Web Sitesi: ylib.yigityuce.com/ysignalslot
Yayın Tarihi: 04.09.2014
Yazar: Yiğit Yüce – ygtyce@gmail.com

 

 

YSignalSlot’u tarif edecek olsan önce neleri söylersin?

YSignalSlot “header-only” bir C++ kütüphanesidir yani kurulum gerektirmez yalnızca “include” edilir. Çoğunlukla derleme zamanlı (compile-time) olduğu için hızlıdır. Sınırsız sayıda “slot” fonksiyonu ve fonksiyon parametresi ile çalışabilir ve değer döndürebilir yapıdadır.

 

“Slot” fonksiyonu ne demek?

“Slot” fonksiyonları, kendi tanımladığınız bir sinyali tetiklediğinizde (çağırdığınızda) çalışacak fonksiyonlardır. Şöyle düşünebilirsiniz;  tek bir yere dokunarak, oraya bağlı olan birden çok ve farklı yerdeki işi yapabileceksiniz. Farklı yerlerdeki işler “slot” fonksiyonu oluyor.

 

Sınırsız “slot” fonksiyonu ve sınırsız fonksiyon parametresi nedir?

Şu an piyasada olan çoğu signal-slot sistemi sınırsız “slot” fonksiyonu ile çalışabilmektedir ancak bu fonksiyonlara gönderilebilecek parametre sayısı çoğunda sınırsız değildir. Örneğin SigSlot kütüphanesinde, “slot” fonksiyonlarının parametre sayısı sekizdir ve “slot” fonksiyonlarının tanımladığı sınıfın ismi “slot” fonksiyonunun aldığı parametre sayısına göre değişmektedir. Mesela 2 parametreli bir fonksiyonu tanımlarken slot2(…), 5 parametreli bir fonksiyonu tanımlarken slot5(…) gibi.

 

Bu sistemi kullanan emsallerinden hangisine daha çok benziyor?

Kesinlikle Qt değil çünkü Qt kodlarının derlenmesi aşamasında MOC(meta object compiler) çalışır. Daha çok Boost::Signal’e benzemektedir.

 

Genel olarak nasıl çalışır?

Öncelikle sınıfınız içinde bir tane “sinyal” yaratırsınız ve yaratma sırasında bu sinyal tetiklendiğinde(emitting) hangi fonksiyonlar çalışacak onları belirlersiniz. Bu fonksiyonlar farklı sınıflardan oluşabilir. Farklı sınıflardan oluşabileceği gibi aynı sınıftan olsa dahi farklı objelerdeki bu fonksiyonları çağırmak isteyebilirsiniz. Bundan dolayı son aşama olarak sınıfınızın kurucusu içinde, oluşturduğunuz sinyaldeki “slot”fonksiyonlarının hangi objelerde çalışacağını belirtmeniz gerekmektedir.

 

Sinyali yarattık, fonksiyonu ya da fonksiyonları belirledik. Şimdi ne yapacağız?

Artık sınıfın içinde ya da dışında(sinyal “public” ise) istediğiniz yerde sinyalinizi tetikleyebilir, istediğiniz fonksiyonları aktif ya da pasif hale getirebilir, istediğiniz “slot” fonksiyonlarına ait bazı bilgileri alabilirsiniz. Ayrıca bir sinyalde birden çok “slot” fonksiyonunuz olsa dahi istediğiniz “slot”fonksiyonlarını tek tek de tetikleyebilirsiniz. Üstelik sinyalinizi tetiklediğinizde, eğer tek bir “slot” fonksiyonunu çağırıyorsanız o fonksiyonun geri dönüş değerini de tetikleme fonksiyonunun geri dönüş değeri olarak alabilirsiniz.

 

Geri dönüş değerini alabilirsiniz derken?

Örneğin sizin “slot” fonksiyonunuz “int” geri dönüşlü ve bu fonksiyonu bir tane sinyale bağladınız. Bu sinyali “emit” fonksiyonu (“emitAll” değil) ile çağırdığınızda bu fonksiyonun geri dönüş tipi ” int* ” yani “int pointer” olmaktadır. Bu pointer’ın gösterdiği yerdeki değeri aldığınızda(dereference) gerçek değere ulaşabilirsiniz.

 

Neden gerçek dönüş tipi değil de onun pointer’ı?

Çünkü fonksiyonunuz dönüş değeri “void” olabilir ya da belki o “slot” fonksiyonunu pasif hale getirdiniz yani daha özetle geriye bir şey döndürmemeniz lazım, ne yapacaksınız? Bu gibi bir durumda gerçek bir değer döndürmek sıkıntılı bir işlemdir o yüzden bahsedildiği gibi olan durumlarda “emit” fonksiyonu “NULL pointer” döndürmektedir.

 

Yalnızca sınıflarda mı çalışıyor?

Evet şu an için sadece sınıflarda ve onların üye fonksiyonları ile çalışıyor.

 

Birden çok sinyali iç içe kullanmak istiyorum. Mümkün müdür?

Evet. Sinyaller iç içe(nested) kullanılabilir. Mesela bir sinyali tetikleyerek çağırdığınız “slot” fonksiyonunun içinde başka bir sinyali tetikleyebilirsiniz.

 

Dezavantajları nelerdir?

Öncelikle yalnızca üye fonksiyonları ile çalışır, “thread-safe” değildir, derlenmiş kod boyutu büyük olabilir çünkü derleme zamanlı(compile-time) üretilen şeyler yoğunlukludur. Bunlara ek olarak “const” üye fonksiyonlar ile uyumlu değildir. Ayrıca derleme sırasında C++11’e göre derlenmelidir.

 

Lisans türü nedir?

Kütüphane LGPL lisansı altındadır.

 

Event sistemiyle bu sistemin arasındaki fark nedir?

Yaklaşık olarak şu linkte anlatıldığı gibidir.

 

Nasıl indirebilirim?

Kütüphanenin GitHub sayfasından ya da SourceForge sayfasından indirebilirsiniz.

 

Dokuman var mı?

Elbette ama İngilizce. Şu linkte bulabilirsiniz. (User Manual.pdf)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir