Iterator design pattern, adı üzerinde bir data üzerinde iterasyon (yinelemek, ilerletmek) işleminin yapılmasını sağlayan bir design pattern'dir. Iterate türkçeye yineleme, tekrarlama gibi çevrilse de tam anlamıyla bu işi yapmamaktadır. Iterate denilince akla, liste veya ağaç gibi bir veri türünde birbirine bağlı veya sıralanmış nesneler üzerinde adım adım gezinilebilmesi gelmelidir. Örneğin şekil 1'de görüldüğü üzere en soldaki sıfırıncı index'te (indeks) bulunan veriden sonra sıradaki elemana direkt geçiş yapılması yani iterate edilmesi ile Iterator design pattern uygulanmış olur. Yaygın veri tiplerinden biri olan linked-list iterator pattern'i direkt olarak uygulayan bir veri yapısıdır.
Şekil 1. Birbirine bağlı düğümler.
Aşağıdaki gibi IIterator interface'i ile ConcreteIterator class'ında bulunması gereken temel HasNextve Next fonksiyonlarını implement edilmesi sağlanarak, Concrete class içerisinde gerekli implementasyonlar yapılmaktadır.
HasNext fonksiyonunda iterate edilebilmesi için bir sonraki adımda herhangi bir node bulunup bulunmadığının kontrolünü sağlamasının implementasyonu gerçekleştirilmiştir. Nextfonksiyonunda ise eğer bir sonraki adımda node bulunuyorsa iterate işlemini gerçekleştirip sıradaki node'daki değeri geri döndürmesinin implementasyonu yapılmıştır.
public interface IIterator
{
bool HasNext();
object Next();
}
public class ConcreteIterator : IIterator
{
private readonly List<object> _items;
private int _currentIndex = -1;
public ConcreteIterator(List<object> items)
{
_items = items;
}
public bool HasNext()
{
return _currentIndex + 1 < _items.Count;
}
public object Next()
{
if (!HasNext())
{
throw new InvalidOperationException("No more elements to iterate.");
}
_currentIndex++;
return _items[_currentIndex];
}
}Sırada, iterate edilmesi istenen bir Aggregate class'ının aşağıdaki IAggregate interface'ini implemente ederek Iterate işlemlerini desteklenmesini sağlayan ve bütün iteration implementasyonlarının bulunduğu ConcreteIteratorclass'ını döndüren CreateIteratorfonksiyonunun implementasyonu bulunmaktadır.
public interface IAggregate
{
IIterator CreateIterator();
}
public class ConcreteAggregate : IAggregate
{
private readonly List<object> _items = new List<object>();
public void AddItem(object item)
{
_items.Add(item);
}
public IIterator CreateIterator()
{
return new ConcreteIterator(_items);
}
}Böylece, ConcreteAggregate class'ı kendi içerisinde saklanan _items dizisinde iterasyon yapılabilir hale dönüşmektedir.
Ek olarak, List class'ı aslında iterator pattern'i destekleyen bir implementasyona sahiptir. Implemente ettiği IEnumerable interface'i ile IAggregate aynı implementasyonu sağlar ve yukarıdaki örneğe çok benzer bir implementasyon ile Enumerator struct'ını (Yukarıdaki örnekteki ConcreteIterator) döndürür ve iterasyon yapılabilir bir hale bürünür.
Kullanım örneği:
internal class Program
{
private static void Main(string[] args)
{
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.AddItem("Item 1");
aggregate.AddItem("Item 2");
aggregate.AddItem("Item 3");
IIterator iterator = aggregate.CreateIterator();
while (true)
{
try
{
object item = iterator.Next();
Console.WriteLine(item);
}
catch (InvalidOperationException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Iteration ended.");
break;
}
}
}
}Çıktı:
Item 1
Item 2
Item 3
No more elements to iterate.
Iteration ended.
Ücretsiz:
- https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/List.cs,cf7f4095e4de7646
- https://refactoring.guru/design-patterns/iterator
- https://www.geeksforgeeks.org/system-design/iterator-pattern/
- https://metintopcu1.medium.com/iterator-design-pattern-1d7a04685f9c
- https://medium.com/kodcular/iterator-design-pattern-nedir-aa2df9838145
Ücretli: