Расположение файлов шаблонов стратегии Rails

У меня есть пара вопросов: после идеального ответа, который я получил на этот вопрос зависит от бизнес-логики в атрибуте модели.

Я планирую использовать шаблон стратегии, и мне было интересно, куда (в какую папку) я должен поместить файлы классов? они должны идти в папку моделей? Кроме того, у меня есть поведение по умолчанию, нужно ли мне по-прежнему создавать класс интерфейса и извлекать из него мою стратегию по умолчанию, или я определяю свою стратегию по умолчанию как базовую?


person Mike W    schedule 06.12.2015    source источник
comment
Вы можете хранить PORO в любой папке, если она является дочерней в каталоге /app. В вашем случае вы можете подумать о создании папки /strategies.   -  person bo-oz    schedule 06.12.2015


Ответы (1)


Это субъективный ответ, поэтому, вероятно, в какой-то момент он будет закрыт.

Поскольку я дал ответ на исходный вопрос, позвольте мне попытаться ответить на этот.

Есть два возможных места, где вы можете хранить этот файл:

  • app
  • lib

В этом конкретном случае я бы выбрал папку lib. Для каждого приложения Rails, над которым я работаю, у меня обычно есть определенная папка в lib, называемая тем же именем проекта, которое представляет собой пространство имен, в котором я храню бизнес-логику, специфичную для моего приложения.

Например, если мой проект называется whatever, у меня есть lib/whatever вместе с файлом lib/whatever.rb, который является корнем моего пространства имен.

module Whatever
end

Каждый файл в папке lib/whatever вложен в это пространство имен. В этом случае вы можете создать папку для ваших комиссионных стратегий по адресу lib/whatever/commissions и создать следующие файлы

# lib/whatever/commissions/alpha_strategy.rb
class Whatever::Commissions::AlphaStrategy
end

# lib/whatever/commissions/beta_strategy.rb
class Whatever::Commissions::BetaStrategy
end

Чтобы уменьшить количество файлов, вы можете просто иметь файл lib/whatever/commissions.rb, в котором будут храниться все стратегии. Это хорошо работает, когда реализация каждой стратегии относительно короткая.

# lib/whatever/commissions.rb
module Whatever::Commissions
  class AlphaStrategy
  end

  class BetaStrategy
  end
end

Вместо этого давайте посмотрим, почему я не поместил бы эти файлы в app. Опять же, этот ответ субъективен и основан на моем личном опыте работы с довольно большими и сложными приложениями Rails.

Я видел использование /app для хранения большого количества вещей. Например, распространенным шаблоном является создание папки app/workers в приложении. Что может иметь смысл, так как воркеры являются глобальными (тем не менее, вы можете хранить их в lib). В вашем случае то, что вы создаете, действительно ориентировано на одну модель, поэтому иметь специальную папку в /app, вероятно, слишком много. Кроме того, если вы используете общее имя, такое как strategies, оно вообще не будет иметь смысла.

Так почему бы не app/models тогда? Ну, на самом деле это может быть второй вариант. Однако я предпочитаю хранить только модели в этой папке, а модели для меня означают только функции, связанные с сохранением.

То, что вы создаете, не имеет прямого отношения к настойчивости. Он использует сохраняемый объект (экземпляр модели), но не имеет ничего общего с сохранением данных в базе данных. Поэтому в app/models смысла нет.

В небольшом проекте вы, вероятно, можете сохранить его в app/models, но я работал с проектами, в которых у вас есть более 30 моделей, и если вы сохраните все эти функции, не связанные с сохранением, в app/models, ваша папка постепенно станет беспорядком.

person Simone Carletti    schedule 06.12.2015
comment
Вау, большое спасибо Симоне за то, что нашли время для этого отличного ответа. Это имеет смысл. Я думал, что папка lib предназначена только для внешних программ. А как насчет второй части вопроса о реализации стратегии по умолчанию? Еще раз большое спасибо за ваше драгоценное время. - person Mike W; 07.12.2015