Railsでアプリケーションを開発しているとき、モデルやコントローラをどう分割すればよいか、テストをどうかけばよいか、といった悩みが出てくることがあると思います。 そんなとき、自分の中で参考にできるオープンソースをいくつか持っておくことで、よりよいコードが書けるようになります。 ここでは、参考になるオープンソースを5つ紹介し、それぞれについて簡単に説明します。

選定条件

まず、参考とするオープンソースについて、以下の条件を満たすものとします。

  • メンテナンスされていること
  • 有名であること
  • 動作が分かりやすいこと
  • 特筆すべき参考点があること
  • GitHubにリポジトリを持つこと

オープンソース

1. GitLab

GitLabは、GitHubのようなリポジトリ管理システムを構築できるオープンソースです。

設計の特徴として、モデルを責務に応じてFinderクラスやServiceクラスに分割しており、モデル本体が簡潔に記述されています。 コントローラもConcernモジュールやサブディレクトリに適切に分割されています。

フロントエンドはこの規模でフレームワークを導入していないため煩雑ですが、Dispatcherクラスの考え方は参考になるかもしれません。

2. Discourse

Discourseは、StackExchangeのファウンダが立ち上げた、掲示板を構築できるオープンソースです。

GitLabと同様、モデルをServiceクラスに分割している他、JSONの出力をSerializerクラスで綺麗に記述しています。 また、Ember.jsを用いて構造化しているJavaScriptディレクトリは、大規模開発の参考になります。

3. Spree

Spreeは、RailsアプリケーションにEC機能を導入できるオープンソースのライブラリです。

リポジトリから分かるとおり、コアの他にAPI、フロントエンド、管理画面といったディレクトリに分割されており、それぞれがGemとして開発が進められています。

他の4つとは違い、これ単体で動作する訳ではありませんが、開発方法の面でも参考になると思います。

4. Feedbin

Feedbinは、ローカルで動作するRSSリーダのオープンソースです。

シンプルなRSSリーダのため、動作が分かりやすく、コードが追いやすいというのが特徴です。 一方で、モデル/コントローラが適切に分割できておらず、肥大化してしまっている部分もあります。

その他のOSSと見比べながら読み進めると、学べるところがあると思います。

5. Redmine

Redmineは、プロジェクト管理システムを構築できるオープンソースです。

Redmineも有名なため、動作が理解しやすく、対応するコードを追いやすいでしょう。 ただ、appディレクトリから見てとれるように、適切に構造化できているとは言えません。

Feedbinと同様、「自分ならどうリファクタリングするか」といった視点で見れば、得るものがあると思います。

おわりに

GitLabのFinder/Serviceクラス、DiscourseのSerializerクラス、Spreeの開発手法といった、それぞれのイイトコどりをすることで、自分のサービスをうまくリファクタリングできると思います。

FeedbinやRedmineも動作が分かりやすいので、テストコードなど参考になるでしょう。

ぜひ開発の参考にしてみてください。