-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proyecto de Claudia y Roger #34
Comments
Consideraciones generalesEl A continuación les dejaré algunas de las principales preguntas que me fueron surgiendo a medida que fui revisando el proyecto: Jerarquía de clases
Console App
ConclusionesEl proyecto está poco intuitivo, el nombre de variables, métodos, clases no ayudan mucho. No queda claro cual es el flujo de ejecución del programa, ni el objetivo que cumplen muchas clases de la jerarquía. Se me quedaron muchas otras dudas respecto a las decisiones de diseño que tomaron, pero no me gustaría dar una opinión sin antes entender a profundidad las ideas principales que están detrás de cada clase o método que no están documentados. Por último el juego tiene pocas abstracciones, tiene como aspecto configurable el Max de Token con las opciones de |
Dependencia de los colores hacia los jugadoresAnteriormente el color con el que un jugador, así como sus fichas, se iban a mostrar mediante la interfaz gráfica, era una propiedad más de la clase jugador. Este atributo, solo relacionado con la aplicación de consola no debería estar atado al jugador. Por ello hemos eliminado la dependencia dando a la consola la tarea de crear un diccionario con una relación de jugador-color. Hemos definido un método en la clase Utils.cs que asigna los colores y devuelve el diccionario correspondiente. Interface IPlayAhora surge esta interfaz con el objetivo de abstraer el concepto de qué constituye una jugada. Una jugada puede ser tanto una ficha que se juega en la mesa, como un pase de un jugador sin opciones de jugada válida. De esta manera se elimina la relación de herencia que tenía la clase Pass de la clase Token_onBoard. Menos responsabilidadLa clase Board tenía un método llamado Start() que se encargaba de hacer el recorrido de lo que significa una ronda del juego de Domino, así como mostrar las jugadas mientras se ejecutaba la partida. Para simplificar un poco las responsabilidades, el método se separa en dos partes: una para controlar el juego, y la otra dedicada por completo a la elección de las jugadas por los jugadores. La primera en Start(), y la segunda en GetPlay(). Inner Selector JudgmentCon un delegado abstraemos el criterio con que se elige el jugador que va a comenzar jugando en una partida. Quedan definidos en el archivo InnerPlayer.cs.
Las diferentes implementaciones actuales son: Random:De manera aleatoria se decide cual de los jugadores en mesa será el primero en colocar una de sus fichas al inicio de cada partida. Bigger Token:Si eres uno de los jugadores de los cuales no le gusta la ficha doble-9, la cual de seguro conoces como "la gorda", tendrás la oportunidad de ser el iniciador del juego y poder deshacerte de ella rápidamente. En cuanto a código, lo que hacemos es recorrer cada una de las fichas de cada jugador para ver cual de ellos posee la ficha con mayor puntuación. Ojo, no tiene por qué ser el doble-9, todo depende de a cual doble máximo se esté jugando y las fichas que hayan sido repartidas. Min Double:Esta variación del juego es muy semejante a la anterior, con la diferencia de que al iterar por cada una de las fichas de los jugadores, el jugador seleccionado para ser el iniciador del juego será aquel que tenga en su poder el menor doble entre las fichas repartidas a los jugadores. En caso de no exisitir dobles en mesa, o sea, que ningun jugador tenga en su mano una ficha de esta característica, lo cual es muy poco probable, el iniciador del juego será elegido de forma aleatoria. Max Data:Hemos querido que el iniciador del juego también pueda ser aquel que tiene la "mejor data", o sea, la mayor cantidad de caras repetidas entre las fichas de su mano. Para la implementación, como nuestro delegado solo recibe un diccionario con los jugadores y sus fichas asignadas, tuvimos que auxiliarnos de dos métodos extras:
Para acoplar esta nueva funcionalidad al juego fue necesario incluir nuevo código en nuestro programa. Comenzando desde el inicio, creamos un nuevo método InnerSelectorMenu() que será ejecutado en el menú de personalización del juego, este se encarga de mostrar las opciones y permite al usuario elegir una. La opción elegida ahora va a ser una nueva propiedad de la clase Judge, a través de la cual llegará a la clase Board, en cuyo constructor se ejecutará el delegado. También fue necesario instanciar el delegado el los métodos donde se cargan las plantillas por defecto. Por otra parte tuvimos la necesidad de crear un nuevo método en la clase CircularList, llamado RotateTill(), cuyo funcionamiento es: dada una instancia de CircularList y un elemento de la misma (pasado como parámetro), rota todos los elementos de manera que el elemento que recibe como parámetro, ahora sea el primero en la estructura de dato. Lapse:La clase Lapse fue reemplazada por un método en la clase Utils con el mismo funcionamiento. No tenía la complejidad suficiente para estar en una clase. Por eso se simplificó en un método. |
Consideraciones generalesPartiendo de esta interface: public interface IGame
{
GameResult Start();
void SetGamePrinter(GamePrinter gamePrinter);
} Según esta interface sus responsabilidades serían:
Observaciones
|
Desacoplamiento:Dada la dependencia que existía entre las clases Board y Tournament con la visualización del juego durante la ejecución, hemos desacoplado las responsabilidades de las mismas, lo cual implicó la reestructuración de una parte de la jerarquía en la librería de clases. Las responsabilidades de impresión de los resultados pasan ahora a estar por completo en la aplicación de consola. De esta manera se puede ejecutar una partida sin que necesariamente esta se muestre. La clase Board deja de existir y ahora surge la clase Round, como la encargada de la ejecución de una ronda de juego de domino, mientras que Tournament se adapta a los cambios pero manteniendo su objetivo. ¿Cómo lograrlo? Para ello se redefine la interface IGame con un único método:
De esta manera las clases que la implementen van a tener este método que se encarga de devolver estados concretos del juego en cada momento. Utilizando yield return logramos obtener estos estados de forma Lazy. Los estados de juego de los IGame quedan definidos en la clase GameStatus.cs. A través de los GameStatus, la aplicación de consola recorre el juego y muestra al usuario la información necesaria para la visualización del juego. Otros cambios:Como consecuencia del desacoplamiento muchas clases de la jerarquía y métodos fueron modificados.
Dada la dimensión de los cambios, tuvimos que reescribir una parte de la información del Reporte, donde quedan explicadas las nuevas características e implementaciones de nuestro proyecto "Dommie", así como otras funcionalidades implementadas que antes no quedaron detalladas. |
Modifique las líneas siguientes con los detalles relevantes:
Equipo
Proyecto
Checklist
(Esta lista es para el mentor. Hasta que no estén chequeados estos elementos no se procederá a la evaluación en persona.)
Básicos
Readme.md
no vacío.Readme.md
.Funcionalidades
Ingeniería de Software
Documentación
Revisión
Fecha prevista: 2020/XX/XX
Comentarios
(Para rellenar por el mentor)
The text was updated successfully, but these errors were encountered: