ユニファ開発者ブログスマートフォン用の表示で見るユニファ開発者ブログユニファ株式会社システム開発部メンバーによるブログです。設計こんにちは、Webエンジニアの本間です。最近、Railsアプリケーションのディレクトリ構成に関して考える機会があったので、そのことについて書いてみようと思います。Railsに限らず「ディレクトリ構成をどうするか」という点は、設計初期の悩ましい問題の1つだと思います。Railsでは標準のディレクトリ構成が決まっているため悩みは少ないのですが、多くの場合、標準外のディレクトリもある程度は追加していくと思います。「app」以下のディレクトリ構成は、アプリケーション全体の設計に関わる部分であり、各メンバーの考えもあるため、なかなか決まらないケースもあると思います。この問題に対する1つの参考情報として、著名なOSSのRailsアプリケーションが採用しているapp直下のディレクトリを調べてみようと思いました。著名なOSSで採用されているのであればそれなりの理由があるはずだと思いますし、世の中の標準にも近いはずなので、あとから参加したメンバーも違和感なく開発できると考えたためです。以下の条件で「Railsを使用している著名なOSSプロジェクト」を集めました。最終的に以下の15個のリポジトリを対象にしました。直下にどういったディレクトリがあるか、集計してみます。結果2017年8月1日に実行した結果は以下になります。「リポジトリ数」が「2」以下のものは結果から除外しました。多くのリポジトリで使用されているディレクトリもあります。次にRails標準で作られないディレクトリに入っているクラスの役割を、各リポジトリのコードをざっと読んで確認してみます。services過半数のリポジトリで使用されているディレクトリで、ある程度のロジック(複数Modelの更新、Jobの登録、外部サービスとの連携など)を取りまとめるクラスが格納されるようです。ControllerやJobなどでこれらのクラスを使用することで、ロジックの重複を排除するほか、Controllerクラスが肥大することを防ぐ目的で使用されていると考えられます。クラスの書き方に関しては、各リポジトリで微妙に異なっており興味深いです。渡すか、対象のメソッドを呼び出す際に渡すかサービスクラスのpublicなメソッドは1つのみ限定とするか、複数メソッドを許容するか以下は、mastodonのServiceクラスの例です。」で統一されていうように見受けられます。用のSerializerクラスを格納しています。15個のリポジトリ中7個で使われていて、このGemが広く使われいることがわかります。policies主に権限チェックのためのルールを記述したクラスが格納されるようです。用のPolicyクラスです。半分は自前の権限チェックの実装で使用されているようです。gitlabhqのPolicyクラスが、独自のDSLを使って定義されているのが印象的だったので、以下に引用しておきます。presentersModelオブジェクをラップしてView用に使いやすくするクラスが格納されるようです。Modelクラスのコードの肥大化を避ける目的があると考えられます。細かい役割や利用方法はリポジトリによって異なるようです。diasporaでは、View用のJSON変換の際、特定の属性のみに限定したり、少しデータを加工する目的で使用されているようです。一例は下記になります。gitlabhqでは特定のView用のロジックを持つものとして、より広い用途で使われているようです。concernsはなぜ使わないのか、などの説明が記載されています。Workerクラスを格納しているケースが大半でした。使用するUploaderクラスが格納されています。用のValidatorクラスを格納しています。まとめ今回、著名なOSSのRailsアプリケーションを対象にapp直下で使用されているディレクトリを調べてみました。いったGemに依存しないディレクトリが広く使用されていることを確認することができました。Gemに依存しないディレクトリに格納するクラスは役割や書き方が曖昧になりがちなので、使う際はルールをちゃんと決めておいた方がいいなと感じました。最後までご覧いただきありがとうございました。何かの参考になれば幸いです。Fargate)で運用する際のログ設定で工夫した点こんにちは、Webエンジニアの本間です。通信してみるこんにちは、iOSエンジニアのしだです。学習済みモデルを使って顔画像のクラスタリングを行うお久しぶりになります、iOSエンジニアのしだです。距離センサーでトイレセンサーを作ってみた皆様こんにちは。Detection月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。