2008-11-07 6 views
9

Estaba pensando en agregar algunos Logros a nuestro sistema interno de registro de errores y cronometraje. Está conectado a un back-end de SQL Server.Técnicas para agregar logros al software de clase empresarial

Al principio pensé que el sistema podría ser ejecutado en la base de datos, el uso de disparadores para, por ejemplo, saber cuándo:

  • que haya iniciado sesión 1000 horas
  • creado 1.000 entradas
  • cerrados su propio boleto
  • trabajó en un boleto que no ha sido tocado por un tiempo.
  • etc (ya saben - cosas de bases de datos-ish)

Pero luego me di cuenta que yo también querría puramente LOGROS front-end

  • utilizan la búsqueda avanzada abiltiy
  • ordenados por una columna
  • restablecer la configuración predeterminada
  • buscar 500 veces

Parece que la lógica de cada logro debe estar codificada a mano. ¿Alguien podría imaginar un tipo de motor de reglas de logros , para el que, por ejemplo, cree scripts?

¿Y cómo almacenarlos? Si el logro es:

  • cambio columna de orden 50 veces en una sola sesión

eso implicaría que cada vez que ordenar una columna de vista de lista que se actualiza la base de datos.

¿Alguna idea sobre este problema de diseño de la aplicación Win32? No creo que el Gang of Four tenga un patrón de diseño de Logros.


Nota: Es una aplicación cliente de Win32, no un sitio web.


Definitivamente me gusta la idea de un sistema de eventos. Diversas acciones que el usuario toma pueden provocar eventos a través de un único objeto: concurso completo

protected void TimeEntriesListView_ColumnSort(object sender, EventArgs e) 
{ 
    _globalListener.RaiseEvent(EventType.ListViewColumnSort, sender, e); 
} 

protected void TimeEntriesListView_ColumnDrag(object sender, EventArgs e) 
{ 
    _globalListener.RaiseEvent(EventType.ListViewColumnDrag, sender, e); 
} 

Ese objeto puede entonces han añadido a la lógica para decidir qué eventos se quiere contar. Pero, de forma más razonable, varios oyentes de eventos pueden vincularse al oyente central de eventos y tener su lógica de logros personalizada.

Respuesta

5

El truco no es la codificación de las reglas, en realidad, esas son sencillas, y pueden ser expresiones simples (number_of_bugs> 1000).

El truco está en acumular las estadísticas. Debería ver una forma de Procesamiento de secuencia de eventos para registrar sus logros. Por ejemplo, realmente no desea implementar el logro "1000 errores" con "seleccionar recuento (*) de errores donde usuario =: usuario" todo el tiempo (podría hacerlo de esta manera, pero posiblemente no debería). Por el contrario, debería obtener un evento cada vez que publica un error, y el sistema de logros registra "encontrado otro error". Entonces la regla puede verificar el "number_of_bugs> 1000".

Obviamente, es posible que tenga que "cebar la bomba" por así decirlo, estableciendo el número de las fallas en el número actual en el DB cuando inicie el sistema de logro.

Pero el objetivo es mantener el procesamiento del evento real liviano, así que déjalo seguir los eventos a medida que avanzan con todos los eventos que se ejecutan en una tubería o bus interno común.

Un lenguaje de scripting es una buena idea también, ya que pueden evaluar fácilmente tanto expresiones como lógica más complicada. "number_of_bugs> 1000" es un programa Javascript perfectamente válido, por ejemplo. El juego simplemente está configurando el entorno.

También puede almacenar los scripts en el DB y crear un editor de "logros" para agregarlos sobre la marcha si lo desea, suponiendo que está capturando todos los eventos relevantes.

+0

Definitivamente me gusta la idea de un sistema de eventos. –

1

Los logros del backend deberían ser simples: parecen estar basados ​​en elementos ya rastreados. El front end, como bien dijiste, requerirá más seguimiento. Una forma en que puede querer hacer esto es implementar un motor de análisis para su sitio web front-end.

Piwik en http://www.piwik.org podría ayudar aquí - es un clon de Google Analytics, que usted aloja. La idea sería usar sus capacidades de registro para rastrear cuándo se ha completado un logro.

En cuanto a alguna forma de secuencia de comandos de las reglas, siempre tendrá que codificarlas a mano; quizás pueda simplificarlo creando su propio motor de scripts pequeño o implementando un conjunto de Lua personalizado.

+0

No es un sitio web, sino una aplicación de cliente Win32 completa –

1

Qué tal almacenar la consulta sql asociada con el logro en la base de datos, por lo que agregar un nuevo logro solo implicaría agregar el nombre y la consulta SQL para ello.

por ej.

has registrado 1000 horas - "select case sum (hours)> 1000 then 'true' else 'false' end from user where user_id =?"

Los logros basados ​​en UI tendrían que tener también los datos almacenados en el archivo db porque puede usar los mismos datos para otros logros en el futuro.

3

También estoy tratando de descubrir cómo crear un motor de reglas de logros.

Revisé los motores de reglas y cuáles son los conceptos básicos. Hay un good summary of that in wikipedia

Básicamente, o tiene un encadenamiento avanzado cuando, por ejemplo, comprueba la disponibilidad de algo; de lo contrario, usa las reglas Event Condition Action. Es el último que me llamó la atención.

Para que pueda predefinir un conjunto de eventos activados. En el motor, puede definir cuáles son las condiciones comprobadas que se basan en las métricas disponibles y especificar el logro de la asociación.

De esta forma parece más flexible, pero debe definir los eventos, las posibles verificaciones de estado y las métricas.

Por ejemplo, tendría varios eventos como TicketCreated activados en el código.

En el motor de reglas que podría tener algo como

Event: TicketCreated 
Condition: UserTicketCount >= 1000 
Achivement: "Created 1000 tickets" 

o para "restablecer la configuración por defecto"

Event: SettingsChanged 
Condition: Settings = DEFAULT 
Achievement: "Reset to Default" 

no he probado todavía, pero voy a bastante pronto. Es principalmente teórico por ahora.

1

Creo que hay una tabla para guardar cada evento que desea rastrear. Tal como "Realizó una búsqueda". Entonces, cada logro podría tener un SQL asociado.

A continuación, podría crear un disparador, sobre la mesa Evento, que compararía los logros que se aplican a ese evento, y añadir el logro a la mesa deLogro.

Éstos son los diseños de mesa rapidito:

EventItems: 
UserId, EventName, DateOccured, AnyOtherInfo 

AchievementQualifiers: 
Achievement Name, AchievementCheckSQL, EventsThisAppliesTo 
(Normalize this, if multiple events apply) 

en su sistema, tiempo de su web o Win32, sólo tiene que insertar en las EventItems mesa cada vez que el usuario hace algún evento que desea realizar un seguimiento. Podrías hacer una clase para manejar esto. Para eventos puramente tipo DB, como "Artículo publicado" o "Comentario publicado", podría hacer esto con un desencadenador en su lugar.

Luego, en los disparadores en EventItems, para cada AchievementQualifer que tiene que EventThisAppliesTo, ejecute la comprobación de SQL y actualizar una tabla deUserAchievement si es verdad y no se haya celebrado todavía.

Disculpe mi deletreo, ya que estoy escribiendo esto mientras estoy sentado en un pub cervecero.

+0

me gustó esta idea al principio. Pero algunos logros se basan en las interacciones de la UI (por ejemplo, clasificación de columnas, cambio de tamaño de columnas, reordenación de columnas) son cosas en una aplicación gráfica que no quiero ralentizar la IU con un hit de base de datos cada vez. Sería aún peor en la web, con Javascript haciendo cambios en una columna. Si se hace con un evento de base de datos cada vez, habría muchos eventos para escribir, lo que lo haría muy 'hablador'. Bah, es un acertijo. –

+0

En algún momento tengo que aceptar el acceso a la base de datos para acciones de UI. ¿Cómo sé que ha cambiado el tamaño de las columnas 500 veces hasta que guarde el contador de ejecución en algún lugar ... –

+0

... que me recuerda ... almacenar como eventos contados, no elementos de detalle. –

Cuestiones relacionadas