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って何のために存在してるのだろう、と思うわけだ。

だいぶ謎。

 - プログラミング

336px




336px




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

  関連記事

no image
意識低いRuby on Rails再入門6 ~ログイン必須のControllerを作りたい~

ログイン状態を取得するためのSessionsHelperを前に書いた 新規投稿画面を表示したり、実際に投稿するときにはログイン必須であることを保証したい。 …

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

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

no image
Toolbarで表示する矢印アイコンの色を変えたい

http://stackoverflow.com/questions/26788464/how-to-change-color-of-the-back-arrow-in-the-new-material-theme 動的に色を変えるイイカンジな方法が分からず困っていた。 …

no image
Docker導入したらどうするの?

Dockerを導入したけど、nginxが入った環境がどこでも使えるようになった!程度だったらあんま意味ないよね。 Web開発をする上でDockerをどのように使うのが効果的か考えてみる。 …

ReactなComponent同士を連携させたい

実践的なサンプルに塗れてなんとなく使ってると破綻する。 分かってること、分かってないことを整理しておきたい。 …

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

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

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

ActionViewを使ってModelクラスの新規作成画面を作りたい。 ウェブアプリ上でModelのクラスを作成する。 …

scrapy実行時のエラー対処

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

FlutterでListViewしたい

こんにちは。 陰キャな仮想通貨投資家こと、梅木栽培マンです。 …

Docker Machineのメモ

随時追記する Contents1 …