Iterator Design Pattern Nedir ?

Fatih İzgi
Kodcular
Published in
3 min readFeb 19, 2023

Design Patterns eğitim serisindeki ilk yazımızda, tasarım desenlerinin “Yazılımcıların sıklıkla karşılaştığı problemlere ve yazılımların doğasında bulunan genel ihtiyaçlara getirilen çözümler” olduğunu söylemiştik. Sık karşılaşılan problemlerden bir tanesi ise; koleksiyon yapılarında bulunan elemanlara erişim ihtiyacıdır. Bu yazımızda, bu problemi çözmek için kullanabileceğimiz Iterator Design Pattern yapısını inceleyeceğiz.

Konuya başlamadan önce problemin ne olduğunu biraz analiz edelim :

Performans, hız ve bellek tüketimi gibi temel ihtiyaçlar göz önüne alındığında programlarda kullanılan algoritmalar ve veri yapıları çeşitlilik göstermektedir. Bu sebeple oluşturulan nesneler dizi, liste, ağaç vb. farklı koleksiyon yapılarında tutulur. Bununla beraber, hangi veri yapısı kullanılırsa kullanılsın, tüm nesneler ihtiyaç durumunda erişilebilir ve kullanılabilir olmalıdırlar. Bu sebeple kullanılan koleksiyondaki tüm nesnelere erişebilecek bir yapının bulunması gerekir. Ayrıca, erişimi sağlayacak yapı, istemcilerin en az bilgi ile ilerleyebilmesine olanak tanımalıdır.

Not : Çoğu programlama dili bu hizmeti halihazırda sunmaktadır.

Iterator Design Pattern, koleksiyonlardaki elemanlar üzerinde gezinebilme ve dolayısıyla istenilen eleman, bilgi veya sonuca ulaşabilme amacı ile kullanılır. Ulaşma işlemini istemcinin en az detay ile yapabilmesini hedefler. Davranışsal(Behavioral) tasarım desenlerinden biridir ve kullanılması ile birlikte uygun veri yapısı ve algoritmaların program içerisinde etkin olarak kullanılabilmesi gibi avantajlar elde edilir.

Öncelikle problemimizi yazılıma aktarmak adına örnek bir yapı oluşturalım :

Student isimli bir sınıf tanımladık ve ileride oluşturacağımız öğrenci nesnelerini bir koleksiyon içerisinde saklayacağız. Bu koleksiyondaki öğrencilere erişebilmek için de Iterator isimli bir Interface oluşturduk. Listede erişilecek başka öğrenciler olup olmadığını kontrol eden hasNext() metodu ve eğer varsa bir sonraki öğrenci nesnesine erişim sağlayacak olan next() metodunu tanımladık.

Student nesnelerini tutan koleksiyon sınıflarını oluşturmaya başlayabiliriz :

Container isimli Interface’i implement eden koleksiyon alt sınıflarının bir adet Iterator’a sahip olması için getIterator() metodunu arayüzümüze ekledik. Student nesnelerini liste olarak ve array olarak sunan iki adet sınıf tasarladık. Bu sınıfların kendine ait farklı Iterator yapıları bulunmaktadır.

Artık koleksiyonların sahip olacağı Iterator yapılarını tasarıma ekleyebiliriz :

ListIterator ve ArrayIterator sınıfları koleksiyon üzerinde gezerek elemanlara erişimi sağlayacak olan sınıflardır. Iterator yapılarındaki metotların isimlerinin aynı olmasına rağmen uyguladıkları algoritmaların farklı olduğuna dikkat ediniz. İstemci tarafını inceleyecek olursak :

Output :

Öğrenci 1
Öğrenci 2
Öğrenci 3

Öğrenci 4
Öğrenci 5
Öğrenci 6

Görüldüğü üzere istemci, hem liste hem de array içerisinde tuttuğu Student nesnelerine Iterator yardımı ile erişebilmektedir. Elindeki veri yapısı ne olursa olsun kullandığı metot isimlerinin aynı olması ile aslına yaptığı işin içeriğinden ve detaylarından da uzak tutulmuş oldu.

Not 1: İstenilirse yapıya diğer koleksiyonlarda da kullanılabilecek Iterator yapıları da eklenebilir. Ayrıca kullanılan veri yapısına özel olduğunu belirtmek için metot isimlerinde farklılığa da gidilebilir.

Not 2: Iterator yapısı, yalnızca Student değil, herhangi bir nesne koleksiyonu üzerinde gezinebilecek şekilde de tasarlanabilir.

Not 3: Bir koleksiyon üzerinde birden fazla Iterator kullanımı da gerçekleştirilebilir. Bu sayede koleksiyon üzerindeki gezinme işlemlerinin amacı daha da genişletilebilir. Örneğin, listede aranan elemanın indexini tutma, listenin toplan büyüklüğünün belirlenmesi, listeyi geriye doğru gezme vb. işlemler gerçekleştirilebilir.

TÜM YAPI

Iterator Design Pattern konusunun ayrıntılarını ve inceliklerini öğrendiğimize göre tüm yapıyı incelemeye başlayabiliriz :

Output :

Öğrenci 1
Öğrenci 2
Öğrenci 3

Öğrenci 4
Öğrenci 5
Öğrenci 6

Yararlandığım kaynaklar :

1- DigitalOcean

2- GeeksforGeeks

--

--