C# Iterator Pattern Kullanımı - OOP Design Pattern

Iterator (tekrarlayıcı) tasarım deseni, behavior grubununa ait, nesne koleksyonlarının (list,array,queue) elemanlarını belirlenen kurallara göre elde edilmesini düzenleyen tasarım desenidir. dofactory.com a göre hemen hemen bütün uygulamalarda kullanılmaktadır.

Iterator (tekrarlayıcı) tasarım deseni, behavior grubununa ait, nesne koleksyonlarının (list,array,queue) elemanlarını belirlenen kurallara göre elde edilmesini düzenleyen tasarım desenidir. dofactory.com a göre hemen hemen bütün uygulamalarda kullanılmaktadır.



Koleksiyonlar nesne tabanlı dillerde sıkça kullandığımız yapıların başında geliyor. Iterator tasarım deseni koleksiyonunun array, queue, list olduğunun bilinmesine ihtiyaç duyumadan koleksiyon elemanları üzerinde işlem yapılabilmesini sağlar. Koleksiyon içerisindeki nesneleri örneğin foreach ile dönersek sırasıyla işleriz fakat öyle bir ihtiyacımız var ki nesneleri 3’er 3’er dönmemiz gerekiyor. Bunu iterator tasarım kalıbıyla gerçekleştirebiliriz.

Aynı zamanda kendi itaratorlerimizi yazabiliriz bu kalıpla. Örneğin bir tarih aralığı verildi bize biz bu tarih aralığındaki çalışma günlerini bulucaz. Bunu mesela for veya foreach ile yapamayız ama iterator tasarım kalıbını kullanarak günler üzerinde gezebiliriz.

Aggregate sınıfları koleksiyon barındıran ve bu koleksiyon ile iterator sınıfını oluşturan sınıflardı. Iterator sınıfları ise ileri geri gitme gibi işlemlerin yapıldığı sınıflardır.

Bu örneği şimdi koda dökelim:

UML Şeması:



Kod:

    /// <summary>
    /// Iterator Interface
    /// </summary>
    public interface IAbstractIterator
    {
        bool Next();
    }
/// <summary>
    /// Haftasonlarını itere edicek şekilde tasarlanmış iterator sınıfımız
    /// </summary>
    public class FreeWeekDayIterator: IAbstractIterator
    {
        protected DateTimeAggregate DateRange;
        protected DateTime Cursor;

        public FreeWeekDayIterator(DateTimeAggregate dateRange)
        {
            DateRange = dateRange;
            Cursor = DateRange.DateBegin;
        }

        public bool Next()
        {
            if (Cursor.DayOfWeek == DayOfWeek.Saturday 
                          || Cursor.DayOfWeek == DayOfWeek.Sunday)
            {
                int daysToAdd = 
                   Cursor.DayOfWeek == DayOfWeek.Saturday ? 1 : 6;
                Cursor = Cursor.AddDays(daysToAdd);
                if (Cursor < DateRange.DateEnd)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                int dayid = (int)Cursor.DayOfWeek;
                int daysToWeekend = 6 - dayid;
                Cursor = Cursor.AddDays(daysToWeekend);
                return true;
            }
        }

        public DateTime Current
        {
            get { return Cursor; }
        }
    }

    /// <summary>
    /// Iterator yaratacak olan Aggregate interface
    /// </summary>
    public interface IDateTimeAggregate
    {
        FreeWeekDayIterator CreateIterator
                   (DateTime dateBegin, DateTime dateEnd);
    }

    /// <summary>
    /// Koleksiyon barındıran ve bu koleksiyon ile iterator 
    /// sınıfını oluşturan Aggregate sınıfı
    /// </summary>
    public class DateTimeAggregate : IDateTimeAggregate
    {
        public DateTime DateBegin;
        public DateTime DateEnd;

        public FreeWeekDayIterator CreateIterator
                (DateTime dateBegin, DateTime dateEnd)
        {
            DateBegin = dateBegin;
            DateEnd = dateEnd;

            return new FreeWeekDayIterator(this);
        }
    }
Çıktı:



0 yorum :

Yorum Gönder