Template Sınıf Yapısı ve Kullanım Alanları Kasım 2009 | Sayı : 8

Merhaba sevgili okurlar. Bu ay bana göre programlamanın en önemli yapıtaşlarından birine değineceğim; veri yapılarına. Program içerisinde kullandığımız verileri indekslemek, sıralamak ve veriler arasında arama yapmak gibi ihtiyaçlarımız vardır ya da verileri farklı hiyerarşik şekilde kaydetmek, birbirleriyle bağıntılı hale getirmek isteyebiliriz. Bu gibi durumlarda algoritma kurmayı kolaylaştıran, algoritmanın karmaşıklığını azaltan ve programımızı hızlandıran veri yapıları bize çok yardımcı olacaktır. Bir programın kalitesini arttıran en önemli faktörlerden ikisi okunabilirliği ve tekrar kullanılabilirliğidir. Veri yapılarına ve tasarım kalıplarına hakim olarak bu kaliteyi arttırabilirsiniz. Tasarım kalıpları konusuna başka bir yazımda değineceğim. Bu yazımda veri yapılarına ve uygulama alanlarına örnekler olacak. Bu veri yapılarını her program için ayrı ayrı yazmak yerine kendi kütüphanemizi oluşturabilir ya da hazır kütüphaneleri kullanabiliriz.  Veri yapılarını hazır kütüphaneler haline getirmek için template sınıflar kullanıyoruz. Template sınıflar, bizim veri yapılarımızı farklı değişken türlerinden bağımsız hale getirecek, bir sınıf ya da fonksiyonun her tür değişken için çalışabilmesini sağlayacaktır.

Veri yapılarına en basit örnek stack yani yığın olabilir. Stack’in mantığı önce giren verinin son çıkmasıdır. (LIFO)  Stack yapısı derleyicilerde başarılı bir şekilde kullanılmaktadır. Ayrıca bilgisayarımızın RAM’inin  bir kısmı işletim sistemi tarafından stack olarak kullanılır. Stack’in en basit implementasyonu şöyledir:


Bu programın çıktısı şöyle olacaktır:


Stack’in yapısını şu şekilde gösterebiliriz:

 

Bu stack sadece bir integer  (tamsayı) tutmak için dizayn edilmiş. Biz her değişken türü için ayrı stack yapısı kurmaya kalkarsak çok büyük bir kod çöplüğü oluşacaktır ve sınıf isimlerini hatırlamak bile zor olmaya başlayacaktır, ayrıca yeni türler eklendiğinde onun için stack yapısı oluşturulmalı. Stack, queue(kuyruk), vector (vektör)  gibi onlarca veri yapısı için ayrı ayrı kod yazmaya kalkarsak bu iş içinden çıkılmaz bir hal alacaktır. Bu noktada template sınıflar yardımımıza koşuyor. Bir veri türüne bağımlı kalmadan istenilen tüm değişken tipleri için ortak bir yapı kurabiliyoruz bu şekilde. Şimdi integer için ürettiğim stack’i bir template sınıf haline getiriyorum.


Artık bu sınıf sayesinde her tür veri tipi için stack’ler oluşturabilirim. Bu sınıfı bir *.h dosyası içine ya da dll içine koyup kullanılabilir, bir kütüphane haline getirebilirim. Aynı mantık ile kuyruk, ağaç ve benzeri veri yapıları için de template sınıflar üretip bundan sonra her proje ve tüm veri tipleri için bunları kullanabilirim. C++ , Java ve C# gibi dillerde bu kütüphaneler mevcuttur. Yani aslında ben, bu stack sınıfını yazmak yerine C++ standart kütüphanesini kullanabilirim. Bu hazır kütüphaneler birçoğumuzun yazabileceğinden daha hızlı çalışır (çok özel bir işlev gerekmiyorsa) ve tamamen dinamiktir. Bizim gözden kaçırdığımız bir memory leak ya da bu örnekte yaptığımız gibi boyutun önceden belirlenip sabit olması istenmeyen özelliklerdir. C++’ın stack kütüphanesi dinamik bir yapıya sahiptir ve neredeyse tüm ihtiyaçlarımızı karşılamaktadır. Bu kütüphanenin kullanımına örnek şöyledir:


C++ standart kütüphanesi sayesinde birçok veri yapısını hazır olarak kullanabiliriz. Bundan sonra size Java ve C# dillerinde en çok ihtiyaç duyulan template sınıflardan bahsedeceğim. İlk vereceğim örnek Java için Hashtable sınıfı. Bu sınıf sayesinde bire bir bağıntılar mantığında veri saklayabiliyoruz. Örnek olarak, her bir string için bir string kaydeden yapı.  Bu yapının C#’taki karşılığı Dictionary’dir.


Template sınıfların bir diğer özelliği ise veri tipi olarak yine bir template sınıf alabilmesidir. Örnek olarak bir ArrayList içine stack atalım. Yani bir stack listesi oluşturuyoruz.

 

Bir sonraki örneğim queue yani kuyruk için. Peki nedir kuyruk? Adından da anlaşılabileceği gibi kuyrukta ilk sıraya giren nesne ilk çıkar. Yani FIFO (First In First Out) mantığı vardır. Kuyruğun basit implementasyonu için stack’teki gibi boyut ve bir index değil, 2 index kullanmalıyız ki, kuyruğun hem başladığı hem de bittiği yeri bilelim. Bu implementasyonu yazmak yerine hazır bir kuyruk kütüphanesini kullanacağım. C# dilini kullanarak bir string kuyruğu oluşturuyorum ve birkaç veri ekleyip çıktısını alıyorum.


Gördüğünüz gibi kullandığım bu 3 dilde de mantık ve syntax aynı. Neredeyse aynı kod bir diğerinde çalışabilir  durumda. Çok küçük farklılıklar var aralarında. Bunları bu yapıları kullanarak görebilirsiniz. Bu sınıfların içerisinde diğer veri yapılarına dönüşüm yapan, boyutu dönen ve verileri kontrol etmenizi sağlayan birçok fonksiyon vardır. Bunlar çok işinize yarayacaktır.

Bu dillerin dinamik yapıyı nasıl sağladığını daha iyi anlatabilmek için kendimize özel  kuyruk yapıları oluşturacağız. İlk örneğimizi bağlı liste (linked list) kullanarak gerçekleştireceğiz. Bağlı liste mantığı çoğu veri yapısı için çok rahat kullanılabilir. Bağlı liste her bir nesnenin kendi cinsinden bir nesnenin adresini göstermesiyle oluşur. Bir ip şeklinde her nesne bir sonrakini işaret eder. Bağlı listeler de kolaylıkla aralara yeni nesneler ekleyebilir ya da aralardaki nesneleri silebiliriz. Yönetimi ve implementasyonu en kolay veri yapılarından birisidir. Aşağıda bağlı liste kullanarak bir kuyruk yapısı oluşturdum.

 

Bu örnekte bazı sorunlar var ama bağlı liste kullanımıyla ilgili bir fikir verebilir. Bağlı liste sayesinde dinamik yapıları kolaylıkla oluşturabiliriz. Bağlı listelerde bir nesne sadece bir nesneyi işaret eder. Eğer bu sayıyı arttırırsanız daha karmaşık olan ağaçlar ve graf yapılarını elde edersiniz. Graflar ağaçların biraz daha karmaşık halleridir. Ağaçlarda bir hiyerarşi var iken graflarda her şey karmaşıktır. Bu yazımda bu veri yapılarına örnek vermeyeceğim çünkü belirli bir ağaç ya da graf yoktur, bunların sınırsız farklı uygulaması olabilir.


 

  

Bunlara benzer kütüphaneler geliştirmek sizi dilin yetenekleri konusunda çok geliştirecektir. Özellikle C ya da C++ ile dinamik yapılar geliştirerek pointerlar ve hafıza yönetimi konusunda tecrübe kazanabilirsiniz. 

 Umarım sizin için faydalı bir yazı olmuştur. İyi okumalar ve yazmalar.

      Mustafa Burak AMASYALI
İ.Ü. Bilgisayar Mühendisliği 4. Sınıf
- Kasım 2009 -
Editörden... | H. Can ÇOBANOĞLU Bulutların Üzerinde İş Yapmak | Özlem Açıkel TURHAN Keying Tekniği | Cemre Fatih KARAKULAK Bu Gitarsa Diğerleri Başka Bir Şey | Erman TEPE En İyiye Hazır Mısınız? | Bekir Aytaç AĞMA RFID Etiketleri ve RFID Okuyucular | Muhammed Ali KOŞAN Hayaller Gerçek Olursa... | Ilgın UĞUR Template Sınıf Yapısı ve Kullanım Alanları | Mustafa Burak AMASYALI Microsoft’tan Web Geliştiricilerine Kolaylık | Burak KANMAZ Paylaşmak Güzeldir | Alper KAYA En Tehlikeli Yöntemler | Serkan AKDEMİR Yeşil Ulaşım | Muhammed CÜCE
« önceki sayfa - 7 - sonraki sayfa »

ana sayfa | arşiv | dergimiz | künye | iletişim | yazarlar için...
© 2009-2010 Bilisimdergi.Com Tasarım - Kodlama : İU BİLGİSAYAR

Creative Commons License
Bilişim Dergi içeriği  Creative Commons  lisansı ile korunmaktadır.
Kaynak göstermek ve link vermek şartıyla yazılarımızı kullanabilirsiniz.