Kotlinとスプラトゥーンで学ぶデザインパターン【1. Iterator】
頭の中がごちゃごちゃ
最近自分の中で考えてることをごちゃ混ぜにしてアウトプットしたらタイトルのような結果になりました。
イカ、最近の自分の思考
- 「サーモンランとか激アツ!これはローカルでできてほしい」
- 「あかべこ本一通りやったけど次は何しよう」
- 「スプラトゥーン2発売まで2ヶ月きった!」
- 「WiiU売ってしまってスプラトゥーンできない。やりたいやりたいYoutubeで我慢」
- 「KotlinがGoogle公式の言語に!これはプロダクト採用ワンチャンある。勉強しよう」
- 「2はとりあえずチャージャーから入ってエイムリハビリしていこう」
- 「アーキテクチャ意識して制約加えてコーディングするようになってから悩む時間が増えた」
- 「制約の中でもスムーズにコーディングするためにはデザインパターン的な技が必要では?」
- 「赤木も山王工業戦に備えてスピンムーブとか練習してたし、やはり新しい技(デザインパターン)を習得しよう」
ベースになっているのは結城浩さんのデザインパターン本です。
それをKotlinで書き直してみました。第一回目はIteratorパターンです。
ソースは
DesignPatternInKotlin/src/iterator at master · kseito/DesignPatternInKotlin · GitHub
にまとまっています。
Iteratorパターン
Iteratorパターンとは、何かの集合から要素を順番に取り出して処理していくものです。
今回は、スプラトゥーンのイカの画面を意識して作りました。
バトルで使用する武器を選択する画面です。
武器(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
となります。