2012-02-27 3 views
2

Затем настал момент реализовать какое-то достижение в нашем веб-приложении. У меня была идея, более или менее похожая на иерархичность, описанную в этом вопросе How to implement an achievement system in RoR.Достижения рельсов

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

Я где-то читал, что эту ситуацию можно реализовать через машины с конечным состоянием, но в настоящее время у меня недостаточно информации об этой теме.

Edit: конкретный вопрос

Я думал о моделировании класс достижение с перечнем условий, которые будут выполнены. Этот базовый класс Достижение имел бы булевое значение, которое рекурсивно проверяет все условия, чтобы они были действительными. Тогда условия могут быть жестко заданными классами. Затем администратор системы создает новые виды достижений с комбинациями атомных состояний .

Мой страх - это растущее число классов для атомных условий. Я не хочу иметь 30+ классов условий в проекте. Любые рекомендации действительно оценены.

Edit: более подробная информация о реализации

От ответа SpyrosP, это кажется хорошая идея, чтобы построить описанный DSL. В некотором смысле достижения должны быть сохранены в базе данных. Сохраняя тот же пример:

comments :less_than => 10 
check_comments 
comments :more_or_equal => 100 
award_hundred_comments_badge 

Для того, чтобы создать динамически достижений должна быть таблица, которая хранит состояние (ы) должны быть проверены:

Achievement 
| id | name    | 
| 1 | "Houndred Comments" | 

Condition 
| achievement_id | expression    | 
| 1    | some sort of condition | 
+0

StackOverflow предназначен для конкретных вопросов программирования с четким ответом. Это довольно субъективно. – Almo

+0

Редактирование вопроса тогда. –

ответ

1

Я был заинтересован в той же идее и некоторое время назад читал разные вещи. Вероятно, лучший способ сделать это - использовать наблюдателей. Наблюдатель похож на стандартный фильтр (before_filter и т.п.), но с некоторыми отличиями, например, как обрабатывается возвращаемое значение и так далее.

При этом, если ваша система действительно очень сложна, вы можете использовать плагин конечного автомата, например https://github.com/pluginaweek/state_machine. Однако я чувствую, что это слишком много для функциональности Achievements.

Если бы мне пришлось столкнуться с сложными сценариями Achiement, я бы, вероятно, создал простую DSL, которая определяла бы поведение достижения. Что-то вроде:

for_achievement :hundred_comments do 
    before_achievement :status => Comment, :lower_than => 100 
    after_achievement :status => Comment, :more_or_equals => 100 
end 

Вы получаете идею. Это будет способ полностью описать достижение. Затем ваши наблюдатели смогут использовать ваши сценарии класса success.rb, чтобы выяснить, достигнуто ли достижение. Подумайте об этом, как работает CanCan. Это также может быть хорошим способом для ваших администраторов написать простые требования к достижению с помощью еще более простой DSL, чем то, что я представил в моем примере выше.

Надежда, что помогает немного, или по крайней мере дает вам некоторые идеи :)

EDIT: Simpler DSL

DSL-может быть очень простым и выразительным, так что люди могут даже любят писать сценарии с , Что-то вроде:

comments :less_than => 10 
check_comments 
comments :more_or_equal => 100 
award_hundred_comments_badge 

Это может быть легко сформировано, чтобы быть допустимым сценарием для достижения 100 комментариев. Давайте подумаем о сценарии, когда пользователь получает значок, если он пригласил ровно 10 человек, которые являются женщинами по признаку пола.

invites :less_than => 10, gender :female 
check_invites 
invites :equals => 10, gender :female 
award_women_invitations_badge 

Теперь, я думаю, что это очень просто, чтобы написать даже для администраторов, которые не имеют понятия о том, рубин, если вы объясните им основные вещи о DSL. Но если вы не хотите, чтобы они вступили в это, вы можете создать такую ​​форму, как:

Action Dropdown => [Comment, Invite, Post, ....] 
Condition => [Equal, Less Than, More Than, ....] 
Condition_Value => (TextBox to write value to) 
CheckCondition => [Check Invitation Count, Check Messages Count, ....] 
+0

Благодарим вас за ответ. Мне очень нравится ваша идея, и я думаю, что это фантастический способ выразить стандартные достижения. Я не думаю, что они жизнеспособны для создания через веб-интерфейс, хотя, как вы думаете? –

+0

Это зависит от того, как вы создаете DSL для него. Поскольку администраторы не имеют понятия о рубине, вы можете сделать DSL очень близким к простому английскому или, что еще лучше, создать код для них с помощью простой формы. Думайте об этом, как о выпадающем списке для требований на английском языке, и когда ваш администратор выбирает требования, вы просто складываете его и создаете сценарий DSL. Я редактирую свой вопрос, чтобы представить еще более простой DSL, который ваши администраторы могут даже найти забавно писать :) – Spyros

+0

Мне не удалось получить доступ в Интернет, извините за пропущенный ответ. Я думаю, что DSL - отличный способ помочь разработчикам выразить эти взгляды. Меня все еще интересует реализация этой идеи. Эти новые достижения, например. созданные из веб-интерфейса, будут храниться в db. На ваш взгляд, лучший способ достичь этого? Я имею в виду, что в некотором роде столбцы базы данных должны быть сохранены. Я снова редактирую свой вопрос, чтобы быть более ясным. –

 Смежные вопросы

  • Нет связанных вопросов^_^