異なるファイルに対して共通のフローの処理をしたい場合のディレクトリ構造

概要

異なる種類のファイル(hoge_file, foo_file)に対して、以下の共通の処理をしたいケースを考えます。

1: データ抽出
2: フォーマット
3: データ保存
4: データアップロード

ファイルごとにディレクトリを分ける

ファイルごとに共通な処理がないような場合、以下のようなディレクトリ構成が思い浮かぶかもしれません。

ただ、この形だとファイルをまたいだ共通処理を書きたい場合に、適切な場所がなくなり、将来的に困る可能性が高いです。
(concernsディレクトリで共通の処理をmoduleで作る方法もあるかもしれないけど、concernsは注意深く使う必要があります)

app/models/hoge_file/extractor.rb
                    /formatter.rb
                    /creator.rb
                    /uploader.rb
app/models/foo_file/extractor.rb
                   /formatter.rb
                   /creator.rb
                   /uploader.rb

機能ごとにディレクトリを分ける

機能ごとに分ける方が他の箇所で共通で利用することもできるし、処理ごとに共通の処理を同一のディレクトリの中におけるので、 重複したコードもなくしやすいです。

app/models/extractors/hoge_extractor.rb
                     /foo_extracor.rb
app/models/formatters/hoge_formatter.rb
                    /foo_formatter.rb
app/models/creators/hoge_creator.rb
                   /foo_creator.rb

例えば、データのアップロードにどちらもAWSのS3バケットを利用するのであれば、バケットごとに 以下のような具体的なディレクトリ名をつけることで使いやすくなるかと思います。

app/models/s3_buckets/hoge_bucket.rb
                     /foo_bucket.rb

リファレンス

我々はConcernsとどう向き合うか