えぇー、解決はしたんですがなんか有り得ないハマり方をしたので、記録。
Rubyでログ解析ツールを作るにあたり、Mix-inのやりかたを実践しようとして、まずは簡単なコードを書いたのです。
module TestModule1
def test_method1()
p "hoehoe"
end
end
この程度。本当に誰でもできる簡単なお仕事。
で、まずは軽ーく実行してみようと思い、ruby -eでちゃちゃっとテストコードを書いてみた。
$ ruby -e 'include TestModule1; test_method1();'
…みたいな感じ。ちなみに、どのコードもうろ覚えなので、些細なことは気にせずに。
ハイ動きません。当然ですが。不可解なエラーが出まくりでした。
正しくは、こんな感じにしないといけなかったのです。
$ ruby -e 'require "testmodule1"
class TestClass1
include TestModule1
def initialize
p "hogehoge"
end
end
# main.
tester1 = TestClass1.new
tester1.test_method1()'
で、何が一番問題だったかと言うと、requireを忘れているとかそういうことではなくて。
「Mix-inっていうのはモジュールで定義したコードをクラスに導入することを言うんだ」
という事実に思い当らなかったこと(requireも最初意味がわからなかったけどさ)。
まぁRubyのリファレンスもちゃんと読まずに拾い読みだったのだけど、このあたりのことは、あまりに当然すぎるのか、モジュールの説明を全部読んでも載っていなくて。
なんというか、もう10年近くもC++とJavaをやってきたんだから、気付いて当然だろうという感じだったのですが…。なんで気付かなかったのかを思い返してみると、
「Rubyがオブジェクト指向言語ということをすっかり忘れていた」
これなんです。で、なんで忘れていたかと言うと、どうもあたしがRuby on RailsからRubyを始めており、さらに
「Ruby on Railsで手続き的なコードしか書いていなかった」
というのが根本にあった気がします。
RonRは本当に良くできているので、書くべきコードなんて個々のアクションだけ。
しかも担当しているWebアプリは、あらかじめ条件付けされたページごとに、表示すべきデータをDBから読む、といった程度の仕様なので、なおさら手続きに没頭することになるのです。まー、せいぜい文字列加工したり文字列加工したり文字列加工したりだね。
結果、スタンドアロンのツールを作るまでクラスやモジュールなんて作ろうとも思わなかったので。Mix-inなんてとんでもない感じだったので。
なにしろ、あたしが機能を追加するたびにコード量が半減していくようなありさまなので(改造の合間にコード整理をしているのです)。
ちなみに、今はそのツールも完成して、以後Mix-inやりまくっていますが。RonR上でも。
これはこれで、本当にこんなやり方して規約違反になっていないのか、という不安はあるのだけど…。いや、ApplicationHelperが肥大化しすぎたので、役割ごとにモジュール化しているのだけど。
思うに。
Ruby on Railsを手掛ける人は、まずRubyを一取りやるべきだねー、と<普通はそうだよ
てか、JSPに手を染めた時も、「なーんかバッチ処理書いているなー」という印象は強く持ったなぁ…ということを思い出したこの一瞬。
ちなみに参考書はこれらです。
さて試験は何時受けようか…。
てか、コードも後半分くらいにはなるんだよなー。今9割方コピペ状態が1組、というところまで抽象化を済ませたのだけど、最後の一手がめっさ面倒で…。
テスト?いやいやいや。はなっからわけのわからん状態になってるので、もはや手がつけられませんよ…。新規分ですらっ!