CleanCode - jak poprawić jakość kodu

0

Cześć,
Przedstawię Wam swój kod, który (jestem o tym przekonany) da się napisać lepiej, schludniej i na pewno dużo bardziej wydajnie. Niestety jak się nad czymś siedzi zbyt długo to zaślepia to dostępne ścieżki i tak też jest w moim przypadku. Nie mam pojęcia jak to lepiej napisać... Już tłumaczę o co chodzi:

W moim kontrolerze mam metodę GetMealsByType(), która odpowiedzialna jest za pobranie posiłków wg ich rodzaju (posiłki na śniadanie, na obiad, kolację itp). Rodzaj posiłku jest niezmienny i jego id przekazuję w parametrze metody MealByType. Problem w tym, że ten kod wygląda słabo, cała metoda GetMealsByType(), a także sam model. Niestety nie wiem jak lepiej to przedstawić. Na widoku dla użytkownika mam kolejno 5 dropdownów (dla każdego rodzaju posiłku), z których user wybiera konkretny posiłek. Id'ki tych posiłków z kolei są ładowane do [] ids a następnie iterując po nich dodaję kolejne elementy do klasy DayDietMeals, która odwzorowuje relacje many-to-many i w obiekcie day dodawana jest do bazy.

Mój kontroler

    public class AddDayModel : PageModel
    {
        private readonly IDayDietRepository dayDietRepository;
        private readonly IMealRepository mealRepository;

        public AddDayModel(IDayDietRepository dayDietRepository,
            IMealRepository mealRepository)
        {
            this.dayDietRepository = dayDietRepository;
            this.mealRepository = mealRepository;
        }

        [BindProperty]
        public DayModel Day { get; set; }
        public IActionResult OnGet(int dietId)
        {
            GetMealsByType();
            return Page();
        }

        private void GetMealsByType()
        {
            Day = new DayModel();
            Day.Breakfast = mealRepository.MealByType(6).ToList();
            Day.Brunch = mealRepository.MealByType(7).ToList();
            Day.Lunch = mealRepository.MealByType(8).ToList();
            Day.Tea = mealRepository.MealByType(4).ToList();
            Day.Dinner = mealRepository.MealByType(9).ToList();
        }

        public IActionResult OnPost()
        {
            var dayDietMeals = new List<DayDietMeals>();
            var typeOfMealId = 1;
            foreach (var i in Day.ids)
            {
                dayDietMeals.Add(new DayDietMeals()
                {
                    MealId = i,
                    TypeOfMeal = typeOfMealId
                });
                typeOfMealId++;
            }

            var day = new Day()
            {
                DietId = Day.DietId,
                DayName = Day.Name,
                DayDietMeals = dayDietMeals
            };

            dayDietRepository.AddDayDiet(day);

            return RedirectToPage("/Diets/Edit", new { Id = Day.DietId});
        }
    }

Mój model:

    public class DayModel
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "Pole nazwa dnia jest wymagane")]
        [DisplayName("Nazwa dnia")]
        public string Name { get; set; }
        public int DietId { get; set; }

        [Required(ErrorMessage = "Wybierz posiłek na I śniadanie")]
        public List<Meal> Breakfast { get; set; }
        [Required(ErrorMessage = "Wybierz posiłek na II śniadanie")]
        public List<Meal> Brunch { get; set; }
        [Required(ErrorMessage = "Wybierz posiłek na obiad")]
        public List<Meal> Lunch { get; set; }
        [Required(ErrorMessage = "Wybierz posiłek na podwieczorek")]
        public List<Meal> Tea { get; set; }
        [Required(ErrorMessage = "Wybierz posiłek na kolację")]
        public List<Meal> Dinner { get; set; }
        public int[] ids { get; set; }
    }
1

Po pierwsze zainteresuj się wzorcem mediator, i jego implementacją w .Net za pomocą biblioteki MediatR. Wtedy wydziel sobie kod logiki biznesowej do handlerów, a z kontrolera (czy to jest w ogóle dobre określenie w przypadku Razor Pages?) bedziesz jedynie wysyłał requesty do mediatora. Jak Ci się chce to wyszukaj na forum mojego postu na ten temat gdzie bardziej szczegółowo to opisywałem (zapewne już więcej niż raz).

Druga sprawa która mi się rzuciła w oczy to nazewnictwo- jeśli Twoja encja Day reprezentuje posiłki danego dnia, to nazwa Day jest niedopwiednia bo nie odzwierciedla tego czym tak naprawdę jest.

0

Dzięki Wam za komentarze, na pewno to sprawdzę.

A co z tym moim strasznym kodem? Czy ma ktoś z Was pomysł jak lepiej zaimplementować pobieranie MealByType aby to wyglądało w kodzie jakoś sensownie? Nie wiem jakimś enumem czy w inny sposób? Czy wgl przerobić klasę modelu? Głośno myślę teraz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1