moxt

Just another Blog site

Rubyのモジュール機能とRailsのHelperについて考える

      2015/07/03

Moduleとは

参考サイトを見ながら思ったことをメモ

クラスでは継承をサポートしており1つの基幹クラスを継承して複数のクラスを作成する事が出来ます。これによって同じような機能を持つクラスを別々に1から作成する必要はありません。ただ、同じ様な機能が必要だったとしてもまったく別の目的のクラスである場合はクラスの継承によって共通化する部分を作成するにはおかしい場合があります。そのような場合に共通となる機能をモジュールとして定義し、各クラスにインクルードして利用することでコードの再利用性を高めることができます。

『同じような機能が必要 かつ 全く別の目的であるクラス』とはどんなクラスなのだろうか。
例を挙げて考えてみる。

  • 帳簿クラスが複数の売上クラスを持っていて、売上の平均値を取得したい場合
  • 生徒名簿クラスが複数の生徒クラスを持っていて、生徒の身長の平均値を取得したい場合
  • 帳簿クラスと生徒名簿クラスはそれぞれ別の目的で作られたクラスだが、平均値を取得したいという機能は共通している
  • こういうときは共通機能をモジュールに切り出して、各クラスがインクルードして利用しましょう

と、いうことなのだろうか。

上のような『平均値を求める』であれば、わざわざモジュールに切り出す必要もなさそう。
パッと思いつかないが、有効な場面があるのだろう。

  • クラスのメンバー変数に依存せず、あくまで受け取った変数のみで閉じる処理を行う
  • 関心の異なるクラスを横断する共通処理

を担うのに最適な役者がモジュールなのだろう。

http://ruby-doc.org/core-2.2.0/Module.html

何かしらのクラス内でincludeするとインスタンスメソッドのような振る舞いをする

ここを読んでちゃんと学ぶ。

Helperとは

RailsにあるhelperってModuleと似てると思った。
helperはモジュールのスゴい版って感じだろうか。

ViewでModuleな機能をサポートしてくれるのがHelper

何かしらのHelperを定義しておけば、Viewの中でincludeなどの宣言無し(そもそもView内でinclude呼び出せるのか分からないが)にHelper内で定義された処理を呼び出すことができる。

基本的にはViewに特化した処理をModelに詰め込むのではなく、Helperに移譲することが狙いなのかなと思う。
HelperにView特化な処理を移譲すると、Model側はViewの仕様に依存するような処理を抱えなくて済む。
ModelはModelとして必要な処理だけを保持できる。
すると、複数人が同じModelをイジることがなくなりコンフリクトが減り、運用上のコストが減る。
と、いったところがメリットだろうか。

一方、HelperはどのView上でも横断的に使えるため名前空間的な問題が発生しそう。

『平均値を求める』HelperがA,Bクラスそれぞれに存在して、平均値の求め方がA,Bクラスそれぞれ異なるとき
Average(A)とAverage(B)として、それぞれ中の処理が違うみたいなことをやりたい。
でもHelperはどのViewからでも呼び出せるためAverage(A),Average(B)が衝突する。

対策として、AAverageとBAverageに名前を変える必要があるのかな。。
iOSアプリ開発でやってた謎のプレフィックス付け作業を思い出す。
これはこれでコストになる。

その場合はデコレータを使おう。
みたいな声明をインターネット上で見かける。

Helperの存在意義とは

Helperの設計がイイカンジになっていれば、もしくはそこまでHelperの数が無ければデコレータは不要そうだ。
複雑度がある程度大きくなるとデコレータの出番ですよ、という感じだろうか。

デコレータがHelperの上位モデルだとすると、もはやHelperって何のために存在してるのだろう、と思うわけだ。

だいぶ謎。

 - プログラミング

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

  関連記事

no image
Macでdocker系のコマンドが使えなくなったら確認すること

OSXではdockerは使えないため、別にVMを立ち上げ、そこでdockerを動かしてる。 macからdockerコマンドを使うためにboot2dockerというコマンドを使う。 …

no image
Mastodonインスタンス(お一人様用)を作り方メモ

Mastodonは運営の存在を気にせず罵詈雑言吐けるの便利そう。 自分用のインスタンス作ったので、便所の落書きしておく。 …

no image
Androidアプリを実機デバッグしたいのにNo debuggable applicationsと表示される時の対処例

Tools > …

scrapy実行時のエラー対処

Macで発生した。 scrapyを実行したら下記のようなエラーを吐いた。 …

no image
フロントエンド開発のメモ

最近のフロントエンド開発ではビルドランナーを使うのが常識になってきてるみたいなので。 jspm的なもっと進んだやり方でも良いんだけど、pluginが少ない、文献が少ない、自身の技術力不足、ということでビルドランナーなやり方でやる。 …

nokogiriでスクレイピングするときによく忘れるヤツ集

書くことで記憶を定着させる施術。 class,id以外の属性を指定してタグを探したい …

no image
単語の出現頻度をlinuxコマンドだけで調べたい

無駄にpythonとか使おうとしてた。。 楽にできて良かった。 …

no image
gitであまり使わないけど知らないと困るコマンド一覧

随時追加 originのURLを変更したい …

no image
『Tutorial & Hackathon #1』をやってみる

https://pydata.tokyo/news/pydata.tokyo-tutorial-hackathon-1 タイタニックの乗客データから生存者の推定モデルを作成してる。 …

no image
意識低いRuby on Rails再入門1

整理がてらメモ。 Contents1 …