Советы, помощь в рефакторинге

Стояла абстрактная задача. Сделать класс Player, где будут хранится данные об игроке и методы для работы с ними.

Прошу советов, как можно выполнить рефакторинг? Насколько мне известно, то использование static свойств и методов вредно для программы. Можно ли было сделать данный код проще? Нужно ли было выносить список объектов Player за пределы класса?

class Program
{
    static void Main(string[] args)
    {
        List<Player> players = new List<Player>() { new Player("Alex", 5), new Player("John", 10) };
        Player p = new Player();
        p.DeletePlayer(1);
        Player.ShowAllPlayers();

        Console.ReadKey();
    }
}
class Player
{
    private static List<Player> _players = new List<Player>(0);
    private static int _counter;
    private int _index;
    private string _nickName;
    private int _level;
    private bool _isBanned;

    public Player(string nickName, int level)
    {
        _counter++;
        _index = _counter;
        _nickName = nickName;
        _level = level;
        _isBanned = false;
        _players.Add(this);
    }
    public Player()
    {

    }
    public void BanPlayer(int index)
    {
        _players[index - 1]._isBanned = true;
    }
    public void UnbanPlayer(int index)
    {
        _players[index - 1]._isBanned = false;
    }
    public void DeletePlayer(int index)
    {
        _players.RemoveAt(index - 1);
    }
    public static void ShowAllPlayers()
    {
        if (_players.Count == 0)
        {
            Console.WriteLine("Игроков пока нет :(");
            Console.ReadKey();
            return;
        }
        for (int i = 0; i < _players.Count; i++)
        {
            Console.WriteLine(_players[i]._index + " " + _players[i]._nickName + " " + _players[i]._level + " " + _players[i]._isBanned);
        }
    }
}

Ответы (1 шт):

Автор решения: Frehzy

Может попробуете следующую реализацию?

internal class Player
{
    public Guid Id { get; }

    public string Name { get; }

    public PlayerStatus Status { get; private set; }

    public Player(string name, PlayerStatus status)
    {
        Id = Guid.NewGuid();
        Name = name;
        Status = status;
    }

    public Player(Guid id, string name, PlayerStatus status)
    {
        Id = id;
        Name = name;
        Status = status;
    }

    public void ChangeStatus(PlayerStatus status) => Status = status;
}

internal enum PlayerStatus
    {
        Ban = 0,
        NoBan = 1
    }

internal static class PlayerManager
    {
        public static void BanPlayerById(List<Player> players, Guid id) =>
            players.First(x => x.Id.Equals(id)).ChangeStatus(PlayerStatus.Ban);

        public static void UnbanPlayerById(List<Player> players, Guid id) =>
            players.First(x => x.Id.Equals(id)).ChangeStatus(PlayerStatus.NoBan);

        public static List<Player> GetPlayerWithoutBan(List<Player> players) =>
            players.Where(x => x.Status.HasFlag(PlayerStatus.NoBan)).ToList();
    }

Для создания экземпляра класса используете

    var player = new Player(default, PlayerStatus.NoBan);   

или

    var player = new Player(Guid.NewGuid(), default, PlayerStatus.NoBan);

Добавляете в лист так же, как вы и делаете сейчас - List.Add(player);

Изменять через статический класс Manager (тут стоит подобрать иное название, т.к. оно не совсем точно отражает функционал класса)

→ Ссылка