Maycol Romero
Felipe Vanegas
Juan Carlos Romero Marcano
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.
void CargarCursos() { /* inicializa cursos */ } IEnumerable<Alumno> CargarAlumnos() { throw new NotImplementedException(); } void CargarAsignaturas() { throw new NotImplementedException(); }
¿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.
foreach (var curso in escuela.Cursos) { var asignaturas = new List<Asignatura> { new Asignatura { Nombre = "Matemáticas" }, new Asignatura { Nombre = "Educación física" }, new Asignatura { Nombre = "Castellano" }, new Asignatura { Nombre = "Ciencias naturales" } }; curso.Asignaturas.AddRange(asignaturas); }
¿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.
using System.Linq; // necesario para consultas LINQ var 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 select new Alumno { Nombre = $"{n1} {n2} {a1}" }; return alumnos; // IEnumerable<Alumno> } var listaA = CargarAlumnos(); foreach (var curso in escuela.Cursos) { curso.Alumnos.AddRange(listaA); }
¿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.
Maycol Romero
Felipe Vanegas
Juan Carlos Romero Marcano
carlos ruales
Ariel Ayala
Ivan Ramos Sánchez
Javier Ignacio Caicedo Samboni
Marco Alexander Mateo Mateo
Manuel Sanchez
Daniel Alejandro Romero Chavez
Hector Alejandro Ramirez Huertas
César Augusto Xochimitl Pérez
Israel Yance
Wilson Alexander Caal Pacay
José Ortigas
Jefferson Pacheco Suárez
Samuel Rojas Rojas
Anibal Rojas
ProfesorIsaac Miranda Madrigal
Michael Sanchez
Fernando David Soto Betin
Diego Serrano
Alex Pacheco
Company_adminJonathan Jiménez Soveranes
Ricardo Pujol
Juan David Amaya Cardenas
Francisco Torregrosa Ros
Luis Abdel Rangel Castro
Leonardo Loayza
Victor Alfonso Bravo Garzón
lesier gg
Wilson Alejandro Gonzalez Gaitan
Jonathan Jiménez Soveranes
Arnold Josias Bertrand Mejia
Leonardo Loayza
YOAN STEINER HUACA VALDES
los nombres para que no tengan que descargar el archivo
string[] nombre1 = { "Alba", "Felipa", "Eusebio", "Farid", "Donald", "Alvaro", "Nicolás" }; string[] apellido1 = { "Ruiz", "Sarmiento", "Uribe", "Maduro", "Trump", "Toledo", "Herrera" }; string[] nombre2 = { "Freddy", "Anabel", "Rick", "Murty", "Silvana", "Diomedes", "Nicomedes", "Teodoro" };```
gente q le pone el alma
Tipo serio vale
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
Y luego reir 😄
x2
Para los que quieran cargar las asignaturas:
List<Asignatura> listaAsignaturas = new List<Asignatura>(){ new Asignatura{Nombre = "Matemáticas"}, new Asignatura{Nombre = "Educación Física"}, new Asignatura{Nombre = "Castellano"}, new Asignatura{Nombre = "Ciencias Naturales"} };
string[] nombre1 = { "Alba", "Felipa", "Eusebio", "Farid", "Donald", "Alvaro", "Nicolás" }; string[] apellido1 = { "Ruiz", "Sarmiento", "Uribe", "Maduro", "Trump", "Toledo", "Herrera" }; string[] nombre2 = { "Freddy", "Anabel", "Rick", "Murty", "Silvana", "Diomedes", "Nicomedes", "Teodoro" }; .```
Like =)
Entendí la referencia. :v
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 = new List<Alumno>(CargarAlumnos()); Escuela.Cursos = new List<Curso>{ new Curso() { Nombre = "101", Jornada = TiposJornada.Tarde, Alumnos = alumnos }, new Curso() { Nombre = "202", Jornada = TiposJornada.Mañana, Alumnos = alumnos }, new Curso() { 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í.
Escuela.Cursos = new List<Curso>{ new Curso() { Nombre = "101", Jornada = TiposJornada.Tarde, Alumnos = new List<Alumno>(CargarAlumnos()) }, new Curso() { Nombre = "202", Jornada = TiposJornada.Mañana, Alumnos = new List<Alumno>(CargarAlumnos()) }, new Curso() { Nombre = "301", Jornada = TiposJornada.Noche, Alumnos = new List<Alumno>(CargarAlumnos()) } }; ```
Espero que les guste.
Saludos.
Les recomiendo este modelo:
Cuando el profe dijo: "Nos vemos en un próximo...."
Amigos dejo mi solución
private void CargarEvaluaciones() { double number; Random rnd = new Random(); foreach (var cur in Escuela.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); var Evaluaciones = new Evaluaciones { Asignatura = asig.Nombre, Alumno = alu.Nombre, Nota = number, Trismestre = i + 1 }; } } } } }```
Excelente
Para generar aleatorios existen algo que es ramdom
<public static void generarAleaotorio() { Random rnd = new Random(); 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.
Si alguien tiene problemas al intentar hacer debug con breakpoints, puede probar descargar esto https://dotnet.microsoft.com/en-us/download/dotnet/2.1/runtime?cid=getdotnetcore
Minuto 1:16, que risa jajajaja!!!