csharp Posts

Sen de kimsin “YIELD”?

whoareyou

Bir zamanlar yakışıklı ama insanı yoran IteratorPattern (Başka bir yazının konusu) adında bir yapı yaşarmış. Ta ki .Net 2.0 ile birlikte gelen “yield” keywordu’ne kadar. yield büyük bir hızla bu yapıyı unutturup kendi hükümdarlığını kurdu.

Peki bu yield adındaki arkadaş ne iş yapar?

Kabaca; çalışma yapısı ??kullanıcıya?? gösterilmek istenmeyen, sıralı nesnelerin (dizi) akışının beslenmesini sağlar. Biliyorum çok anlaşılır olmadı ama bir örnek ile anlatırsam daha anlaşılır olacak.

Varsayalım; sizden bir klasör ve onun alt klasörü içinde bulunan bütün dosyaların listeleyecek bir method yazmanız istendi. Ama bu methodun bir özel durumu var; bütün listeyi tek seferde almak istemiyor. Çünkü her dosya ile yapacağı işlem uzun ve bu süre zarfında hafızada o kadar veriyi tutmak istemiyor.

Eskiden olsa IteratorPattern ile bu işi hallederdik ama onu yazmak başlı başına bir sıkıntı zaten. Sağolsun yield bizi bu dertten kurtarıyor. Nasıl derseniz, aşağıdaki kodu beraber inceleyelim.

İlk aşamada, belirtilen klasordeki dosyaların listesi  alınır ve liste içerisinde bulunan dosya isimleri yield yardımı ile teker teker bu bilgiyi kullanacak kaynağa iletilir. yield return satırı her iletim anında bekleme durumuna geçer, ta ki sıradaki eleman okunmak istenene kadar kodumuz bu satır üzerinde bekler. Okuma istediği geldiği zaman, bir sonraki yield return e kadar çalışır ve yeni okuma talebini bekler.

İkinci aşamada, klasör içerindeki klasorlerin listesi alınır ve her klasor için, methodumuz tekrar çağırılır. (Bu işleme recursion denir ki bu da başka bir makale konusu)

YIELD arkadaşımızın tanıtımı bu kadar. Umarım sizde kendisini benim onu sevdiğim kadar sevmişsinizdir. 🙂

 

NOT: Eğer .Net Framework 4.0 yada daha üst bir sürüm ile uygulama geliştiriyorsanız yukarıdaki kodu kullanmak yerine Directory.EnumerateFiles methodunu kullanmanızı tavsiye ederim.

 

NOT2:  Önünüzde bir problem olduğu zaman (örneğimizde kısıtlı ram kullanımı ile büyük verinin aktarımı problemini çözdük) öncelikle kullandığınız dilin kendi standart kütüphanesinde probleminizin çözümü var mı diye araştırın. Eğer varsa Amerika’yı yeniden keşfetmek yerine hazır çözümü kullanın.