Похожие обработчики событий для кнопок


У меня есть 3 простых аналогичные функции обработчика событий, который я хотел бы рефакторинг. Какие-либо предложения?

private void btnBuildingList_Click(object sender, EventArgs e)
    {
        selectedExportType = (int)ExportType.Building;
        path = csvFilePath + String.Format("{0:yyyy-MM-dd}", datDate.DateTime) + "-BuildingList.csv";
        Export();
    }

    private void btnOwnerList_Click(object sender, EventArgs e)
    {
        selectedExportType = (int)ExportType.Persons;
        path = csvFilePath + String.Format("{0:yyyy-MM-dd}", datDate.DateTime) + "-OwnerList.csv";
        Export();
    }

    private void btnFacts_Click(object sender, EventArgs e)
    {
        selectedExportType = (int)ExportType.Facts;
        path = csvFilePath + String.Format("{0:yyyy-MM-dd}", datDate.DateTime) + "-FactsData.csv";
        Export();
    }


556
5
задан 2 марта 2011 в 09:03 Источник Поделиться
Комментарии
3 ответа


  1. Вы можете использовать экстракт способ рефакторинга, чтобы избавиться от повторяющегося кода:

    private static string GetExportFilePath(string csvFilePath, DateTime date, string fileSuffix)
    {
    return string.Format("{0}{1:yyyy-MM-dd}-{2}.csv", csvFilePath, date, fileSuffix);
    }

  2. Я хотел добавить эти selectedExportType и путь переменные в качестве параметров для экспорта() метод. Я надеюсь, что они нигде не используются. Это, как правило, довольно субъективное, нужно ли добавить что-то в качестве параметров метода или оставить его в качестве члена класса, но вот я бы точно передать их в качестве параметров. Я предполагаю, что этот класс является “точка зрения”, так как вы нажмите кнопку обработчики событий, и я также имеют тенденцию двигаться такими методами из виды.

Если мы используем эти две идеи, свои обработчики событий будет упрощен до:

private void btnBuildingList_Click(object sender, EventArgs e)
{
var path = GetExportFilePath(csvFilePath, datDate.DateTime, "BuildingList.csv");
Export((int)ExportType.Building, path);
}

private void btnOwnerList_Click(object sender, EventArgs e)
{
var path = GetExportFilePath(csvFilePath, datDate.DateTime, "OwnerList.csv");
Export((int)ExportType.Persons, path);
}

private void btnFacts_Click(object sender, EventArgs e)
{
var path = GetExportFilePath(csvFilePath, datDate.DateTime, "FactsData.csv");
Export((int)ExportType.Facts, path);
}

15
ответ дан 2 марта 2011 в 09:03 Источник Поделиться

В дополнение к тому, что @Snowbear предполагает. Я думал, вы должны знать, что все событие click для кнопки можно указать один и тот же обработчик события. Тогда вы сможете отличить один через параметр Sender.

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

8
ответ дан 2 марта 2011 в 10:03 Источник Поделиться

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

Примечание: этот пример предполагает, что BuildingList сводится к 0, OwnerList сводится к 1, и FactsData решает 2.

private void Export( ExportType typeOfExport )
{

string[] exportPrefixes = { "BuildingList", "OwnerList", "FactsData" };

string path = csvFilePath + String.Format("{0:yyyy-MM-dd}", datDate.DateTime) + "-" + exportPrefixes[(int)typeOfExport] + ".csv";

...

}

Как Шив Кумар упомянул, можно создать отдельное событие и использовать параметр "датчик" для определения звонящего. В этом случае, получилось бы нечто вроде:

 private void unified_Click(object sender, EventArgs e)
{
if (sender is btnBuildingList)
Export(ExportType.Building);
else if (sender is btnOwnderList)
Export(ExportType.Owner);
else if (sender is btnFacts)
Export(ExportType.Facts);
}

Ли, вы чувствуете, что единого подхода чище до вас.

3
ответ дан 2 марта 2011 в 03:03 Источник Поделиться