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
Androidアプリを作るために最低限必要な知識と未知の部分を列挙

作りたいアプリによって必要な知識は変わるかもしれないが。。 個人的過ぎて役に立たないが、整理がてら羅列してみる。 …

no image
アプリ起動時に呼び出すStoryboardを指定したい

google-fu不足でどこにも載ってなかったのでメモ。 プロジェクト内のInfo.plistで設定できます。 …

no image
DockerでNginxしたい

Contents1 Dockerfileを用意する2 …

no image
Bower再入門

Contents1 Bowerとは何なのか2 …

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

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

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

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

logo_og
ReduxのMiddlewareについて理解したいマン

ReduxのMiddlewareの仕組みがよく分からない。 具体的な処理過程を追いかけて理解に至るまでのメモ。 …

logo_og
ReactNativeでGiphyのデータを表示する

まずは下記をサクッとパクってみる。 当方、比較的AndroiderなのでAndroidで。 …

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

http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top この辺を読んだメモ。 …

no image
Swiftで追加したサードパーティなモジュールを更新する方法

SwiftにはCocoaPodsのようなライブラリを管理するツールがないので、手で追加します。 手で追加したライブラリのバージョンを更新したいときどうすればよいか。 …