2012-02-27 2 views
2

그런 다음 웹 응용 프로그램에서 일종의 업적을 구현하는 순간이 왔습니다. 이 질문에 설명 된 계층 구조와 비슷한 아이디어가 있습니다. How to implement an achievement system in RoR.rails achievements

우리가 작업하고있는 응용 프로그램은 소프트웨어 개발자없이 외부에서 관리하려는 서비스로서의 소프트웨어입니다. 웹 인터페이스를 통해 소프트웨어 관리자가 새로운 종류의 업적 런타임을 생성 할 수 있어야합니다. 그런 다음 계층 구조가 벽이됩니다.

나는 유한 상태 기계를 통해이 상황을 구현할 수있는 곳을 읽었지 만, 현재이 주제에 관한 충분한 정보가 없습니다.

편집 : 특정 질문

내가이 충족되어야 할 조건 목록과 성과 클래스를 모델링에 대해 생각했다. 이 기본 클래스 성취에는 모든 조건이 유효한지 재귀 적으로 검사하는 부울 값이 있습니다. 그런 다음 조건은 하드 코드 된 클래스가 될 수 있습니다. 시스템 관리자는의 조합으로 새로운 종류의 업적을 만듭니다.

내 두려움은 원자 조건에 대한 클래스 수가 늘어나는 것입니다. 프로젝트에서 30+ 조건 클래스를 갖고 싶지 않습니다. 모든 조언 정말 감사합니다.

편집 : SpyrosP 응답에서 구현

에 대한 자세한 내용은, 그것은 설명 DSL을 구축하는 것이 좋습니다 보인다. 어떤면에서는 업적을 데이터베이스에 저장해야합니다. 같은 예제를 유지 :

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

검사 할 조건 (들)을 저장하는 테이블이 있어야 dinamically 성과를 생성하기 위해 :

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과 같은 상태 시스템 플러그인을 사용하는 것이 좋습니다. 그러나, 나는 이것이 성취도 기능에 너무 많은 것이라고 생각한다.

복잡한 시나리오에 직면해야한다면 성취도의 동작을 정의하는 간단한 DSL을 만들 수 있습니다. 다음과 같음 :

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

아이디어가 있습니다. 이것은 성취를 완전히 묘사하는 방법이 될 것입니다. 그러면 관찰자는 업적 달성 여부를 확인하기 위해 achievement.rb 클래스 시나리오를 사용할 수 있습니다. CanCan의 작동 방식을 생각해보십시오. 이것은 관리자가 위의 예제에서 제시 한 것보다 간단한 DSL을 통해 간단한 업적 요구 사항을 작성할 수있는 좋은 방법이기도합니다.조금 도움이, 또는 적어도 당신에게 몇 가지 아이디어를 :) 제공

희망

편집 : 사람들이 심지어와 시나리오를 작성하실 수 있도록

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은 개발자가 이러한 목표를 표현하는 데 도움이되는 좋은 방법이라고 생각합니다. 나는 아직도이 아이디어의 구현에 대해 궁금해합니다. 이러한 새로운 업적 (예 : 웹 인터페이스에서 생성 된 데이터베이스에 저장됩니다. 귀하의 의견에 그것을 달성하는 가장 좋은 방법은 무엇입니까? 어떤면에서는 데이터베이스 열을 저장해야합니다. 다시 질문을 편집 중입니다. –