Как использовать метод (ы) для добавления нескольких, меняющихся значений - PullRequest
2 голосов
/ 27 сентября 2011

Я работаю над личным проектом для друга, и у меня возникло некоторое препятствие.Я могу продолжать, как я, и написать действительно избыточный код, но я чувствую, что должен быть более эффективный способ сделать это.

Я пытаюсь написать метод, который добавит три значения иотобразить результаты в текстовом поле под заголовком «Модификатор навыка» (см. скриншот).Мне нужно получить метод или серию методов, чтобы сделать это для каждого навыка.Требуется получить значение модификатора навыка для Balance, Climb, Escape Artist и т. Д. *

Screenshot of Skills Screen

Метод будет выглядеть примерно так:То, что у меня есть в настоящее время:

        private void btnUpdate_Click(object sender, EventArgs e)
    {
        //AM + R + MM =SM
        //AM = Ability Modifier
        //R = Rank
        //MM = Misc Modifier
        //SM = Skill Modifier

        decimal balanceMod = balanceAM.Value + balanceR.Value + balanceMM.Value;
        balanceSM.Text = balanceMod.ToString();

        decimal climbMod = climbAM.Value + climbR.Value + climbMM.Value;
        climbSM.Text = climbMod.ToString();

        //etc...
    }

По сути, для меня самая большая проблема - выяснить, как придумать метод, который может обрабатывать так много разных имен полей и добавлять их одинаково.Я хотел бы избегать копирования и вставки одних и тех же двух строк кода в пятьдесят раз для каждого навыка.

Любые идеи будут высоко оценены!Спасибо.

Ответы [ 5 ]

5 голосов
/ 27 сентября 2011

использование таких полей не очень объектно-ориентировано.вы, вероятно, захотите ввести класс навыков, в котором реализован метод вычисления итогового показателя навыка, а затем использовать некоторые объекты навыков для различных навыков.навыки для ваших пользовательских элементов управления.Вам не понравится заканчивать 50 текстовыми полями, которые все похожи, за исключением небольшого количества имени.Первым шагом может быть подключение их всех, например, к одному и тому же обработчику событий.

2 голосов
/ 27 сентября 2011

Обычно подход заключается в создании класса, который представляет одну строку экрана ваших навыков. Затем вы могли бы каким-то образом сохранить их список (скажем, List<Skill>). После этого вы могли бы легко просмотреть все из них:

foreach (Skill skill in character.Skills)
{
     // do something with the skill object
}

Хитрость заключается в том, чтобы динамически генерировать пользовательский интерфейс. На самом деле это не очень сложно (хотя здесь и слишком много кода), безусловно, самый простой подход - использовать что-то вроде DataGridView. Это должно быть довольно легко найти в Google для примеров или просто спросить, хотите ли вы конкретную информацию.

1 голос
/ 27 сентября 2011

Похоже, у вас есть коллекция объектов, которую вы можете привязать к чему-либо в пользовательском интерфейсе (например, к сетке данных или к чему-то еще)

Изменить значения, рассчитать вещи, что вы можете сделать в некотором примере кода:

class Skill
{
    public string Name { get; set; }
    public string KeyAbility { get; set; }
    public int SkillModifier { get; set; }
    public int AbilityModifier { get; set; }
    public int Ranks { get; set; }
    public int MiscModifier { get; set; }

    void Calculate()
    {
        //Formula goes here
        //Set the SkillModifier
    }
}

Skill balance = new Skill() { Name = "Balance" }

По сути, вы можете создать набор навыков, обновить с помощью любого объекта пользовательского интерфейса, к которому вы привязываете, и т. Д. Использование полей по-своему очень избыточно, и с помощью ОО вы можете добиться того же с гораздо меньшим количеством работы.

В основном вы создадите коллекцию класса Skill с Balance и всеми другими навыками, которые вы упомянули.Привязка данных этой коллекции к чему-либо в пользовательском интерфейсе, возможность обновления, вызов различных методов.Вы можете даже реализовать наследование для разных типов навыков.С базовым классом навыка.

0 голосов
/ 27 сентября 2011

Хорошо, тот факт, что у вас есть только личные поля для каждого отдельного элемента управления, является вашей основной проблемой.Возможно, вам лучше создать список структур для их хранения:

struct PickYourOwnNameHere
{
  Control SM;
  Control AM;
  Control R;
  Control MM;
}

List<PickYourOwnNameHere> skills = new List<PickYourOwnNameHere>();

Очевидно, что этот список заполняется при инициализации, и тогда вы можете просто сделать:

skills.ForEach(skill =>
    skill.SM.Text = (skill.AM.Value + skill.R.Value + skill.MM.Value).ToString()
);

I 'я делаю этот синтаксис из памяти, но, надеюсь, вы поймете идею.

0 голосов
/ 27 сентября 2011

Какой тип есть BalamAM, Balancer и т. Д.?

Разве они не могут быть производными от базового типа или интерфейса, который вы можете использовать для передачи вспомогательному методу?

    private string GetText(IModel modelAM, IModel modelR, IModel modelMM)
{
  return  modelAM.Value + modelR.Value + modelMM.Value;
}

balanceSM.Text = this.GetText(balanceAM, balanceR, balanceMM);
...