![]() | |
Güvenli Koleksiyon Yazmak | 29.06.2008 22:46:00 |
| Kategori : Visual C# .NET Özet : Makalemiz boyunca oluşturduğumuz bir tip üzerinde işlemler yapıcağız ve bu tipimizi bir koleksiyona alacağız . Aslında Generic hayatımıza girdiği zaman bu şekilde uygulamalar yavaş yavaş kullanılmamaya başlanmıştır. Ama biz generic koleksiyonlara makalemizin sonunda yer vericeğiz .Generic olmadığını düşünün nasıl yapardık . | |
Güvenli Koleksiyon Yazmak
Makalemiz boyunca oluşturduğumuz bir tip üzerinde işlemler yapıcağız ve bu tipimizi bir koleksiyona alacağız . Aldığımız bu koleksiyon sadece bizim tipimizden veya tipimizden kalıt ılmıs tipleri barındırabilsin ile güvenli olarak saklayacağız. Aslında Generic hayatımıza girdiği zaman bu şekilde uygulamalar yavaş yavaş kullanılmamaya başlanmıştır. Ama biz generic koleksiyonlara makalemizin sonunda yer vericeğiz . Generic olmadığını düşünün nasıl yapardık … Bu şekilde generic mantığının bize sunduğu avantajlarıda biraz öğrenmiş olacağız
. Simdi Urun tipini oluşturalım bu urun tipimizin içerisinde adi fiyati serinumarasi seklinde bilgiler ve tostring ezilmiş bir bilgi ver metodumuz olsun.
namespace OrnekKod class Urun string _adi; public string Adi { get { return this._adi; } set { this._adi = value; } } public Urun(string ad, double fiyat , double serino) this.Adi = ad; }
} }
Simdi Dvd sınıfımızı yazalım ve urun sınıfından kalıtalım
. elimizde gireceğimiz iki farkı tip olsun . Urun ve Dvd
adında. Dvd tipimizi aşağıdaki gibi tanımladık. namespace OrnekKod class Dvd : Urun int _kapasitesi; public int Kapasitesi { get { return this._kapasitesi;} set { this._kapasitesi
= value; } } { this.Kapasitesi = kapasite; } public override string ToString() return base.ToString() + " \n Kapasitesi " + Kapasitesi; } Yukarıdaki şekilde dvd sınıfımızı urun tipinden kalıtarak tanımladık ve ek olarak kapasite değerini aldık . kalıtım aşamasında yani dvd yapıcı metodunda kapasitesi haricindeki bilgileri iki farklı şekilde yazabiliriz . istersek yukarda bizim kullandığımız gibi base(base class parametreleri ) seklinde yapıcı metodumuz ile birlikte kullanabilir. veya yapıcı metodumuzun gövdesinde base.adi = adi ; seklinde tanımlayabiliriz . base anahtar sözcüğü bir alt sınıf da olan yani bu sınıfa kalıtılan anlamına gelmektedir . this anahtar söz dizimi de bu tip ( class ) için geçerli olan anlamındadır. Bu asamaya kadar iki adet tip üretip urun ve dvd adında dvd tipimizi urun tipimizden kalıttık simdi bunları bir koleksiyona (ArrayList) bağlayalım . Örneğimizde ArrayList i kullanmak için aldık dediğimiz gibi belki arraylist artık kullanılmıyor ama gelişen yeni teknolojileri daha iyi takip edebilmek için o teknolojinin tarihini bilmemiz gerekir . Ado.net ogrenmeden Linq geçersek belki kod yazarız ama geliştirme ve mantığı acısından herhangi bir problemde ana çalışma mantığını bilmediğimiz için çoğu yerde takılırız. Simdi Guvenlikoleksiyon sınıfımızı yazmadan önce genel bir mantığına bakalım
nasıl olmalı Arraylist koleksiyonumuz içerisine object tipinden herse yi alabiliyor
ve biz buna nasıl bir kontrol getirmeliyiz ki koleksiyonumuz içerisinde sadece
urun tipi veya urun tipinden kalıtılmıs tiplerimiz olsun . Sorumuzun generic olmadan çözümü ebetteki bu şekilde olacaktır. Koleksiyonumuzu private olarak oluşturup dış dünyaya kontrollü bir şekilde acıcağız . simdi isterseniz güvenli koleksiyon sınıfımızı tanımlayalım . class GuvenlyList : IEnumerable
İlk tanımlamamızda normal parametre almayan bir ctor tanımlıyoruz ve içerden arraylist imizim normal bir şekilde oluşturuyoruz. public GuvenlyList() Yukarıdaki tanımlama örneklenir ise arraylist imiz default değerleri ile örneklenmiş olacaktır. Peki örnekleme zamanında oluşturacağımız listemizin ilk kapasitesini biz belirlemek istiyoruz yapmamız gereken tek şey default ctor aşırı yüklenip int tipinden bir kapasite değeri almak yeterli olacaktır. public GuvenlyList(int kapasite) Seklinde bir tanımlama ile int tipinden bir deger aldık ve bu degeri arraylist imizin (kapasite) olarak belirledik ve ilk başlangıç aşamasındaki değerini belirledik . Buraya kadar güvenli tipimizi oluşturduk ama içine herhangi bir değer almadık. simdi bir metot yazalım ve ana amacımız olan urun ve urunden kalıtılan değerleri alacak bir metot yazalım. public void UrunEkle(Urun Urunal) Tanımladığımız metot parametre olarak Urun tipinde urunal istemektedir . arraylist imizi dış dünyaya kontrollü açtığımız için bizim belirlediğimiz değerler arraylistimize tanımlanacaktır . Artık UrunEkle metodu sayesinde içerde tanımladığımız arraylist imize sadece urun ve urunden kalıtılmıs sınıfları barındırır . Ama unutulmaması gereken bir nokta biz burada sadece dışardan gelen değerleri filtreledik arraylist bunları kendi içinde yine object tipinden tutar ve boxing unboxing işlemleri ile bize tekrar geri verir. Bizim amacımız dış tarardan müdahaleyi kontrol altına almak adına idi … Örnek kodlarımız arasında Arraylist in bazı metotlarında yukarıdaki gibi dış dünyaya açılmıştır. Kısaca belirtmek gerekir ise. Urun Cıkart İşlemleri de bizim tanımladığımız public metotlar ile dış dünyaya kontrollü bir şekilde açılmıştır. Buraya kadar her şey çok normal bir şekilde oldu listemizi oluşturduk ekledik çıkarttık ve diğer parametrelerini isleme tabii tuttuk. Peki bunları ekrana yazdıralım for ve foreach iterasyonlarını kullanarak ? Kendi yazdığımız bir tip içerisinde for ve foreach iterasyonlarını
kullanmak için bize neler gerekli . public static void ListeleFor(GuvenlyList ListAl) { ListAl.KapasiteCountEsitle(); Console.WriteLine(ListAl[i].ToString()); } İnt[] sayilarim = new int [3]; seklinde bir dizi belirlediğimiz zaman public object this[int sayac] Yukarıdaki şekilde indexer belirlemiş olduk int sayaç bizim for döngümüzde i değerine sayı verecektir. get blokları içerisindeki tanımlamaya bakar isek return this.UrunListesi[sayac] yani inci değeri anlamında bize geri dondurur . Bu tanımlamayı güvenli list class imiz içerisinde oluşturur isek artık güvenli list imiz içerisinde for döngüsü ile dönebiliriz. Simdi IEnumerable interface imizi tipimize implement edelim ve bu interface in içerisindeki GetEnumerator metodunu kullanalım aşağıdaki gibi . public IEnumerator GetEnumerator() Tek yapmamız gereken return UrunListesi.GetEnumerator(); kısmını tanımlamak olacaktır . Simdi foreach iterasyonunu kullanarak da tipimiz içerisinde dönebiliriz. Yukarıdaki tanımlamada generic öncesinde güvenli tiplerimizi nasıl tanımladığımızı anlattık ama artık hayatımızda generic var ve sadece List<T> seklinde güvenli tiplerimizi belirleyebiliyoruz
. Benim şahsi olan düşüncem ilk önce mantığını anlamak daha sonra günün teknolojisi
neyi gerektiriyor ise onu kullanmaktan yanadır. Seklinde bir tanımlama yaptığımız zaman bizden direk olarak urun tipinden item istemektedir . Generic koleksiyonlar ile artık makale boyunca yazdığımız şekilde bir tanımlama kullanılmaz. List generic ler ebetteki normal bizim tanımladığımız güvenli koleksiyonlardan daha kullanışlı ve daha hızlıdır . object tipinden al daha sonra unboxing yap gibi uğrası bize yaptırmaz kendi içinde generic olarak bizim tanımladığımız tip de tutar ve hiç bizi yormadan bilgiyi geri verir .
| |
Yazgelistir.com | |