Рефакторинг кода и разработка чистого кода - PullRequest
0 голосов
/ 19 января 2019

У меня есть dto следующим образом:

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

У меня есть метод, который проверяет, проверены ли дни, и строит строковый формат через запятую. Например, если проверены воскресенье и понедельник, тогда выводится «0,1» (числа, соответствующие дням)

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;
}

Мне нужно преобразовать эту функцию в более понятный код и упрощенную версию. Что в этом можно улучшить?

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Я хотел бы предложить две вещи: создать отдельный метод для преобразования логического значения в представление int и переопределить метод ToString вместо создания отдельного метода ConstructDays.

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 голосов
/ 19 января 2019

Перебирайте свойства classe вроде:

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 голосов
/ 19 января 2019

Определите перечисление флага для хранения ваших значений:

[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
}

Вы можете установить выбранные дни следующим образом:

var days = Days.None;

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

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

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

И генерировать значения, основанные на том, какие флаги установлены следующим образом:

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
}
0 голосов
/ 19 января 2019

Вы можете упростить свой код, преобразовав каждый тип bool в int и присоединившись к полученной коллекции.

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/1:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...