1.問題点:クラスが理解できない
10月くらいからRubyの勉強をはじめている。1日30分~1時間程度しか時間がとれないが、それでも徐々に理解は進んでいる。for文を使わないRuby独特の構文もなれてきた。:をつけたキーワードなんちゃらというのもなんとなくわかった。
でもクラスの理解が進まなかった。
「クラスって何?」
「インスタンスって何?」
「オブジェクト指向って何?」
クラスやらオブジェクトとかいうのはRubyに限らず、他のプログラミング言語にも登場する。きっと便利なものなのだろう。けれどもなんだか難しい。
いままでの内容(配列・ハッシュ)はイメージが湧きやすかった。配列の並べ替えや、ハッシュから値のみを抜き取るというのも、一度やれば挙動が理解できた。
でもオブジェクト!となるとさっぱりである。ウェブで検索しても言葉の説明ばかりでまったくわからない。いったいどうすればいいのか。
2.解決策:コードを書く!楽しく書く!
答えは簡単。コードを書くことである。クラスを使ったコードを実際に書き、体で挙動を感じるのだ。そしてひととおりできたら、ちょっと修正してみる。「あ、そうか! ここをいじるとこうなるのか」とわかる。
さらに欲をいえば楽しくコードを書ければいうことはない。楽しいは正義である。「いや、コードは苦しみながら覚えた方が身に付く!」という意見もあるかもしれないが、それで続かなければ意味がない。
何か自分に興味のある分野、親しみやすいジャンルに関係するコードを書ければいい。
3.ドラクエ風アプリをつくろうの概要
3-1:概要
そこで出てきたのが今回紹介する教材である。「ドラクエ風ゲームプログラムを作ってみよう!」はドラクエっぽいコードを書きながら、クラスの理解を深めることができる教材である。
https://www.techpit.jp/courses/enrolled/696793
ドラクエっぽいといっても超本格的なRPGをつくるわけではない。この教材では戦闘シーンの本当にコアな部分をつくるだけだ。つまり、「勇者とモンスターが1対1で戦い、どちらかのHPが0になったら終了」というものだ。
本教材は4章で構成されてる。
- 0章: 環境構築
- 1章:勇者クラスの定義
- 2章:モンスタークラスの定義
- 3章:攻撃処理の実装
- 4章:クラスの継承・ファイルの分割・リファクタリング
実際のところ、3章までやれば動くものはできる。でも、「動いたからもう教材はやらなくていいや!」と投げ出さないでほしい。4章ではリファクタリング、つまりコードをより見やすく改善していく。煩雑としていたコードが徐々にきれいになっていく様はけっこう感動する。すげーとなる。
3-2:誰を対象にしているか
この教材の対象者は、明確に記載はされていないが、個人的な考えでは次の2点はクリアしている必要があると思う。
- RubyでHello Worldができている人(環境構築が済んでいる)
- 配列・ハッシュが理解できている人
ちなみにRubyの参考書として有名ないわゆる「チェリー本」で考えると5章まで理解できていれば問題ない。(6章の正規表現は使わない)
3-3:環境構築について
本教材の第0章では環境構築について書かれている。しかし、私はそれに忠実に従う必要はないと思う。ひとまずはrubyをインストールしており、日本語の出力が出来ていれば問題はない。
puts "ハローワールド"
ができればいい。
この教材をやるだけならxcodeやRailsはインストールしなくてもいい。さらに発展的な内容を学習するには必要だが、それはそのときにやればOK。
とりあえず教材を見ながら最後までコードを書いてみてほしい。
4.学習してみて
4-1. クラスがなんとなくわかった!
ここからは実際に教材で学習をしてみた感想を書く。
まず、クラスがなんとなーく理解できたのがよかった。クラスは設計書であり、仕様書であり、金型だった。おおまかな外観やふるまいをあらかじめ設定しておくことで、コードがきれいになる。
配列やハッシュや関数と違うのは堅牢さ。クラスは外からは変更できない場所にデータを収納できるので、途中でおかしな挙動をみせることが少ないらしい。そうか。
あとは、勇者やモンスターのパラメータの設定を通じて、アクセサメソッドのこともわかった。ここは本を何回読んでもしっくりこなかったところなので、わかるようになって嬉しい。HPのように途中から値が変わるものは`aatr_accesor`, 攻撃力、防御力のように変化しないものは`aatr_reader`を使えばいいことがわかった。
4-2. 処理を考えるのが楽しい!
教材では2章の冒頭から、「まずは自分で処理を考えてみよう」というスタンスになる。1章でやったことと同じことをベースに自分で処理を考える。これが自分には楽しかった。「これでどうだ!」とコードを書いて教材の文章で答え合わせをする。というのを繰り返していた。どうもわかりないときは教材を見た。
そんな感じなので、「うまくできた!」と思っても作者とやり方がちがっていた...ということもあった。そのときは質問コーナーで「〜〜とやっても大丈夫ですか?」と聞いた。問題なかった。
例えば、「3-3 モンスターの攻撃処理実装」の項目。モンスターの攻撃処理は以下の仕様だった。
>1.HPが半分よりも多ければ通常攻撃
2.HPが半分以下になると変身して攻撃力が1.5倍
自分は`@hp`とは別に`@initial_hp`というインスタンス変数を作ってそれを条件分岐に使った。でも、作者はそれとは別のやり方をとっていた。(詳しくは教材を確認してほしい)
何はともあれ、処理を考えるのは楽しい。
4-3. リファクタリングが楽しい!
ついでに言うと、4章からのリファクタリングも楽しい。4章のはじめに勇者クラスとモンスタークラスの親となるキャラクタークラスを作成した。あとはファイルの分割やモジュール化を行い、コードが読みやすくなった。掃除をしたあとのようなすがすがしい気持ちになる。
PCの前にいないときは、スケッチブックにコードの流れやそれぞれの関数の役割を書いた。そして、「どこをどう直せば読みやすくなるか」「共通化できるところは何か」を考えた。こういうのも楽しい。教材では早い段階でファイル分割をしてしまうが、自分としては先に全体の関数を整理してからのほうがやりやすかった。
4-4. 紙の教材では味わえないリアルタイム感
最後に書きたいのが、紙の教材では味わえないリアルタイム感である。普通の参考書を見ながらの勉強はわからないところがあっても、著者はどこか遠くにいる感じがある。でも今回のようなウェブ上の教材は違う。質問しても翌日には回答がかえってくるし、内容もすぐに修正される。
この動画を思い出した。堀江さんとマコなり社長という人が対談をしている。マコなり社長はプログラミングのカリキュラムをオンラインで作成していて、フィードバックを受けながら修正しているのだという。「教科書はアップデートされるべき」といった一言には堀江さんもメモってた。