Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

【経緯】

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
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away