2

только начинаю работать с 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();
            }
        }
SKProCH
  • 954
  • 7
  • 23
segu
  • 23

1 Answers1

1

Если кратко, то

  1. У вас в обработчиках одинаковый код, отличается только текстовое поле, с которым вы работаете. Можно сделать одну функцию и туда передавать это поле. Но если вы сделаете рефакторинг из 2 пункта, то вам это не понадобится.

  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 как будто это переменная, и текстовое поле будет меняться автоматически.

trollingchar
  • 1,552