только начинаю работать с C#, тут возник вопрос. У меня есть тут много элементов (стрелок), у которых действия при нажатии почти идентичны, лишь различаются изменяемые переменные. Есть ли способ упростить весь этот говнокод ? Или по другому никак ?
private void bArrowLeft_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lStrengthValue.Text) != 0)
{
points++;
lStrengthValue.Text = Convert.ToString(Convert.ToInt32(lStrengthValue.Text) - 1);
UpdatePoints();
}
}
private void bArrowLeft2_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lAgilityValue.Text) != 0)
{
points++;
lAgilityValue.Text = Convert.ToString(Convert.ToInt32(lAgilityValue.Text) - 1);
UpdatePoints();
}
}
private void bArrowLeft3_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lMagickaValue.Text) != 0)
{
points++;
lMagickaValue.Text = Convert.ToString(Convert.ToInt32(lMagickaValue.Text) - 1);
UpdatePoints();
}
}
private void BArrowRight_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lPointsValue.Text) != 0)
{
points--;
lStrengthValue.Text = Convert.ToString(Convert.ToInt32(lStrengthValue.Text) + 1);
UpdatePoints();
}
}
private void BArrowRight2_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lPointsValue.Text) != 0)
{
points--;
lAgilityValue.Text = Convert.ToString(Convert.ToInt32(lAgilityValue.Text) + 1);
UpdatePoints();
}
}
private void BArrowRight3_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(lPointsValue.Text) != 0)
{
points--;
lMagickaValue.Text = Convert.ToString(Convert.ToInt32(lMagickaValue.Text) + 1);
UpdatePoints();
}
}
Если кратко, то
У вас в обработчиках одинаковый код, отличается только текстовое поле, с которым вы работаете. Можно сделать одну функцию и туда передавать это поле. Но если вы сделаете рефакторинг из 2 пункта, то вам это не понадобится.
Элементы интерфейса - вообще неподходящее место для хранения данных, и особенно чисел в виде строк. Вот эти записи Convert.ToString(Convert.ToInt32(lStrengthValue.Text) - 1)
- следствие вашей ошибки. Лучше будет использовать свойства, где вы в сеттере пропишете изменение текста в полях, и тогда вы сможете работать с ними как с обычными переменными: Strength--
и все. По свойствам на ruSO есть замечательное объяснение.
Пример для первого пункта:
private void RetrievePoint (TextField textField) {
if (Convert.ToInt32(textField.Text) != 0) {
points++;
textField.Text = Convert.ToString(Convert.ToInt32(textField.Text) - 1);
UpdatePoints();
}
}
И в обработчике:
RetrievePoint(lStrengthValue);
Но все же лучшим решением будут свойства:
private int _strength;
private int Strength {
get { return _strength; }
set {
_strength = value;
lStrengthValue.Text = value.ToString();
}
}
В коде будете просто менять Strength как будто это переменная, и текстовое поле будет меняться автоматически.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Можно ли как то реализовать checklist, что бы отображался один текст, и к нему привязана другая строка? Опишу по подробнее, начал осваивать С#Есть...
Я делал блог (тестовое задание) используя MVC архитектуру и HTML тело прописал на View (show_mainphp здесь и Bootstrap, CSS, JS файлы подключены)