NelegalSS
@NelegalSS
Стандартный увлеченный параноик

Как правильно произвести рефакторинг следующего кода на C#, чтобы было красиво?

Доброго дня.
Подскажите как правильно произвести рефакторинг следующих методов и возможно ли их упрощение для дальнейшего применения?

Имеем следующий "абстрактный базовый" класс:
public class BaseCar
{
    public int Position { get; set; } // номер стояночного места
    public int Box {get; set;} //номер гаража
}

от него наследуем 2 и более других классов

//Самосвалы
public class Tipper : BaseCar
{
    public int Capacity { get; set; }
}
// Автобусы
public class Autobus : BaseCar
{
    public int MaxPeople {get;set;}
}


Эти классы становятся частью класса гараж

public class Garage 
{
    public List<Autobus> autobus_list {get; set;};
    public List<Tipper> tipper_list {get; set;};
	
    public Garage()
    {
        autobus_list = getAutobusList();
        tipper_list = getTippetList();
    }
}

За работу с классом Garage отвечает класс логики
public class Logic
{
    public Garage garage = new Garage();
    ....
    // Теперь сама суть вопроса
    // Требуется вернуть отсортированный по стояночному месту список 
    // или список определенной техники в каком либо гараже

    // В данный момент я делаю это такими вот методами
    public List<Autobus> getListAutobusInBox(int box)
    {
         return garage.autobus_list.FindAll(x => x.Box == box);
    }
    public List<Tipper> getListTipperInBox(int box)
    {
         return garage.tipper_list.FindAll(x => x.Box == box);
    }

    public List<Autobus> SortListAutobus(List<Autobus> list)
    {
         list.Sort(delegate (Autobus x, Autobus y)
                {
                    if (object.Equals(x, y)) return 0;
                    return x.Position.CompareTo(y.Position);
                });
                return list;
    }

    public List<Tipper> SortListTipper(List<Tipper> list)
    {
        list.Sort(delegate (Tipper x, Tipper y)
        {
            if (object.Equals(x, y)) 
                return 0;
            return x.Position.CompareTo(y.Position);
        });
        return list;
    }
}

Вот нутром понимаю, что методы SortListAutobus и SortListTipper абсолютно идентичны на уровне базового класса BaseCar, как и методы getListTipperInBox и getListAutobusInBox. Подскажите как из свести вместе на уровне базового класса. Вполне вероятно это делается на уровне интерфейсов, но с ними я по книжке не могу никак подружиться. Если дело все же в интерфейсах можно на данном примере показать как он будет работать.
Спасибо.
  • Вопрос задан
  • 389 просмотров
Решения вопроса 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Какие интерфейсы? Обобщеные типы и методы - metanit.com/sharp/tutorial/3.12.php

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!");
    }

    public class BaseCar
    {
        public int Position { get; set; } // номер стояночного места
        public int Box { get; set; } //номер гаража
    }

    public class Tipper : BaseCar
    {
        public int Capacity { get; set; }
    }
    // Автобусы
    public class Autobus : BaseCar
    {
        public int MaxPeople { get; set; }
    }

    public class Garage
    {
        public List<Autobus> autobus_list { get; set; }
        public List<Tipper> tipper_list { get; set; }

        public Garage()
        {
            autobus_list = new List<Autobus>();
            tipper_list = new List<Tipper>();
        }
    }

    public class Logic
    {
        public Garage garage = new Garage();

        public List<Autobus> getListAutobusInBox(int box)
        {
            return garage.autobus_list.FindAll(x => x.Box == box);
        }

        public List<Tipper> getListTipperInBox(int box)
        {
            return garage.tipper_list.FindAll(x => x.Box == box);
        }

        public List<T> SortList<T>(List<T> list) where T : BaseCar
        {
            return list.Sort((x, y) => object.Equals(x, y) ? 0 : x.Position.CompareTo(y.Position)).ToList();
        }

    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Вы сами пишите, что BaseCar абстрактный
Значит
public abstract class BaseCar
Далее вы можете уже ввнести в базовый класс метод для определения типа авто
public abstract CarType GetCarType();
Который придется реализовать в каждом дочернем классе
public class Autobus : BaseCar
{
    public override CarType GetCarType()
    {
        return CarType.Autobus; 
    }
    public int MaxPeople {get;set;}
}

Можно конечно по классу определять car.Type == typeof(Autobus), но будет медленней.

В классе class Garage, вы можете все хранить в одном списке List< BaseCar >
Вот теперь по единому списку вы можете делать сортировку по месту и исключать по типу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы