この記事は RubyMotion Advent Calendar 2012 の24日目の記事です。
クリスマス・イブですね。皆さまいかがお過ごしでしょうかリア充爆発しろなんて言わないよ絶対。
さてさてここ最近とても大好きなRubyMotion、Xcodeが大嫌いであるがゆえに使い始めておりまして、ワタクシ決してRuby畑のニンゲンではなく、第1回のRubyMotionもくもく会 でしたか、@satococoa に「Rubyぽく書くために読んだらいい本かWebページ教えてください」と質問したところ「メタプログラミングRubyに決まってるだろJK」とのお答えをいただきましてシコシコと読んでる最中でございます。 ※まだ読み終えてない←
アスキー・メディアワークス
売り上げランキング: 44,947
本書で紹介されているテクニックのいくつかはRubyMotionにすでに移植されておりまして、こちらのエントリが詳しいです。
RubyMotion Metaprogramming
このエントリでは RubyMotion Metaprogramming で紹介されてるテクニックのうち
- instance_eval
- インスタンスの外部からインスタンス変数, インスタンスメソッドにアクセスするテクニック
- define_method
- インスタンスのメソッドを動的に作成するテクニック
を使って、アプリを書き換えてみようかと思います。
instance_eval / インスタンスの外部からインスタンス変数にアクセスするテクニック
題材には作成中のアプリのそこかしこで使っている、InformViewという自作パーツを使用します。
修正前のソースはこちら
これを表示するための記述はこんな感じでした。
それをこうしたい。
で、InformViewクラスはこんな記述になりました。
クラスメソッドからSingletonで作成されたインスタンスのインスタンス変数にアクセスするためにinstance_evalを使っています。Rubyのクラスメソッドは
def self.method_name() end
の形式で定義できます。この例ではself.showとself.hideですね。
define_method / インスタンスのメソッドを動的に作成するテクニック
これまた題材は作成中のアプリです。
修正前のソースはこちら
それぞれReadabilityの「記事の既読・未読を切り替えるもの」「記事のFavを切り替えるもの」でして、やっている処理はほぼ同じなわけです。修正前のソースの toggleFavoriteメソッド() とtoggleArchive() メソッドを見比べてくみてください。違うのはAPIにPostするパラメータ名だけですね。
これをこのように変更しました。toggleFavoriteメソッド() とtoggleArchive() メソッド が!ひとつの記述で!
最後に
『RubyMotionを使うからにはRubyぽく書いてみようず!』というドヤ顔タイトルを考えていたんですけど、出来上がりがあんまりRubyぽくなかったのでやめました( ;∀;)
Rubyっぽさとはいったいどうすればでるのか!
Rubyっぽさとはいったいなんなのか!
あと、こちらのソースではメソッドを動的に呼び出せるsendメソッドを使っています。
motion-octofeed / app / activity_template_github_api.rb
RubyMotionのSDKがあれば、お手元のシミュレータ・実機で動作確認できます。
ダウンロードはこちら → amazedkoumei / motion-octofeed
それでは皆さま!よいクリスマス・イブをお過ごしください!!