kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

module, class(Ruby)

こんにちは。kikeda1104です。 ファイル別にコードを切り出して、必要なモジュールやクラスでひとまとめに呼び出すのは、 割とgithubなどで公開されているコードでは一般的だと思います。

自分の頭の整理もかねて、moduleとclassの知識の整理とやりたいこと書いていきたいと思います。

Rubyにおけるmoduleとclass

Moduleとは

モジュール (Module)とは、工学などにおける設計上の概念で、システムを構成する要素となるもの。いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと。

Classとは

クラス(class)は、クラスベースのオブジェクト指向においてオブジェクトの設計図にあたるもの。抽象データ型の一つ。

ModuleとClassの違い

モジュールとクラス モジュールとクラスの違いは以下の通りである。 クラスにはインスタンスとしてオブジェクトを生成する機能がある。 クラスは他のクラスの動作やデータを継承することができる。 ポリモーフィズムにより、クラスのインスタンス間の関係は実行時に変化するが、モジュール間の関係は静的である。 モジュールとクラスの類似点は以下の通りである。 どちらも実装の詳細を外部から隠蔽する。 どちらも階層(モジュール階層とクラス階層)を形成することができる。

Rubyだと、モジュール階層が同じであれば、ファイルとして切り出して、呼び出した際にも 同一のmoduleとして見てくれます。

ソースファイルを分けたい

やりたいことは、ソースファイルを分けたいんですよね。 ファイル内で、ソース分けることでも、見やすくなりますが、ファイルを分けることで、ファイル名でも判別できますから、尚良い(・∀・)

# file01.rb
module Hoge
  def fuga
    puts "fuga"
  end
end

# file02.rb
module Hoge
  class Connection
  end
end

# file03.rb
require 'hoge/file01.rb'
require 'hoge/file02.rb'

module Hoge
end

上記みたいに記述することで、module名をname spaceとして利用することができますね。

ファイルを切り分けたいスクリプト(Gem)

Railsアプリのlibにあった機能を、gem化することにしたのが理由で開発しています。

ディレクトリの構成

f:id:kikeda1104:20141021182725p:plain

結果

実は、gemのファイルの切り出しがなかなか考えられずにいましたが、できると早いもので。 Connection.new.getみたいに使いたかったので、これをリクエストは,request.rbファイルにまとめていましたが、 class Connectionにまとめる形にして呼び出していますね。

参考

kikeda1104/recruit_api · GitHub

書きながら調べていく事で問題が解決できたので、うまくまとめられました。 gemはまだ、開発中なので、Rubygemsに公開もしていないですが、後日、多分すると思います。

※ファイルの切り出しとか、コードの書き方で、意見があれば教えていただけると助かります。