Hola Leandro,
Creo que aca ya empieza a ser mas difícil la respuesta, no solo por que el
código es más complicado, si no porque:
1 - estamos viendo solo un pedazo de código y cuesta hacer refactoring sin
saber las especificaciones, hasta donde se puede cambiar, y porque esta
hecho asi. Seguramente conociendo todo el proyecto seria mucho mas fácil.
Ver algo como HideColumns { get { return new List<string>() { "V", "Y" }; no
dice absolutamente nada, pero supongo que algún sentido tiene.
Por ejemplo, según los meses que pusiste, puedo suponer que mas o menos el
patrón es:
El primer mes esta en la columna Y, cada mes ocupa 4 columnas, y va en orden
contrario (Y=1er mes, U=2do mes, Q=3er mes,
)
Contando de atrás para adelante, la primera es Hidden, la 2da no importa, la
3ra es MonthColumn y Avance, la 4ta Hidden.
Entonces te queda:
...NOPQRSTUVWXY
...H3-HH2-HH1-H
No importa si está bien o mal, pero nos falta información para poder
refactorizar el código bien.
2 Suponiendo que no hay ningún patrón y la única forma es hacerlo mas o
menos como lo tenes, creo que deberías usar un archivo de configuración
porque ya no es tan sencillo. Hacer un archivo de configuración es muy
fácil: haces las clases del modelo, y en 2 lineas serializas y deserializas
XML. Porque no puede ser esta una alternativa?
Saludos,
Diego
From: [email protected] [mailto:[email protected]] On Behalf Of Leandro
Tuttini
Sent: Wednesday, August 05, 2009 10:03
To: [email protected]
Subject: [puntonet] Optimizar Codigo - parte 2
hola,
Como continucacion de la primera parte en este caso tengo otra region de
codigo a optimizar por ahi un poco mas compleja, aunque igualmente tengo
varias soluciones penmsadas pero queria validarlas a ver si surge alguna
alternativa aun mejor.
La cuestion es similar a al anterior tratar de evitar el switch.
El codigo seria el siguiente:
Por un lado tengo las siguientes clases:
internal abstract class ExcelMonthPosition
{
public abstract string MonthColumn { get; }
public abstract string Avance { get; }
public abstract List<string> HideColumns { get; }
public string GetMonthLabel()
{
...
}
public string GetCartera()
{
...
}
public string GetAvanceByVariable(VariableIdEnum var)
{
..
}
}
internal class ExcelMonth1Position : ExcelMonthPosition
{
public override string MonthColumn { get { return "W"; } }
public override string Avance { get { return "W"; } }
public override List<string> HideColumns { get { return new
List<string>() { "V", "Y" }; } }
}
internal class ExcelMonth2Position : ExcelMonthPosition
{
public override string MonthColumn { get { return "S"; } }
public override string Avance { get { return "S"; } }
public override List<string> HideColumns { get { return new
List<string>() { "R", "U" }; } }
}
.
.
.
internal class ExcelMonthnPosition : ExcelMonthPosition
{
public override string MonthColumn { get { return "S"; } }
public override string Avance { get { return "S"; } }
public override List<string> HideColumns { get { return new
List<string>() { "R", "U" }; } }
}
Como observaran estas clases permiten definir cada mes y que columnas
definen a cada uno.
Hay 12 de estas clases.
Por otro lado esta esta otra funcionalidad:
internal class ExcelPosition
{
private short MonthCount = 1;
public ExcelMonthPosition GetNextMonth()
{
ExcelMonthPosition excelMonthPosition =
this.GetMonthByNumber(MonthCount);
MonthCount++;
return excelMonthPosition;
}
public ExcelMonthPosition GetMonthByNumber(short monthNumber)
{
ExcelMonthPosition excelMonthPosition = null;
switch (monthNumber)
{
case 1:
excelMonthPosition = new ExcelMonth1Position();
break;
case 2:
excelMonthPosition = new ExcelMonth2Position();
break;
case 3:
excelMonthPosition = new ExcelMonth3Position();
break;
case 4:
excelMonthPosition = new ExcelMonth4Position();
break;
case 5:
excelMonthPosition = new ExcelMonth5Position();
break;
case 6:
excelMonthPosition = new ExcelMonth6Position();
break;
case 7:
excelMonthPosition = new ExcelMonth7Position();
break;
case 8:
excelMonthPosition = new ExcelMonth8Position();
break;
case 9:
excelMonthPosition = new ExcelMonth9Position();
break;
case 10:
excelMonthPosition = new ExcelMonth10Position();
break;
case 11:
excelMonthPosition = new ExcelMonth11Position();
break;
case 12:
excelMonthPosition = new ExcelMonth12Position();
break;
}
return excelMonthPosition;
}
}
Esta es la que se pretende optimizar.
Como veran por el numero del mes, se obtiene la instancia concreta.
Tengo dos alternativas:
- utilizar reflection para obtener la instancia.
- crear un diccionario del tipo Dictionary<int, ExcelMonthPosition>, al
crear la instancia de ExcelPosition, en su constructor (que ahora no tiene),
cargar ese diccionario que luego se usara en el metodo GetMonthByNumber()
recuperando la instancia de la posicion dentro del diccionaria
Bueno por ahora solo pense en estas, que opinan, son acertadas? haya alguna
alternativa aun mejor ?
gracias
saludos
_____
Encontra las mejores recetas con Yahoo! Cocina.
http://ar.mujer.yahoo.com/cocina/