Optimiza la inicialización de datos en C# aplicando responsabilidad única, extracción de métodos en Visual Studio Code y LINQ para generar alumnos mediante producto cartesiano. Verás cómo cargar cursos, asignaturas y alumnos de forma clara, evitando métodos gigantes, errores de implementación y IDs duplicados.
¿Cómo refactorizar métodos largos en C# con responsabilidad única?
Dividir tareas grandes en piezas pequeñas hace el código más legible y mantenible. Si un método supera ~50 líneas, conviene separarlo. Con el bombillito de VS Code puedes extraer método: son sugerencias, no correcciones, que aceleran el trabajo.
Un método o clase debe tener una sola responsabilidad.
Usa Control + punto para extraer método rápidamente.
¿Cómo cargar asignaturas a cada curso de forma segura?
Las asignaturas base son: Matemáticas, Educación física, Castellano y Ciencias naturales. Se agregan a cada curso con una lista nueva por curso para evitar IDs compartidos.
Crea la lista de asignaturas dentro del bucle por curso.
Usa AddRange sobre la colección de asignaturas del curso.
Evita construir una única lista fuera del bucle: duplicaría el mismo unique ID por asignatura en todos los cursos.
foreach(var curso in escuela.Cursos){var asignaturas =newList<Asignatura>{newAsignatura{ Nombre ="Matemáticas"},newAsignatura{ Nombre ="Educación física"},newAsignatura{ Nombre ="Castellano"},newAsignatura{ Nombre ="Ciencias naturales"}}; curso.Asignaturas.AddRange(asignaturas);}
Idea clave: instancias nuevas por curso evitan conflictos con el unique ID.
Beneficio: código simple, claro y sin efectos colaterales.
¿Cómo generar alumnos con combinatoria usando LINQ?
En lugar de foreach anidados para la combinatoria de nombres, usa el lenguaje integrado de consultas, LINQ, de forma declarativa como en SQL con select y from.
Arreglos de ejemplo: nombres, segundos nombres y apellidos.
Producto cartesiano con LINQ para combinar todo contra todo.
Retorna un IEnumerable<Alumno> y asígnalo a cada curso con AddRange.
usingSystem.Linq;// necesario para consultas LINQvar nombres1 =new[]{"Alba","Felipa","Eusebio","Farid","Donald","Álvaro","Nicolás"};var nombres2 =new[]{"Freddy","Anabel","Rick and Morty","Silvana","Diomedes","Nicomedes","Teodoro"};var apellidos =new[]{"Ruiz","Sarmiento","Uribe","Maduro","Trump","Toledo","Herrera"};IEnumerable<Alumno>CargarAlumnos(){var alumnos =from n1 in nombres1
from n2 in nombres2
from a1 in apellidos
selectnewAlumno{ Nombre =$"{n1}{n2}{a1}"};return alumnos;// IEnumerable<Alumno>}var listaA =CargarAlumnos();foreach(var curso in escuela.Cursos){ curso.Alumnos.AddRange(listaA);}
Declarativo con LINQ: menos código y mayor expresividad que foreach anidados.
Conceptos clave: producto cartesiano, select, from, where (cuando aplique).
Si aparece error de patrón de consulta: agrega using System.Linq.
¿Te gustaría ver variantes con filtros o límites sobre la combinatoria, o proponer tus propios conjuntos de nombres? Comparte tus ideas y dudas en los comentarios.
Tip 💡.
Hace tiempo tuve la oportunidad de asistir a unas clases de C# en donde nos enseñaron pequeños trucos de optimización de código. El tip es este:
Las listas son una clase que por dentro tienen implementadas interfaces, en este caso la clase List tiene implementada la interfaz IEnumerable. Es por ello que podemos devolver este tipo de dato en la función CargarAlumnos.
La cuestión es: ¿Por qué devolvemos un IEnumerable en vez de un List de alumnos? La respuesta sería: si NO es necesario hacer operaciones con la lista, como añadir nuevos elementos, borrar, etc. Lo ideal es trabajar con IEnumerable ya que este no tiene cargada toda una estructura de una clase, por lo cual se ahorra toda la carga de funciones que NO serán usados. Ahora, si necesitamos seguir haciendo operaciones con la lista deberiamos devolver un tipo de dato List.
Interesante tip, gracias por tu aporte Carlos.
Gracias, yo lo hacía indistintamente
Diagrama de clases del proyecto de la Escuela, solo lo realicé como lo entendí, y no le puse las funciones/métodos como para dejar al libre análisis y comentarios constructivos para mejora del mismo.
¡Muchas gracias!
Genial Bro, la ayuda visual ayuda bastante
No pude evitar decir “QUE?!” en el min 1:15 y luego reir
No entiendo por que en este curso se saltaron una parte en donde el profesor incluyo en el código cosas, es cierto que si te vas a los archivos están los cambios pero.... Para mi no es clara esta parte del curso y mas si estas aprendiendo los fundamentos.
PLATZI ES GENIAL.
Pero....
Equipo de platzi por favor prestar atención a este tipo de cosas.
Muchas gracias por tu feedback, ya lo regustramos y vamos a estar pendientes de que esto se mejore no solo en la próxima versión de este curso, sino de todos los cursos. Constantemente estamos trabajando para mejorar nuestra metodología.
A mí tampoco me agradó eso. Hizo bastantes cambios importantes y ni tan siquiera los mostró bien. Es la primera vez que me pasa en Platzi.
En que parte se creo Alumno.cs, Asignatura.cs, Evaluaciones.cs que no los vi?.
Seguramente por efectos de tiempo y para no alargar el vídeo las creo internamente, de igual manera la creación de estas clases es igual a la ya vista.
hola por alguna razon que se me escapa no me quiere reconocer la clase asignaturas y la estoy creando como todas las demas clases alguien me ayuda con esto ?
Si un método tiene más de 50 líneas significa que está mal diseñado, cada método debe tener una sola responsabilidad.
Listo, nos vemos en un próximo curso!
Me cae demasiado bien Juan Carlos! muchas gracias por el curso
El producto cartesiano revela una relación de orden entre dos conjuntos, constituyéndose como un tercer conjunto.
El producto cartesiano de un conjunto A y de un conjunto B es el conjunto constituido por la totalidad de los pares ordenados que tienen un primer componente en A y un segundo componente en B.
Se puede optimizar el código mas evitando tener que hacer el foreach para cargar los alumnos si cuando creamos los cursos lo hacemos al mismo tiempo
List<Alumno> alumnos =newList<Alumno>(CargarAlumnos());Escuela.Cursos=newList<Curso>{newCurso(){Nombre="101",Jornada=TiposJornada.Tarde,Alumnos= alumnos
},newCurso(){Nombre="202",Jornada=TiposJornada.Mañana,Alumnos= alumnos
},newCurso(){Nombre="301",Jornada=TiposJornada.Noche,Alumnos= alumnos
}};```
Si se quiere hacer la creación de alumnos cada vez que se crea el curso solo hay que hacerlo así.
Cuando el profe dijo: "Nos vemos en un próximo...."
Amigos dejo mi solución
privatevoidCargarEvaluaciones(){ double number;Random rnd =newRandom();foreach(var cur inEscuela.Curso){foreach(var alu in cur.Alumnos){foreach(var asig in cur.Asignaturas){for(int i =0; i <5; i++){ number = rnd.NextDouble(); number =Math.Round(number *5,1);varEvaluaciones=newEvaluaciones{Asignatura= asig.Nombre,Alumno= alu.Nombre,Nota= number,Trismestre= i +1};}}}}}```
Excelente
Para generar aleatorios existen algo que es ramdom
<publicstaticvoidgenerarAleaotorio(){Random rnd =newRandom(); int month = rnd.Next(1,13);Console.WriteLine(month);}>
Alguna vez en un proyecto vi Linq sin saber que era, ahora ya lo sé, gracias!
Una clase y un método solo pueden tener una responsabilidad, eso es parte de los principios SOLID, el principio de responsabilidad única. Para cuando se termine el curso pueden darle una ojeada a esos principios SOLID.