四畳半の秘密基地

さあ、今日はどんな実験をしよう

MENU

Kotlinとスプラトゥーンで学ぶデザインパターン【1. Iterator】

頭の中がごちゃごちゃ

最近自分の中で考えてることをごちゃ混ぜにしてアウトプットしたらタイトルのような結果になりました。
イカ、最近の自分の思考

  • 「サーモンランとか激アツ!これはローカルでできてほしい」
  • 「あかべこ本一通りやったけど次は何しよう」
  • スプラトゥーン2発売まで2ヶ月きった!」
  • WiiU売ってしまってスプラトゥーンできない。やりたいやりたいYoutubeで我慢」
  • 「KotlinがGoogle公式の言語に!これはプロダクト採用ワンチャンある。勉強しよう」
  • 「2はとりあえずチャージャーから入ってエイムリハビリしていこう」
  • アーキテクチャ意識して制約加えてコーディングするようになってから悩む時間が増えた」
  • 「制約の中でもスムーズにコーディングするためにはデザインパターン的な技が必要では?」
  • 「赤木も山王工業戦に備えてスピンムーブとか練習してたし、やはり新しい技(デザインパターン)を習得しよう」

ベースになっているのは結城浩さんのデザインパターン本です。
それをKotlinで書き直してみました。第一回目はIteratorパターンです。
ソースは
DesignPatternInKotlin/src/iterator at master · kseito/DesignPatternInKotlin · GitHub
にまとまっています。

Iteratorパターン

Iteratorパターンとは、何かの集合から要素を順番に取り出して処理していくものです。
今回は、スプラトゥーンのイカの画面を意識して作りました。

f:id:k-seito:20170603141846j:plain

バトルで使用する武器を選択する画面です。
武器(Wepon)があり、それがリスト化(WeponList)されそれが一覧表示(WeponIterator+println)されます。


Wepon.kt

data class Wepon(val name: String, val range: Int, val power: Int, val quickness: Int)

WeponList.kt

class WeponList(count: Int): Aggreagte {

    override fun iterator(): Iterator {
        return WeponIterator(this)
    }

    private var wepons: Array<Wepon?> = arrayOfNulls(count)
    private var count: Int = 0

    fun add(wepon: Wepon) {
        wepons[count] = wepon
        count++
    }

    fun getWeponAt(index: Int): Wepon? {
        return wepons[index]
    }

    fun getCount(): Int {
        return count
    }
}

WeponIterator.kt

class WeponIterator(private val weponList: WeponList) : Iterator {

    private var index: Int = 0

    override fun next(): Any {
        val wepon: Wepon? = weponList.getWeponAt(index)
        index++
        return wepon ?: Wepon("未開放", 0, 0, 0)
    }

    override fun hasNext(): Boolean {
        return weponList.getCount() > index
    }

}

デザインパターンとして作成するクラスはここまで(Interfaceは省略します)
あとは動かすだけ。

Main.kt

fun main(args: Array<String>) {
    val list: WeponList = WeponList(5)
    list.add(Wepon("わかばシューター", 32, 32, 75))
    list.add(Wepon("スプラシューターコラボ", 50, 45, 55))
    list.add(Wepon(".96ガロンデコ", 68, 85, 15))
    list.add(Wepon("カーボンローラー", 20, 65, 70))
    list.add(Wepon("ダイナモローラー", 72, 30, 20))

    val weponSelect: Iterator = list.iterator()
    while (weponSelect.hasNext()) {
        val wepon: Wepon = weponSelect.next() as Wepon
        System.out.println("武器名:" + wepon.name + "、射程:" + wepon.range + "、攻撃力:" + wepon.power +
                "、連射力:" + wepon.quickness)
    }
}

出力結果は

武器名:わかばシューター、射程:32、攻撃力:32、連射力:75
武器名:スプラシューターコラボ、射程:50、攻撃力:45、連射力:55
武器名:.96ガロンデコ、射程:68、攻撃力:85、連射力:15
武器名:カーボンローラー、射程:20、攻撃力:65、連射力:70
武器名:ダイナモローラー、射程:72、攻撃力:30、連射力:20

となります。

Kotlinを使ってみて

今回実装したときにArrayの初期化ではまりました。指定した数の要素を確保するためにarrayOfNullsを使用しましたが、
要素がNullableになってしまい何とかNotNullな要素にしたい!と思いいろいろ考えてみましたがだめでした。。。
このへんはまだまだKotlin力が足りないと思うので精進します。


デザパタ本見たら全部で23種類デザインパターンがあった・・・全てスプラトゥーンネタにできるかわかりませんが完走目指して頑張ります。