Mejora el rendimiento y la claridad del código en C# al controlar qué objetos cargar, evitar sobrecarga innecesaria y devolver múltiples valores con precisión. Con parámetros opcionales, tuplas y parámetros de salida, se logra un método flexible que ahorra memoria y tiempo de ejecución sin perder trazabilidad en el depurador.
¿Cómo controlar qué objetos cargar con parámetros opcionales?
La idea central es hacer granular la carga de datos de la escuela: evaluaciones, alumnos, asignaturas y cursos. Se parte de una sobrecarga existente y se evoluciona hacia una sola firma con parámetros opcionales booleanos que por defecto son verdaderos. Así, se evita la duplicación y se gana flexibilidad.
Mejor rendimiento: no se cargan objetos que no se necesitan.
Código base con parámetros opcionales y lógica condicional:
List<ObjetoEscuela>GetObjetosEscuela(bool traerEvaluaciones =true,bool traerAlumnos =true,bool traerAsignaturas =true,bool traerCursos =true){var lista =newList<ObjetoEscuela>(); lista.Add(escuela);// escuela siempre.if(traerCursos){ lista.AddRange(escuela.Cursos);foreach(var curso in escuela.Cursos){if(traerAsignaturas) lista.AddRange(curso.Asignaturas);// Si no traigo alumnos pero sí evaluaciones, igual recorro alumnos.if(traerAlumnos || traerEvaluaciones){foreach(var alumno in curso.Alumnos){if(traerAlumnos) lista.Add(alumno);if(traerEvaluaciones) lista.AddRange(alumno.Evaluaciones);}}}}return lista;}
¿Qué ventaja ofrecen los parámetros opcionales?
Una sola firma en lugar de múltiples sobrecargas.
Llamadas más legibles y flexibles.
Menos objetos en memoria cuando no se requieren.
¿Cómo se verifica el resultado con el depurador?
Con todo activado: la lista mostró 1622 objetos cargados, incluyendo evaluaciones.
Sin evaluaciones: el resultado bajó a 88 objetos.
Todo en false: se obtuvo 1 objeto: la escuela Platzi Academy.
¿Qué pasa si no traigo alumnos pero sí evaluaciones?
No se agregan alumnos a la lista.
Se recorre cada curso y sus alumnos para sumar o agregar evaluaciones.
La lógica de negocio se mantiene sin poblar entidades innecesarias.
¿Cómo devolver múltiples valores: tuplas o parámetros de salida?
Se exploran dos enfoques para conocer cuántos elementos se cargan por tipo. Primero, una tupla que devuelve la lista y el conteo de evaluaciones. Luego, parámetros de salida para obtener todos los conteos: evaluaciones, asignaturas, alumnos y cursos.
¿Cómo usar tuplas para lista y conteo?
Se acumula el conteoEvaluaciones sumando alumno.Evaluaciones.Count.
Próximo objetivo: diccionario de datos con una enumeración para clasificar objetos.
¿Qué se anticipa con enumeración y diccionario de datos?
Se prepara la creación de un diccionario de datos basado en una enumeración para clasificar y acceder a colecciones por tipo. Este enfoque facilita consultas específicas y organiza la estructura de datos para escenarios de lógica compleja.
¿Te gustaría sugerir casos de uso para los conteos o proponer la estructura de la enumeración? Comparte tus ideas en los comentarios.
Los parametros de salida no son más que una sintaxis bonita para el paso por referencia en C ¿Verdad?
Muy cierto tu comentario.
Me parece que sí, en C se usa el puntero a la variable y la manipulas dentro de la función y ya no estas forzado a retornar una sola cosa en tu función.
Sobrecarga de métodos: Definimos dos métodos con el mismo nombre pero con diferentes parámetros para diferentes funcionalidades.
Parámetros opcionales: Brindan un valor predeterminado a los parámetros lo que permite que sea opcional la asignacion de parametros al inicializar el método. Recordar que para luego asignar valores a parámetros opcionales se debe poner por ejemplo (nombredeparametro:false)
Tuplas return: Si necesitamos que nuestro método devuelva dos valores o mas en return podemos usar tuplas. Para definir el método lo definimos de tipo “ (int, string) “y para que nos devuelva el valor “ (variableentera, variablestring) ”
Parámetros de salida: Se definen entre los paréntesis de parámetros con la palabra clave out. Por ejemplo “(bool traeEvaluaciones, out int ConteoEvaluaciones)”
ya no es una lista, es una tupla, colección de dos valores
o mas
Hola Juan Carlos, mi intención no es verme quejoso, serà por mi falta de experiencia desarrollando, lo que veo es que lo que va explicando difiere mucho de lo que venia haciendose hasta el estado del código en el video anterior, entonces me pierdo mucho, y no logro asimilar cómo quisiera todos los conceptos.
Un método puede devolver múltiples objetos utilizando Tuplas, ejem:
Se puedem hacer asignaciones masivas de valores en una sola línea: conteoAlumnos = conteoCursos= conteoAsignaturas = conteoEvaluaciones =0; //Todas tendrán el valor 0
Gracias, no sabía que las tuplas se podían crear al "vuelo", siempre usaba el tipo definido Tuple. Fue una muy buena clase.
Está bien conocer la existencia de los output parameteres, por si los encuentras en código de terceros al que estés dando mantenimiento, pero se debería aclarar que crearlos no es buena práctica, citando del libre código limpio de robert c martin (uncle bob) "Gran parte de la necesidad de usar parámetros de salida desapareció en los lenguajes orientados a objetos... en general los parámetros de salidas deberían ser evitados", los parámetros en una función son naturalmente interpretado (por nosotros como programadores) como entradas, mientras se lee el código para poder entender que se trata de datos de salidas y no entradas, se necesita una doble verificación de parte del desarrollador, lo cual hace que la lectura del código no sea fluida, además de verse cargada de parámetros, no es código limpio.
Avoid output parameters
Gracias por el aporte, te pregunto.. en mi caso vengo de programar en JAVA y nunca había visto algo similar a los parámetros de salida, quizá por lo mismo que siempre he aprendido orientado a objetos.
Entonces, supongo que el libro refiere a que si necesitamos devolver varios valores de un método es mejor crear un objeto que cuente con todos esos atributos y entonces hacer que el método devuelva un objeto del tipo deseado. ¿Es correcta mi comprensión?
Parámetros de salida
Los parámetros opcionales siempre deben ir al último de un método.
Un parámetro de salida se debe marcar con la palabra out, dentro de la función cada parámetro de salida debe ser asignado para funcionar y poder regresar un valor.
Por que aplica acumulador ; si con el count esta contando la lista actual.
y Ya cn el foreach esta acumulando cada ves el coun anterior y el actual ...... ? (para alumnos, asignaturas y evaluaciones)
aaa achi ya entendi jajajjaja xd :v
Parámetros Opcionales
Los parámetros opcionales nos permiten un valor predeterminado al parámetro, lo que permite que sea opcional la asignación de parámetros al iniciar el método.
Ejem: public ObtenerValor(bool estado = true){...}
Al momento de llamar al método se puede realizar de dos maneras:
ObtenerValor( );
ObtenerValor(estado: false );
En la primera opción el valor por defecto es false y en la segunda es true.
Parámetros de Salida
Los parámetros de salida permiten que una herramienta devuelva un resultado, para declararlo se debe utilizar la palabra “out”.
Ejemplo: ObtenerValor(bool estado, out bool resultado );
Una condición que tienen los parámetros de salida es que deben “tener siempre un valor”
Asignaciones múltiples
Consiste en realizar la asignación de un valor a una serie de variables, ejemplo:
//Asignación múltiple
conteoEvaluaciones = conteoAsignaturas = conteoAlumnos = 0;
***Asignaciones múltiples.
Creeria que si tenemos que devolver muchos datos, es mejor devolveros en una estructura de datos.
En este caso para devolver parametros se emplear return o out en C#
Return: Statement terminates execution of the method in which it appears and returns control to the calling method.
Ejemplo de codigo
<public string obtenerRaza(){return"Domestica";}>
Parámetro de salida se Inicializa con la palabra OUT
Correcto. Thanks
Es posible utilizar ref también
¿esa forma de enviar parámetros en la implemetación de la funcion en orden distinto en que se definió por ejemplo traeEvaluaciones:false tambien está disponible en .net framework o solo en .net corre o mas bien depende de la versión de C#?
Así es, lo que mencionas es una característica del lenguaje, no del framework.
Cuando escribo el codigo de
publicList<ObjetoEscuelaBase>GetObjetosEscuela(out int ConteoAlumnos, out int ConteoEvaluaciones, out int ConteoAsignaturas, out int contCurs, bool TraeEvaluaciones=true, bool TraeAlumnos=true, bool TraeAsignaturas=true, bool TraeACursos=true){ConteoEvaluaciones=0;ConteoAlumnos=0;ConteoAsignaturas=0; contCurs =0;var listaObj =newList<ObjetoEscuelaBase>(); listaObj.Add(Escuela);if(TraeACursos) listaObj.AddRange(Escuela.Cursos); contCurs +=Escuela.Cursos.Count;foreach(var curso inEscuela.Cursos){ConteoAsignaturas+= curso.Asignaturas.Count;ConteoAlumnos+= curso.Alumnos.Count;if(TraeAsignaturas){ listaObj.AddRange(curso.Asignaturas);}if(TraeAlumnos){ listaObj.AddRange(curso.Alumnos);}if(TraeEvaluaciones){foreach(var alumno in curso.Alumnos){ listaObj.AddRange(alumno.Evaluaciones);ConteoEvaluaciones+= alumno.Evaluaciones.Count;}}}
Se me duplican los valores de los out 2,3 y 4. Osea siempre ConteoAlumnos puede ser diferente pero,out ConteoEvaluaciones, ConteoAsignaturas y contCurs, se comportan como si fuera la misma variable.
Alguien sabe porque me sucede esto?
Mi código es muy similar al tuyo, entonces el error no está en esta función, tiene que estar desde antes.
Baja el archivo fuente AQUÍ, y compara con el tuyo, a lo mejor encuentras tu error.
Muy bien
Que raro que no deje hacer la asignación multiple como en C, ejemplo: