Creación de Entidades: Alumno, Asignatura y Evaluación en C#
Resumen
Modela un sistema escolar en C# con entidades claras, relaciones útiles y buenas prácticas: GUID para identificadores únicos, propiedades autoimplementadas y listas genéricas para componer cursos, alumnos y evaluaciones. Verás decisiones de diseño reales y recomendaciones de tipos numéricos para notas, con ejemplos listos para ampliar.
¿Cómo organizar entidades con guid y constructor?
Crear entidades base con Unique ID y nombre asegura trazabilidad. Se definieron las clases Alumno, Asignatura y Evaluaciones con un GUID generado solo en el constructor, evitando asignaciones externas y garantizando unicidad. Se verificó el comportamiento con un punto de interrupción en School Engine y ejecución en debug, confirmando que el GUID se asigna correctamente.
Identificador único con GUID generado en el constructor.
Nombre como dato descriptivo principal.
Asignación controlada: el ID solo se asigna en el constructor.
Verificación con punto de interrupción en debug.
Ejemplo de Alumno en C#:
ausing System;namespaceCoreEscuela.Entidades{publicclassAlumno{publicstring Nombre {get;set;}publicGuid Id {get;privateset;}publicAlumno(){ Id = Guid.NewGuid();}}}
¿Qué buenas prácticas aplicar en archivos y nombres?
En C# no es obligatorio que el archivo se llame como la clase.
En Java sí es obligatorio: renombrar es buena práctica.
Se puede tener varias clases en un mismo archivo en C#.
Mantener consistencia facilita mantenimiento y búsqueda.
¿Qué relaciones definen curso, asignatura y alumno?
Un curso requiere más que identificador y nombre. Además de la jornada, un curso mantiene listas genéricas de Asignaturas y de Alumnos con propiedades autoimplementadas. Para las colecciones se usa using System.Collections.Generic.
Curso con Unique ID, nombre y jornada.
Lista de Asignaturas que se ven en el curso.
Lista de Alumnos inscritos en el curso.
Uso de List con get y set.
Ejemplo de Curso:
usingSystem;usingSystem.Collections.Generic;namespaceCoreEscuela.Entidades{publicclassCurso{publicGuid Id {get;privateset;}publicstring Nombre {get;set;}publicstring Jornada {get;set;}publicList<Asignatura> Asignaturas {get;set;}=newList<Asignatura>();publicList<Alumno> Alumnos {get;set;}=newList<Alumno>();publicCurso(){ Id = Guid.NewGuid();}}}
¿Cómo decidir la pertenencia de evaluaciones?
Hay dos caminos de diseño: poner en Evaluaciones una referencia a Asignatura y Alumno, o que Asignatura mantenga una lista de evaluaciones. Ambas son válidas. Para avanzar pronto, se optó por registrar desde la evaluación a qué Asignatura pertenece y quién es el Alumno que la presenta.
Referencia de Evaluaciones a Alumno.
Referencia de Evaluaciones a Asignatura.
Decisión basada en el modelo de datos que se quiera manejar.
¿Cómo modelar evaluaciones y notas con precisión?
La evaluación tiene Unique ID, nombre, el Alumno que la presenta, la Asignatura correspondiente y la nota. La nota no puede ser entera si hay decimales, por eso se evaluaron tipos numéricos: float, double y decimal. Recomendación general actual: usar double. Para casos financieros con alta precisión, usar decimal. Aquí se deja en float por simplicidad.
Entero: sin decimales, no apto para notas con coma.
Float: maneja decimales, precisión moderada.
Double: recomendado hoy para cálculos generales.
Decimal: recomendado en finanzas por su alta precisión.
Ejemplo de Evaluaciones:
usingSystem;namespaceCoreEscuela.Entidades{publicclassEvaluaciones{publicGuid Id {get;privateset;}publicstring Nombre {get;set;}publicAlumno Alumno {get;set;}publicAsignatura Asignatura {get;set;}publicfloat Nota {get;set;}publicEvaluaciones(){ Id = Guid.NewGuid();}}}
¿Qué sigue en el motor de datos?
El siguiente paso es el engine de carga: crear para cada curso sus Asignaturas, registrar sus Alumnos y luego generar Evaluaciones ligadas a una Asignatura y a un Alumno. Así se completa el flujo de datos para operar y probar.
Cargar Asignaturas por curso.
Cargar Alumnos por curso.
Crear Evaluaciones con referencia a Asignatura y Alumno.
Probar y validar en debug con punto de interrupción.
¿Te gustaría comentar cómo modelarías la relación de evaluaciones según tu contexto o qué tipo numérico prefieres para notas?
Algo que podríamos hacer para evitar duplicidad y favorecer la reutilización de código, es aplicar herencia. Id y Nombre, son dos propiedades que están en muchos objetos del sistema. Podríamos sacarlos, en una clase padre, y que las demás clases hereden de esta clase padre sus propiedades.
Excelente aporte! Es extraño que en este punto, el profe no lo haya implementado
Recomiendaria que encapsulases el metodo set del UniqueId con internal, es lo más parecido a que solo las clases que estan dentro de este namespace puedan setear ese valor ya que si lo dejas en private no vas a poder setarlo en las clases hijas
Yo deje el nombre de todas mis clases en singular.
Depende de la convencion que maneja el lenguaje
Same
Opino igual, la forma en la que esta llevando el curso es genial, vas armando el proyecto poco a poco. Excelente
De acuerdo
Muy bien guiado el curso con este proyecto implementando cada cosa que se requiere y se va aprendiendo aplicando los conocimientos
En esta clase se creará más entidades para seguir con el desarrollo de nuestro proyecto:
Alumno
Asignatura
Evaluaciones
Para cada una de las entidades nuevas se definió que deberá tener un ID único , ejemplo de la entidad Alumno.
using System;namespace CoreEscuela.Entidades{publicclassAlumno{public string Nombre{get;set;}public string UniqueId{get;set;}publicAlumno(){UniqueId=Guid.NewGuid().ToString();}}}
Además en Curso se agregaron dos campos más que son la de:
Asignatura de ese curso
Alumno para ese curso
En evaluación:
Alumno que da la evaluación
La asignatura de esa evaluación
La calificacion / nota de esa evaluación
Lo correcto era que hubiera creado una clase en singular llamada Evaluacion y en la asignatura tener una propiedad Evaluaciones = new List<Evaluacion>
Definitivamente el mejor profesor de Platzi.
Mejor dicho, este señor es un maestro.
Para la industria el tipo de dato más recomendable es decimal
Hola, que es una entidad?
Persona, organización, tipo de objeto o concepto sobre los que se almacena información.
Por ejemplo, una clase, se podria considerar una entidad, una tabla de una base de datos, se podría considerar una entidad
¿La palabra asignatura no es sinónimo de curso?
Hola
Se puede utilizar como sinónimo, aunque la asignatura está más relacionada a las materias que se integran en una carrera universitaria. Un curso puede variar mucho en su duración durando generalmente algunas horas. En cambio una asignatura tiene una duración de meses.
¿Qué opinas tú?
Los cursos son los salones de las escuela en este caso. Las asignaturas, como te había dicho compañero, son las materias, como matemáticas, literatura, etc. Los cursos generalmente son nombrados con números y de acuerdo al nivel en que se encuentra; por ejemplo donde estudié el primer salón del primer nivel es el 101, mientras el primer curso del segundo nivel o piso es el 201.
Tengo una confusion sobre como plasmar un modelo de datos en clases y atributos, ¿algun compañero me podría proporcionar mas informacion?
Lo que pasa amigo, es que el curso es bueno en unas partes y malo en otras, por ejemplo para llegar a éste punto creo que se debió de haber explicado que es abstracción y el proceso de abstracción para crear/modelar objetos, es uno de los pilares de la POO no se si se explique más adelante, también puedes leer un poco de modelado de datos con UML hace muchos años cuando aprendí a programar antes de dar la primera línea de código me enseñaron a imaginarme los objetos a entidades/objetos, pasarlos a diagramas y luego ya a lo que es una clase (template).
Mira, creo que éste curso que también está aquí en platzi te puede aclarar ese proceso https://platzi.com/clases/oop/
le eché un ojo y con que veas los primeros 3 módulos creo que te servirá de mucho.
Va mejorando en cada clase
Genial, :V :) cada dia me gusta mas este lenguaje
Quiero aportar dos diagramas del proyecto CoreEscuela.
Me ayudo mucho para entender la relacion entre clases.
Es como ver desde arriba lo que estoy haciendo, espero aportar algo que les pueda servir.
Me surge una duda:
No seria mejor agregar como propiedad los objetos en EscuelaEngine y luego cargar los datos a traves de los metodos?
Me confunde que asignemos valores a otro objetos mediante otros objetos.
Profesor tengo una inquietud con respecto a las convenciones del lenguaje C#.
Cuando se nombre las carpetas para las clases, digamos el caso de Service.
En C# la convención de nombramiento de la carpeta sería en plural o singular? (Services o Service).
De igual forma, para las clases ¿Cómo aplicaría?
Muchas gracias.
porque se demora mucho al depuración del código???
Es por que al momento de la depuración usa mas recursos del computador
Eso depende del computador en el que trabajas !!!
una pregunta, porque a veces las variables pueden ser declaradas como public Alumno y otras como List<Alumno> cual es la diferencia y porque algunas si se hacen de una manera y otras no?
Las listas se usan cuando tengo varios elementos, una escuela tiene varios cursos.
La otra opción es cuando solo es uno, por ejemplo Un alumno solo tiene una Escuela.
NO hay comentarios? O_O
son tantos consejos de modelado que nos quedamos sin palabras jeje. Muy útil saber como estructura su programa alguien profesional aunque sea a nivel introductorio
Pues, yo si pongo mis comentarios. En todos los cursos de programación (y también proyectos) que hago pongo comentarios, quizá para recordarme la próxima vez que lo vaya a usar, como también para "reafirmar" lo aprendido de modo escrito.