せらぴんブログ

サークル「せらぴん」のうのはな透です。やっぱり眼鏡っ娘が好き!!

Enumerableを信じよ

www.adventar.org

Ruby Game Developing Advent Calendar 2016 8日目の記事です。

昨日はaoitakuさんの「委譲とコンポジション」でした。
Forwardableは実際便利で「パズルっぽいゲーム」でも使ってます。
でもChipmunkは使ってない……あのゲーム物理演算が必要な域に達してないから(震え声)

さて、「Enumerableを信じよ」とは言いましたが、
実際RubyでプログラミングしてればEnumerableは使えて当たり前なんで
何を今更?????と思われてもしょうがないんですが。
一昨日の記事で一部書き忘れたことがあったので、初心者向けも兼ねて書く。

Enumerableとは?

module Enumerable (Ruby 2.3.0)

ArrayとかHashとかRangeとかSetとかの大本。

Enumerableの思想とは?

旧版は、ブロックや自機がどこにいるかという座標情報をfield二次元配列の順序という形で持っている。
新版は、座標情報をブロックや自機の基底クラスPuzzleObject内にPosオブジェクトとして持っている。

どちらがいいかと聞かれたら、そりゃ後者じゃないのかなって。

こういう違いが出るのは、
そもそもRubyのEnumerableは「配列順序を気にしたくないから」なんだろうなぁって思うんです。
もちろんArrayクラスにはeach_indexなりfind_indexなり要素の位置を意識したメソッドはいくつかあります。
ですが、Arrayを使う箇所って、大半は単なるEnumerableの実装として使ってる節があります。

  • Arrayの中には異なるクラスのオブジェクトを突っ込んでよい
  • ArrayはEnumerableを継承しているので、大半の集合操作(map, selectなど)を実行できる

Enumrableの実装の中で「順序を気にしたくない」という欲求を純粋に体現しているのがSetクラスなんですが、
Setクラスは同時に「重複も許さない」んで、使える場面は必ずしも広くない。
というのと、[a, b, c]と書くのと、Set[a, b, c]って書くのだと、ちょっとだけ前者のほうがラク。

このあたりの話をすると、SQLを思い出してしまう。
SQLはorder byを使うまではSetで、order byを使い出すとArrayになるという特性を持つ(持ってない)。


最終的に何が言いたいかって言うと、
Set使えるところはSet使うといいよってところと、
Arrayでも配列順を気にしないようにリファクタリングできるならした方がいいんじゃないかな、ってことかな!


明日はt_tutiyaさんの「rubyゲーム開発にテスティングフレームワークを導入する(1)」です。
rspecとか使うのかな。お楽しみに!