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?
Creación de Entidades: Alumno, Asignatura y Evaluación en C#
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
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
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.
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.
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.
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.
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.
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.