0
votes

Refactoriser le code et développer un code propre

J'ai un dto comme suit:

pubic string ConstructDays(DaysDetails d)
{
 StringBuilder constructDays = new StringBuilder();
 if(d.Sun == true)
  { 
    constructDays.Append("0");
  }
 if(d.Mon == true)
 {
   constructDays.Append("1");
  }
 ..... //So on for all seven days
 string day = Convert.toString(constructDays);

 if(day != string.Empty && day[0] == ",")
   day = day.Remove(0,1);
 return day;
}

J'ai une méthode qui vérifie si les jours sont vérifiés et crée un format de chaîne séparé par des virgules. Par exemple: si dimanche et lundi sont cochés, le résultat est "0,1" (nombres correspondant aux jours)

public class DaysDetails
{
 public bool Sun {get;set;}
 public bool Mon {get;set;}
 ...
 public bool Sat {get;set;} //All 7 days of the week
}

J'ai besoin de convertir cette fonction en un code plus facile à gérer et version simplifiée. Qu'est-ce qui peut être amélioré à cet égard?


4 commentaires

Pour commencer, êtes-vous autorisé à modifier DaysDetails? Je veux dire, pourquoi ne pas utiliser un Enum avec des indicateurs?


vous pouvez utiliser une liste au lieu d'un champ CSV


@anu: DayDetails est ce que j'obtiens des champs mappés de l'interface utilisateur. Mais oui, je suis autorisé à utiliser toute autre variable dérivée de DayDetails et peut être passée à la fonction ConstructDays. En fin de compte, j'ai besoin d'une chaîne séparée par des virgules de DayDetails ou de toute variable personnalisée transmise à function.


Je vote pour fermer cette question comme hors sujet, car elle demande une révision du code, essayez Révision du code


4 Réponses :


5
votes

Vous pouvez simplifier votre code en convertissant chaque booléen en int et en rejoignant la collection résultante.

public string ConstructDays(DaysDetails d)
{
    var week = new[]
    {
        d.Sat ? 0 : -1,
        d.Sun ? 1 : -1,
        d.Mon ? 2 : -1,
        //...//
    }.Where(x => x != -1);
    return string.Join(",",  week);
}

Ou si vous recherchez plus que 0/1:

public class DaysDetails
{
    public bool Sun { get; set; }
    public bool Mon { get; set; }
    public bool Sat { get; set; }
}

public string ConstructDays(DaysDetails d)
{
    var week = new[]
    {
        Convert.ToInt32(d.Sat),
        Convert.ToInt32(d.Sun),
        Convert.ToInt32(d.Mon),
    };
    return string.Join(",",  week);
}


0 commentaires

0
votes

Parcourez les propriétés de la classe comme:

pubic string ConstructDays(DaysDetails d)
{
 int Idx = 0;
    string days = "";
    var obj = new DaysDetails ();
    foreach (var p in obj .GetType().GetProperties())
    {   days += (bool)p.GetValue(obj ) ? (days=="" ? Idx.ToString() : ","+Idx.ToString()) : "";
        Idx++;
    }
return days
}


0 commentaires

0
votes

Définissez une énumération d'indicateur pour stocker vos valeurs:

static public string ConstructDays(Days days)
{
    return string.Join(",", Enum.GetValues(typeof(Days))
                                .Cast<Days>()
                                .Where(d => days.HasFlag(d) && d != Days.None)
                                .Select(d => Math.Log((int)d, 2)));  // 1,3,6
}

Vous pouvez définir les jours sélectionnés comme ceci:

var days = Days.None;

if (some condition)
    days |= Days.Mon;

if (some other condition)
    days |= Days.Wed;

if (yet another condition)
    days |= Days.Sat;

Et générer des valeurs en fonction des indicateurs définis comme suit:

[Flags]
public enum Days
{
    None = 0,
    Sun = 1,  // 0
    Mon = 2,  // 1
    Tue = 4,  // 2
    Wed = 8,  // 3
    Thu = 16, // 4
    Fri = 32, // 5
    Sat = 64  // 6
}


0 commentaires

0
votes

Je suggérerais deux choses: créer une méthode distincte pour convertir un booléen en représentation int et remplacer Méthode ToString au lieu de générer une méthode ConstructDays distincte.

public class DaysDetails
{
    public bool Sun {get;set;}
    public bool Mon {get;set;}
    ...
    public bool Sat {get;set;} //All 7 days of the week

    public override string ToString() {
        //formatted string
        return $"{GetNumberRepresentationOfBool(Sun)},{GetNumberRepresentationOfBool(Mon)},{GetNumberRepresentationOfBool(Sat)}"
    }
}

public int GetNumberRepresentationOfBool(bool value) {
    return value ? 1 : 0
}

//printing the value
Console.WriteLine(dayDetailsObject.ToString());


0 commentaires