Hemos visto, hasta el momento, algunas de las reglas que debemos tener para mejorar nuestro código y mantenerlo bien ordenado. Ahora veremos cómo trabajar de una mejor manera con parámetros de salida.
Veamos un ejemplo que debemos evitar y cuál es la causa, por la cual, debemos hacerlo.
int count = 0;
var products = GetProducts(pageIndex, out count);
En este fragmento podemos ver que tenemos un método que recibe un variable que será el total de products. El problema es que estamos obligados a declarar e inicializar una variable, pasarla al método y declararla como out para obtener el resultado de salida de la ejecución del método. Esto puede empeorar si tenemos más parámetros de salida como el siguiente código.
int count = 0;
bool other = false;
var products = GetProducts(pageIndex, out count, out other)
En este caso tenemos 2 variables de salida y declaramos 2 en el método como salida. Veamos cómo podemos refactorizar.
public class OutputParameters
{
public void DisplayProducts()
{
int totalCount = 0;
var products = GetProducts(1, out totalCount);
Console.WriteLine("Total products: " + totalCount);
foreach (var c in products)
Console.WriteLine(c);
}
public IEnumerable<Product> GetProducts(int pageIndex, out int totalCount)
{
totalCount = 100;
return new List<Product>();
}
}
Tenemos 2 métodos, GetProducts, este, requiere un parámetro de salida y DisplayProducts que es el que lo invoca o hace referencia.
Vamos a crear una clase que se llame GetProductsResult, con las siguientes propiedades:
public class GetProductsResult
{
public IEnumerable<Product> Products { get; set; }
public int TotalCount { get; set; }
}
Ahora podemos modificar nuestro código GetProducts para que retorne un resultado del tipo GetProductResult y eliminaremos el parámetro de salida, y por último, modificaremos el método para que devuelva GetProductResult.
public GetProductsResult GetProducts(int pageIndex)
{
totalCount = 100;
return new GetProductsResult(){ Customers = new List<Customer>(), TotalCount = totalCount };
}
Nuestro método que invoca quedará de la siguiente manera:
public void DisplayProducts()
{
int totalCount = 0;
var result = GetProducts(1);
totalCount = result.TotalCount;
var products = result.Products;
Console.WriteLine("Total products: " + totalCount);
foreach (var p in products)
Console.WriteLine(p);
}
Otros Ajustes que debemos hacer son:
- Var customers, no tiene mucho sentido, para esto la usaremos una Inline Variable.
- El foreach tomamos la variable products y la cambiamos por result.Products.
- Eliminaremos var products = result.Products.
Lo mismo haremos con totalCount. Cambiaremos Console.WriteLine(“Total products: ” + totalCount); para que también se una variable en línea.
public void DisplayProducts()
{
int totalCount = 0;
var result = GetProducts(1);
Console.WriteLine("Total products: " + result.TotalCount);
foreach (var p in result.Products)
Console.WriteLine(p);
}
Una cosa más, si vemos el método dice GetCusteomers(1). El 1 no dice que es. Para solucionarlo vamos a cambiarlos por una constante para que sea más significativo.
const int pageIndex = 1;
var result = GetCustomers(pageIndex);
Otro camino es declararlo con una característica de c#:
var result = GetCustomers(pageIndex : 1);
Conclusiones
Finalmente, luego de realizar todos los pasos necesarios, nuestro código ha quedado limpio y mucho más fácil de leer. Siempre es mejor tener devolución de parámetros y no tener métodos void con parámetros de salida.
En próximos post veremos más cosas interesantes para mejorar nuestro código.