Iterator(Design Pattern)

Metin Topcu
4 min readMar 23, 2023

--

Iterator, bir koleksiyonun öğelerini tiplerinden bağımsız (list, stack, tree vb.) tarayarak tekrarlı bir işlem yapmak istediğiniz durumlarda kullandığımız behavioral tasarım modelidir(design pattern).

Kullanacağım içerikler ağırlıklı olarak refactoring.guru ve evrenbal.com sitesinden alınmıştır.

Örnek Problem

Koleksiyonlar, programlamada en çok kullanılan veri türlerinden biridir. Bununla birlikte, koleksiyon yalnızca bir grup nesne için bir kapsayıcıdır.

Çeşitli Koleksiyon Tipleri

Çoğu koleksiyon elemanlarını basit bir listede tutar. Fakat bazıları yığın, ağaç, graph veya başka kompleks yapılarda olabilir.

Koleksiyonun yapısı ne olursa olsun, elemanlarının başka kodlar tarafından erişilir olması için yöntemler sağlamalıdır. Tekrar tekrar aynı elemanlarla karşılaşmadan bütün elemanların üzerinden geçmek için bir yöntem olmalıdır.

Eğer liste bazlı bir koleksiyonla uğraşıyorsanız bu basit bir işlem gibi görünebilir. Baştan başlayarak sona doğru bütün elemanlar üzerinden basitçe geçebilirsiniz. Peki ya ağaç gibi daha kompleks bir yapı ile çalışıyorsanız? Bir gün dikey bir dolaşım tercih ederken, ertesi gün yatay bir dolaşım yapma ihtiyacınız olabilir. Aradan bir hafta geçince de tüm öğeler üzerinden rasgele seçim yöntemi ile geçmek isteyebilirsiniz.

Aynı koleksiyonda farklı şekillerde dolaşılabilir

Koleksiyona daha da farklı dolaşım algoritmaları eklemek, zamanla birincil görevi olan verimli veri depolamayı arka planda bırakacaktır. Ek olarak bazı algoritmalar sadece belirli uygulamalara özel olabilir ve bunları genel bir koleksiyona eklemek tuhaf olacaktır.

Öte yandan istemci kodu çalıştığı çeşitli koleksiyonların elemanları nasıl sakladığı ile de ilgilenmek zorunda değildir. Koleksiyonlar elemanlara erişmek için farklı yollar sağladığından ana kodunuzu bu sınıflara bağımlı hale getirmiş olursunuz.

Çözüm

Iterator deseninin ana fikri bir koleksiyonun dolaşımla ilgili davranışlarını alıp iterator denen ayrı bir objeye yüklemektir.

Iteratorler çeşitli dolaşım algoritmaları sağlarlar. Birden fazla iterator nesnesi aynı koleksiyon üzerinde aynı anda dolaşım yapabilir.

Iterator nesneyi algoritmayı sağlamanın yanı sıra mevcut pozisyon, kalan eleman sayısı vb. dolaşımla ilgili tüm detayları da saklar. Bu nedenle birden fazla iterator, aynı koleksiyon üzerinde ve aynı anda birbirinden bağımsız olarak dolaşım sağlayabilir.

Iteratörler genel olarak bir koleksiyondan elemanları almak için tek bir ana metot sağlarlar. İstemci artık hiç bir sonuç dönmeyene, yani eleman listesinin sonuna gelene kadar bu metodu çağırır.

Tüm iteratorler aynı arayüzden türemek zorundadır. Bu gerekli iteratör oldukça istemci kodun herhangi bir koleksiyon ya da algoritma ile dolaşım yapabilmesini sağlar. Bir koleksiyonda dolaşmak için özel bir yönteme ihtiyacınız varsa sadece gerekli iterator snıfını oluşturur ve istemci kodu ya da koleksiyonu değiştirmeden bu ihtiyacı karşılayabilirsiniz.

Gerçek Dünya Örneği

Birkaç günlüğüne Roma’yı ziyaret etmeyi ve tüm önemli turistik yerleri ve cazibe merkezlerini ziyaret etmeyi planlıyorsunuz. Ancak oraya vardığınızda, Colosseum u bile bulamayarak daireler çizerek çok zaman kaybedebilirsiniz.

Öte yandan, akıllı telefonunuz için bir sanal rehber uygulaması satın alabilir ve onu navigasyon için kullanabilirsiniz. Akıllı ve ucuzdur ve bazı ilginç yerlerde istediğiniz kadar kalabilirsiniz.

Üçüncü bir alternatif ise gezi bütçesinin bir kısmını harcayarak şehri avucunun içi gibi bilen yerel bir rehber tutmanızdır. Rehber, turu beğenilerinize göre düzenleyebilir, size her cazibe merkezini gösterebilir ve birçok heyecan verici hikaye anlatabilir. Bu daha da eğlenceli olacak; ama ne yazık ki daha pahalı.

Tüm bu seçenekler kafanızda doğan rastgele yönler, akıllı telefon gezgini veya insan kılavuzu Roma’da bulunan geniş manzara ve ilgi çekici yerler koleksiyonu üzerinde yineleyiciler olarak işlev görür.

Uygulanabilirlik

Koleksiyonunuzun kompleks bir yapısı varsa fakat bunu istemci koda yansıtmak istemiyorsanız iterator desenini kullanabilirsiniz.

Iterator, kompleks bir veri yapısı ile çalışmak için gereken detayları kapsamına alarak istemci koda koleksiyondaki elemanlara ulaşmaları için basit metotlar sağlar. Bu yaklaşım istemci için rahatlık sağlarken aynı zamanda koleksiyonu istenmeyen veya hatalı kullanımlara karşı da korumuş olur.

Uygulamanızdaki dolaşım kodlarının kopyala/yapıştır gereksinimi ortadan kaldırmak için bu deseni kullanabilirsiniz.

Koleksiyon içinde dolaşım kodları genelde şişkin olurlar ve uygulamanın işlev mantığı içine yerleştirildiğinde kodu birincil görevinden uzaklaştırıp yönetimini daha zor hale getirirler. Dolaşımla ilgili kodları iteratorler içerisine almak kodu daha yalın ve temiz hale getirir.

Kodunuzun farklı veri yapılarında dolaşım yapması, veya veri yapısının belirsiz olduğu durumlarda iterator desenini kullanabilirsiniz.

Desen koleksiyonlar ve iteratorler için bazı genel arayüzler sağlar. Kodunuz bu arayüzleri kullanıyorsa, bu arayüzlerden türemiş koleksiyonlar ve iteratorler ile rahatlıkla çalışabilir.

Diğer Tasarım Kalıpları İçin Linkler

Factory/Method

Singleton

Observer

--

--

Metin Topcu
Metin Topcu

No responses yet