ASP.NET - Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

 
Vista:
sin imagen de perfil
Val: 6
Ha disminuido su posición en 2 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Fabi (3 intervenciones) el 09/04/2021 04:11:58
Hola a todos!! Les cuento mi problema, tengo una aplicación web, utilizo asp.net mvc c# y sql server. En un formulario los empleados cargan el motivo de su ausencia. Inicialmente este formulario tenía solo tres campos, un combo con la lista de motivos de ausencia(Enfermedad, Día de Estudio, Otros motivo), fecha (el sistema toma la fecha) y descripción, mi tabla tenía estos Ausencia (Id, MotivoId, Fecha, Descripcion). Luego me pidieron que cuando los usuario seleccionen por ej. Enfermedad les muestre otro combo con (Fiebre, Dolor abdominal) y si es por Día de Estudio se le permita seleccionar una fecha pero con la restricción de notificar su ausencia con 5 días de anticipación. Como ya tenía mi tabla Motivo (Id, Descripcion) entonces cree una nueva tabla SubMotivo (Id, Descripcion, MotivoId) y actualicé mi tabla Ausencia (Id, SubMotivoId, FechaRegistro, FechaSeleccionada, Descripcion).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public bool CrearAusencia (Ausencia a)
{
    /*Id Motivo Día estudio = 2*/
    if (a.MotivoId == 2)
    {
         int dia = FechaSeleccionada.Day;
         if (dia < 5)
         {
             //No se permite crear ausencia.
         }
    }
 
    //Se permite crear ausencia
}

Luego me pidieron, cuando seleccionen la opción Otros Motivos se cargue un combo con las siguientes items Día Free, Mudanza y Trámite. Con las restricciones, para Día Free sólo se debe permitir entre el día 1 al 5 de cada mes, pasado esos día ya no debe permitir registrar una ausencia. Para Mudanza con tres días de anticipación se debe registrar la ausencia y para la opción Trámite con 1 día de anticipación.

Entonces Modifiqué el código anterior.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public bool CrearAusencia (Ausencia a)
{
    /*Id Motivo Día estudio = 2*/
    if (a.MotivoId == 2)
    {
         int dia = FechaSeleccionada.Day;
         int diaActual = FechaActual.Day;
         if ((dia - diaActual) <= 5) //Se debe registrar con 5 días de anticipación.
         {
             //No se permite crear ausencia.
         }
    }
 
    /*Id Día Free = 5*/
    else if (a.SubMitvo == 5)
    {
        int dia = FechaSeleccionada.Day;
        if (dia >= 5) //Solo se permite hasta el día 5 de cada mes.
        {
             //No se permite crear ausencia.
        }
    }
 
    /*Id Mudanza = 8*/
    else if (a.SubMitvo == 8)
    {
        int dia = FechaSeleccionada.Day;
        int diaActual = FechaActual.Day;
        if ((dia - diaActual) <= 2) //Se debe registrar con 3 días de anticipación.
        {
             //No se permite crear ausencia.
        }
    }
 
    //Se permite crear ausencia
}
Quiero saber cómo puedo mejorar este código ante la aparición de nuevos requerimientos.

Que me recomiendan ustedes. Estoy viendo un poco de los principios SOLID pero aún no me doy cuenta cómo solucionar esto.

Disculpen si me extendí demasiado. Gracias,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Juan José
Val: 28
Ha aumentado su posición en 3 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Juan José (13 intervenciones) el 09/04/2021 11:09:28
Buenas, yo haría algo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(a.MotivoId)
{
  case 2:
         switch(a.SubMitvo)
        {
              case 5:
                   //Accion
              break;
              case 8:
                   //Accion
              break;
        }
        break;
}

1
2
3
4
5
6
7
//Incluso con una función
switch(a.MotivoId)
{
  case 2:
           FuncionSubMotivos(a.SubMitvo)
        break;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 2 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Fabiola (3 intervenciones) el 10/04/2021 05:10:37
Hola fuiste muy amable con responder a mi consulta.

Te consulto, como por cada motivo tengo N submotivos entonces el switch va ir creciendo en función a la cantidad de motivos y submotivos. Es buena alternativa utilizar un switch para este caso, tomando en cuenta que en cualquier momento se puede agregar otros motivos y submotivos.

Gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 165
Oro
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Miguel (72 intervenciones) el 09/04/2021 18:12:57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//agrega tus clases para tener una mejor idea de como se estan declarando
Puedes crear un Metodo Validacion
tambien sirve si agregas una propiedad  boleana "EsValido" a motivo
y string "ErrorValidacion"
//pseudo codigo
 
//uso de ValidarMotivo
 
Validar(a, fechaSeleccionada )
if(a.EsValida ==false)
 // ser retorna error
else
 CrearAusencia(
 
 
private void ValidarMotivo(Motivo motivo, Date fechaSeleccionadaDia)
{
  //aqui tus validaciones
 
  //la validacion de motivo 2 no  es aprobada
motivo.EsValido=false;
motivo.ErrorValidacion="Se debe registrar con 5 días de anticipación."
 
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 2 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Fabiola (3 intervenciones) el 10/04/2021 04:52:01
Hola, gracias por responder a mi consulta.

Estas son mis clases

1
2
3
4
5
6
7
8
9
public class Ausencia()
{
      public int Id {get; set;}
      public int MotivoId {get; set;}
      public int SubMotivoId {get; set;}
      public DateTime FechaRegistro {get; set;}
      public DateTime FechaSeleccionada {get; set;}
      public string Descripcion {get; set}
}

1
2
3
4
5
6
7
public class Motivo()
{
      public int Id {get; set;}
      public string Descripcion {get; set}
 
      public ICollection<SubMotivo> SubMotivos {get; set;}
}

1
2
3
4
5
public class SubMotivo()
{
      public int Id {get; set;}
      public string Descripcion {get; set}
}

Me parece buena idea el método ValidarMotivo.

Lo que quiero principalmente es evitar el anidamiento de los IF.


Gracias nuevamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 165
Oro
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Cómo mejorar la funcionalidad de este código ante nuevos requerimientos

Publicado por Miguel (72 intervenciones) el 11/04/2021 03:35:51
Los if se pueden evitar si te das cuenta todas tus validaciones son con respecto a un motivoId y fecha,
de tal manera que puedas registrar el motivo y el limite.

para la utilizacion se puede usar el metodo validacion y una nueva clase llamada regla validacion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//pseudo codigo
 
public class ReglaValidacion
{
  prop  int motivoId;
   prop fechaDiasMax;
 
 
 
}
 
//cuando se crea la clase puedes registrar tus reglas de validacion
  se deja una propiedad generica
 
 array reglasValidacion+ new Array(numero de reglas)
 
 public void RegistrarValidaciones()
{
    //
  ReglaValidacion regla1= new ReglaValidacion;
    regla1.MotivoId=2;
    regla1.fechaDiasMax=5; dias
}
 
//
private void ValidarMotivo(Motivo motivo, Date fechaSeleccionadaDia)
{
  //aqui tus validaciones
  //se valida el motivo principal
 
 
}
 
private bool MotivoRegla(motivoId, fecha seleccionada)
{
   regla= reglasValidacion.BuscarId(motivoId);
 
    int dia = FechaSeleccionada.Day;
        int diaActual = FechaActual.Day;
        if ((dia - diaActual) <= regla.fechaDiasMax)
       {
       return false;
       }
else
    return  true;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar