LoginSignup
6
6

More than 5 years have passed since last update.

『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる(Iterator編)

Posted at

【経緯】

PGを初めて数年。
土方プログラマーとしてやりたいことを実装する能力はそれなりに身についてきた(ような気がする)。
が、しかし土方故に「最低限動く」ものは作れても、それが「理論的に正しいのか」、「クラス設計観点でどうなのか」といった観点で物を作れない問題にぶち当たりました。
そこでクラス設計を勉強するにあたり、増補改訂版Java言語で学ぶデザインパターン入門を購入して一旦デザインパターンをちゃんと勉強しようという試みを行っています。
が、Java自体も何度か触っているので、書こうと思えばあんまり悩まずにプログラムを書けてしまってあんまり身につかない・・・。
あとJava自体があまり好きではないので続く気がしない・・・どうしたものか。
そういえばAndroidってKotlin使えるよなーそっちの方が興味あるんだよなー・・・。

【よし、Kotlinでやろう】

どうせなら興味がありつつも手が出せないでいたKotlinベースで自分で書いてみようと思いたちました。(意味があるかはわからない)
swiftにも似たところがありそうなので、そういう意味でもKotlinに手を出してみます。心が折れたらJavaでやります。

【というわけで、コード】

まずはIteratorです。
Iteratorは集合体の要素を統一した方法で繰り返し1つ1つ数え上げていくデザインパターン。
for文等でリストなどのコレクションの要素にアクセスする場合や、集合の要素に順番にアクセスする必要がある場合などに有効。
期待動作はしてるので問題無く変換出来ている・・・はず?

Iterator.kt
interface Iterator {
    fun hasNext() : Boolean
    fun next() : Any
}
Aggregate.kt
interface Aggregate {
    abstract fun iterator() : Iterator
}
Book.kt
class Book(title:String) {
    private var name: String = title

    fun getName(): String {
        return this.name
    }
}
BookShelf.kt
class BookShelf() : Aggregate  {
    private var books = ArrayList<Book>();
    fun getBookAt(index:Int): Book {
        return books.get(index)
    }

    fun appendBook(book: Book) {
        this.books.add(book)
    }

    fun getLength(): Int {
        return this.books.size
    }

    override fun iterator() :Iterator {
        return BookShelfIterator(this)
    }
}
BookShelfIterator.kt
class BookShelfIterator(bookShelf: BookShelf) : Iterator {
    private var bookShelf:BookShelf = bookShelf
    private var index:Int = 0

    override fun hasNext(): Boolean {
        if (this.index < bookShelf.getLength()) {
            return true
        } else {
            return false
        }
    }

    override fun next(): Any {
        var book:Book = bookShelf.getBookAt(index)
        index++
        return book
    }
}
MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var bookShelf:BookShelf = BookShelf()
        bookShelf.appendBook(Book("Around the World is 80 Days."))
        bookShelf.appendBook(Book("Bible"))
        bookShelf.appendBook(Book("Cinderella"))
        bookShelf.appendBook(Book("Daddy-Long-Lengs"))
        bookShelf.appendBook(Book("Little-Red-Riding-Hood"))

        var it:Iterator = bookShelf.iterator()
        while (it.hasNext()) {
            var book:Book = it.next() as Book
            Log.d("BookName", book.getName())
        }
    }
}
出力結果
Around the World is 80 Days.
Bible
Cinderella
Daddy-Long-Lengs
Little-Red-Riding-Hood
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6