Kotlin’de Iterator Pattern

Iterator Pattern, yaygın şekilde kullanılan bir Design Pattern modelidir. Programcılık ile ilgilenen hemen herkes mutlaka diziler veya koleksiyonlar ile çalışmıştır. Bu yapılar, içinde bulunan verilere erişim sağlamak için özel mekanizmalar ile hazır bir şekilde bizlere sunulur. Ancak bazı durumlarda bunlar bize yeterli gelmez ve kendimiz için özel olarak tasarladığımız koleksiyonlarda veriler arasında rahatlıkla dolaşmak isteriz. Iterator Pattern modelini kullanarak hazırladığınız bir koleksiyonda veriler arasında gezinmeyi daha pratik bir hale getirebilirsiniz. Bunu bir defa yazdıktan sonra arkaplanda neler olduğuna bakmamıza gerek kalmayacaktır.

Öncelikle Iterator Pattern modeli için sahip olmamız gereken class ve interface bileşenlerini burada tek tek verelim. Daha sonra aralarındaki ilişkiyi UML diyagramında gösterelim.

Iterator


interface Iterator {
    fun hasNext(): Boolean
    fun next(): String?
}

Container


interface Container {
    fun getIterator():Iterator
}

Yukarıdaki iki dosya şu an için herhangi bir işlem yapmıyor. Çünkü her biri interface olarak tasarlanmıştır.

AllData.kt

var languages = ArrayList<String>()

class AllData : Container {
    override fun getIterator(): Iterator {
        fillList()
        return Languages()
    }

    private fun fillList() {
        languages.add("Kotlin")
        languages.add("Java")
        languages.add("JavaScript")
        languages.add("Python")
    }

    class Languages : Iterator {
        var index = 0
        override fun hasNext(): Boolean {
            if (index < languages!!.size) {
                return true
            }
            return false
        }

        override fun next(): String? {
            if (this.hasNext()) {
                return languages!!.get(index++)
            }
            return null
        }

    }
}

Asıl işlemlerin yapıldığı bölüm aslında yukarıdaki class’tır. Bu sınıfta bulunan yapılar ve görevleri şöyledir:

getIteratot(): Bu metot, fillList() metodunu çağırarak languages koleksiyon yapısının veriyle doldurmayı sağlar. Ayrıca return ile Iterator arayüzü için bir object yani nesne döndürmeyi sağlar.

Languages Class : Bu sınıfa Iterator arayüzü implement edildiği için arayüzdeki tüm metot ve parametrelerin buraya uygulanması gerekir. Iterator arayüzünden gelen iki metot var: hasNext() ve next().

hasNext() metodu index değerinin, koleksiyondaki eleman sayısından küçük olup olmadığını kontrol etmeyi sağlar. Eğer index eleman sayısından küçük ise return ile true değeri döndürülür. Bu koleksiyonda hala veri olduğu anlamına gelir.

next() metodu ise hasNext() metodundan return edilen boolean değere göre index bilgisi verilen koleksiyon verisini return etmeyi sağlar.

Şimdi ana programda bu modeli kullanarak yukarıda sahip olduğumuz koleksiyondaki verileri ekrana tek tek yazalım.

Home.kt

fun main() {
    val iterator=AllData().getIterator()

    while (iterator.hasNext()){
        println(iterator.next())
    }
}

Uygulamanın ekran çıktısı aşağıdaki gibi olur.

Iterator Pattern için UML diyagramı aşağıdaki gibidir.

Uygulamanın kaynak kodu için tıklayınız.