top of page

Framework Nedir? Framework Nasıl Oluşturulur?

Güncelleme tarihi: 13 Nis 2020





Yazılım alanında karşımıza oldukça sık çıkan bu kavramı burada kendi yorumumla anlatmaya ve bir örnekle pekiştirmeye çalışacağım.


Bence bir kavramı anlamak için öncelikle kavrama verilen ismi değerlendirmekle başlamalıyız. Framework tükçe de iskelet, yapı, çatı, çerçeve gibi anlamalara gelmektedir. Bence ismiyle uygun bir olguyu bize anlatmaktadır.


Anlamından ve yaptığı işten yola çıkarak bir altyapı malzemesi olarak, yazılımlarımızı oluştururken kullandığımız belirli kuralları içeren bize yol gösteren içerikler yorumunu yapabilirim.


İskelet, yapı gibi kelimelerden dolayı aslında kulağa daha çok mimari bir terimmiş gibi geliyor. Bir bakımdan da öyle. Mesela bir ev yapmaya karar verdik diyelim. Evi yapmadan önce hangi tarzda bir ev yapacağımızı düşünürüz. İşte bu aşamada Frameworkler işin içine girmekte. Zaten tarih boyunca çeşitli denemeler yapılarak tarzlar oluşturulmuştur ve bende bu tarzların kurallarına uyarak kendime özgü bir ev yapabilirim. Mesela ağaç ev yapacaksam ağaçların nasıl kesilmesi ve birleştirilmesi gerektiği bilgisinin bulunduğu bir Framework işimi kolaylaştıracaktır. Framework bana kılavuzluk yapsa bile yinede kullanacağım malzeme ve dekorasyon gibi özelleştirebileceğim kısımlardan dolayı yapacağım ev bana özgü olacaktır.


İşin özü Frameworkler kılavuz gibi davranıyorlar. Bir işi belirli kurallar uygulayarak çözerler fakat bu işi çözmek için kuralları uygulayacağı malzemeleri sizden alırlar. Mesela EntityFramework adındaki bir framework veritabanı işlemlerini çözmek için yazılmıştır. Veritabanına ekleme, silme gibi işlemleri yapabilir, fakat neyi ekleyeceği veya sileceği bilgisini sizden alır. Yani malzemeyi siz verirsiniz.


Bu bilgileri bir araya getirirsek Frameworklerin temel özellikleri bana göre şunlar olduğunu söyleyebilirim:

  • Kılavuz özellikleri vardır. Belirli kurallara göre yönlendirme yaparlar.

  • Gerektiğinde kılavuza yeni kurallar eklenebilir. Esnektirler.

  • Tek başlarına bir konuyu çözerler fakat çözecekleri konunun malzemelerini sizden alırlar.


Şimdide konuyu anlamak adına basit bir Framework yaparak pekiştirelim. Öncelikle bir probleme ihtiyacım var. Benim yapacağım örneğin problemi: Arduino cihazından verileri almak olacak. Bilmeyenler için Arduino prototipleme yapmak için kullanılabilen bir cihazdır. Serial port protokolü kullanılarak cihazın ürettiği veriler okunabilir.


Problem : Arduino cihazından verilerin okunması


Arduino cihazı serial port kullandığı için herhagi bir serial port kütüphanesi aslında bizim problemimizi çözecektir. Peki bir kütüphane bizim problemimizi çözüyorsa frameworke ne gerek var? İşte burada framework ve kütüphane arasındaki temel fark ortaya çıkmaktadır. Evet bir kütüphane ile Arduino dan gelen verileri okuma problemi çözülebilir. Fakat benim istediğim bütün cihazlardan gelen verileri okuyabileceğim bir yapı oluşturmak. İşte framework bize sadece Arduino değil karşımıza çıkabilecek her cihazdan veri almak için bir kılavuz olacak.


Frameworküm için üstün Paint bilgilerimi kullanarak biraz çizim yaptım ve kaba taslak olarak aşağıdaki resimdeki gibi bir yapı oluşturdum kafamda.

Kısaca açıklayacak olursam: Makineden veriyi alıyorum bir şekilde ve aldığım veriyi de bir şekilde sunucuya gönderiyorum. Yazı uzun olacağı için bu yazıda şimdilik Machine kısmını ve Data Receive kısmını oluşturmak ve göstermek istiyorum.


Öncelikle frameworküm için "Dakota" adında bir kod adı belirledim. Daha sonrada classlarımı oluşturmaya başladım. Frameworkler de abstractionlar sıklıkla kullanılır. Çünkü bu bir kılavuz yapı olarak kullanılacak, new diyerek direkt classlarımın kullanılmasını istemiyorum. Ayrıca bazı işlerimide bu class içerisinde halledeceğim. Bu yüzdende kullanacağım classların abstract classlarını oluşturmakla işe başlıyorum.


İlk önce machine abstract classımı oluşturutorum. Tabiki interface nimetlerinden yararlanabilmek içinde hemen bu classa bir interface bağladım. Burada interface yi abstract classa bağlamamın ana sebebi classımı soyutlamak. Çünkü her farklı cihazım için bu machine tipinden bir çok class üreteceğim ve bir yerde hepsi benim için sadece Machine. Bu yüzdende burada soyutlama(interface) çok önemliydi.


Classım ID, Name ve MovementList adında üç tane property den oluşuyor. Ben Machine de üretilen verilere Movement adını verdim. Her Machine 'nin birden fazla Movementi olabilir. Movement içinde bir abstract class yaptım. Tabiki hemen bir interface bağladım.


Bu class Name, ReceiverTag ve Value adında üç propertyden oluşmakta. Machine den okuduğum veriyi buradaki Value alanına yazacağım. Machine den hangi verinin buraya yazılacağını belirtmek için ReceiverTag alanını kullanıyorum.


Value alanına bağladığım bir event ile veri yazıldığında bu evente abone olarak istediğim şeyi bu event içerisinde yaptırabilmeyi sağladım. Test örneğinde daha iyi gözlemleyebilirsiniz.


Son olarak da veriyi okuyup machine deki uygun movement alanına yazacak DataReceiver abstract classının oluşturulması. Bu classın görevi farklı veri okuma tiplerine göre çeşitlenecek ve machine deki alana yazacak.


Arduino cihazım serial porttan veri alışverişi yaptığı için bu SerialPortReceiver classımı hemen AbstractReceiver classından miras alarak oluşturuyorum.

Frameworküm tamamlandı. Classlara genel bir bakış atarsak şu şekilde bir yapının oluştuğunu görebiliriz.


Şimdide bir örnekle bu frameworkü nasıl kullanacağımızı görelim. Aşağıdaki resimde şimdiye kadar oluşturduğum classları görmektesiniz. Bu kılavuz classları kullanarak şimdide Arduino dan veri alan Consol uygulamamı oluşturacağım.



Örnek uygulamayı yazmadan önce okuyacağım verileri Arduino dan hangi formatta gönderidiğime bakalım. Aşağıdaki resimde göreceğiniz gibi verilerim "-Uret" tagından sonra bir birim arttırarak göndermekteyim.



Benim bu verileri okuyarak ilgili Machine classının movement property sine yazmam gerekiyor. İlk olarak Movement classımı oluşturarak başlıyorum. Gördüğünüz gibi bu classı AbstractMovement tan miras aldım. Bu classı üretirken bu hareketin "-Uret" tagıyla geleceğini söylüyorum. Value propertysine bir event tanımlamıştım. Hemen data okunduğunda işlem yapmak için bir event tanımlayıp abone oluyorum.

Bir Movement oluşturduktan sonra Machine classımı oluşturup bu Movementle ilişkilendiriyorum. Cihazım Arduino olduğu için ArduinoMachine adında classımı AbstractMachine classımdan miras alarak oluşturuyor ve hemen movementimi ilişkilendiriyorum.


Machine classım hazır olduğuna göre artık verileri okuyabilirim. SerialPortReceiver classıma oluşturduğum Machine classımı vererek verileri okumaya başlıyorum.



Artık çeşitli cihazlardan veri okumayı bu Frameworkün kılavuzluğunda yazabilirim. Bir sonraki yazıda da alınan bu verileri sunucuya gönderme işlemlerini tamamlayacağım ve Asenkron çalışma yaklaşımını uyarlamaya çalışacağım. Bir bilgisayara birden fazla makine bağlı olabilir ve bu makinelerin birbiri ile bir ilişkisi olmadığı için Asenkron çalışma bu framework için olmazsa olmaz olacaktır.









74 görüntüleme0 yorum

İlgili Yazılar

Hepsini Gör

Comments


bottom of page