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も動作が分かりやすいので、テストコードなど参考になるでしょう。
ぜひ開発の参考にしてみてください。