Ваш класс почти хороший и приемлемый.
Краткий рассказ: используйте свойства.
Длинный рассказ:
Прежде всего составьте или соблюдайте правила именования, это сделает ваш код более удобным для чтения. Это зависит от вас, просто предложение. Для сложных имен, состоящих из нескольких слов, вы можете использовать CamelCasedNames
. И избегайте сокращать имена для всех типов данных, где это может быть полезно. Например, вы можете расширить Lvl
до Level
, но Xp
до Experience
будет выглядеть как-то странно. Это тоже зависит от вас.
string name; // local Variable, first character lower cased
private string _name; // private Field, first character is lower cased with leading "_"
public string Name { get; set; } // public Property, first character is upper cased
Я покажу вам альтернативы переопределению конструкторов и буду следовать правилам именования.
1) Значения по умолчанию для конструктора (с частью вашего класса для простоты)
class Player
{
public Player(string name = "Player", int xp = 0, int level = 1)
{
Name = name;
Xp = xp;
Level = level;
}
// Properties instead of Fields
public int Xp { get; private set; } // restrict modification of the property outside of a class but reading is available
public int Level { get; private set; }
public string Name { get; set; }
}
2) Свойства без конструктора со значениями по умолчанию
Первая цель свойства - ограничить доступ к данным для обеспечения согласованности внутренних данных объекта. Даже вы делаете ошибки в коде. Хороший способ избежать некоторых ошибок.
Вторая цель свойства - выполнение кода, пока вы его получаете или устанавливаете. Например, сделать свойства зависимыми друг от друга, чтобы хранить меньше уникальных данных.
class Player
{
public int Xp { get; private set; } = 0;
public int Level { get; private set; } = 1;
public string Name { get; set; } = "Player";
}
Использование
Player player = new Player() { Name = "KillerPWNZ", Level = 100, Xp = 999999 };
Бонус: Другая функция свойства
Вы можете выполнить любой код в предложении get
или set
.
Предположим, что для каждого следующего уровня игрока требуется удвоенное количество опыта по сравнению с предыдущим, но 2-й уровень требует 100 XP. И вы решили выставить счет игроку 1-го уровня на 1000 XP. Очевидно, вам нужно будет нажать Level
несколько раз. Предполагается, что Xp
содержит значение относительно Level
.
Счет-фактура
player.Xp += 1000;
Свойство с кодом
private int _xp = 0;
public int Level { get; private set; } = 1;
public int Xp
{
get => _xp; // same as: get { return _xp; }
set
{
_xp = value; // here value is keyword containing data you want to set
while (_xp >= GetXpPerLevel(Level))
{
_xp -= GetXpPerLevel(Level);
Level++;
}
while (_xp < 0 && Level > 1)
{
_xp += GetXpPerLevel(Level - 1);
Level--;
}
}
}
// helper method
private int GetXpPerLevel(int level)
{
if (level < 1) return 0;
// int result = 100;
// for (int i = 1; i < level; i++) result *= 2;
// return result;
// or the same with some binary shift magic :)
return 100 << (level - 1);
}