Советы, помощь в рефакторинге
Стояла абстрактная задача. Сделать класс 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 (тут стоит подобрать иное название, т.к. оно не совсем точно отражает функционал класса)