Solo para mantener las cosas interesantes y cerrar mi última pregunta abierta, la solución que implementa la siguiente funcionalidad de una manera muy organizada con una arquitectura decente obtiene una buena recompensa. El código completo está en jsfiddle, y no dude en hacer cualquier pregunta :)¿Cómo organizarías una aplicación web compleja grande (mira el ejemplo básico)?
¿Cómo se suelen organizar aplicaciones web complejas que son extremadamente ricas en el lado del cliente? He creado un ejemplo artificial para indicar el tipo de desastre en el que es fácil entrar si las cosas no se gestionan bien para las aplicaciones grandes. Siéntase libre de modificar/ampliar este ejemplo como desee - http://jsfiddle.net/NHyLC/1/
El ejemplo básicamente espejos parte de la publicación de comentarios en SO y sigue las siguientes reglas:
- Debe tener 15 caracteres como mínimo, después de múltiples los espacios se recortan en uno.
- Si se hace clic en
Add Comment
, pero el tamaño es inferior a 15 después de eliminar espacios múltiples, a continuación, muestra una ventana emergente con el error. - Indique la cantidad de caracteres restantes y resumen con codificación de color. Gris indica un comentario pequeño de , marrón indica un comentario medio , naranja un gran comentario , y un desbordamiento de comentario rojo.
- Un comentario solo puede enviarse cada 15 segundos. Si el comentario es enviado demasiado pronto, muestre una ventana emergente con el mensaje de error apropiado.
Un par de cuestiones que noté con este ejemplo.
- Esto debería ser idealmente un widget o algún tipo de funcionalidad empaquetada.
- Cosas como un comentario por 15 segundos, y un mínimo de 15 comentarios de caracteres pertenecen a algunas políticas de aplicación amplia en lugar de estar incrustado dentro de cada widget.
- Demasiados valores codificados.
- Sin organización de código. Modelo, Vistas, Controladores están todos juntos. No es que MVC sea el único enfoque para organizar aplicaciones web ricas del lado del cliente, pero no hay ninguna en este ejemplo.
¿Cómo harías para limpiar esto? ¿Aplicando un pequeño MVC/MVP en el camino?
Aquí hay algunas de las funciones relevantes, pero tendrá más sentido si viste el código completo en jsFiddle:
/**
* Handle comment change.
* Update character count.
* Indicate progress
*/
function handleCommentUpdate(comment) {
var status = $('.comment-status');
status.text(getStatusText(comment));
status.removeClass('mild spicy hot sizzling');
status.addClass(getStatusClass(comment));
}
/**
* Is the comment valid for submission
* But first, check if it's all good.
*/
function commentSubmittable(comment) {
var notTooSoon = !isTooSoon();
var notEmpty = !isEmpty(comment);
var hasEnoughCharacters = !isTooShort(comment);
return notTooSoon && notEmpty && hasEnoughCharacters;
}
/**
* Submit comment.
* But first, check if it's all good!
*/
$('.add-comment').click(function() {
var comment = $('.comment-box').val();
// submit comment, fake ajax call
if(commentSubmittable(comment)) {
..
}
// show a popup if comment is mostly spaces
if(isTooShort(comment)) {
if(comment.length < 15) {
// blink status message
}
else {
popup("Comment must be at least 15 characters in length.");
}
}
// show a popup is comment submitted too soon
else if(isTooSoon()) {
popup("Only 1 comment allowed per 15 seconds.");
}
});
Edición 1:
@matpol Gracias por la sugerencia para una objeto envoltorio y complemento. Eso realmente será una gran mejora sobre el desastre existente. Sin embargo, el complemento no es independiente y, como mencioné, sería parte de una aplicación compleja más grande. Las políticas de aplicación amplia en el lado del cliente/servidor dictarían cosas como la duración mínima/máxima de un comentario, la frecuencia con la que un usuario puede comentar, etc. Seguramente el complemento puede ser alimentado con esta información como parámetros.
Además, para una aplicación de cliente enriquecida, los datos deberían separarse de su representación html, ya que se pueden guardar muchos viajes de ida y vuelta del servidor ya que la aplicación es compatible con datos y se pueden almacenar localmente, y periódicamente actualizado en el servidor, o en eventos interesantes dentro de la propia aplicación (como cuando la ventana está cerrada). He aquí por qué realmente no me gusta el enfoque de un plugin. Funcionaría como proporcionar una representación empaquetada, pero aún estaría centrada en el DOM, lo que será problemático cuando tenga 20 de estos complementos en la aplicación, lo que no es un número absurdo de ninguna manera.
Puede considerar el cambio de nombre de la pregunta para expresar más detalles o intenciones, solo un pensamiento. –
¡Buena idea Mike! el título no es muy indicativo de la pregunta. Déjame reformularlo. – Anurag
¿Está imponiendo la misma validación en el servidor? Si es así, tiene mucho sentido que los dos compartan una interfaz común. Dependiendo del idioma/framework del servidor/etc., eso puede dictar cómo está organizado el lado del cliente (o viceversa). – tadamson