комбинирующие методы - PullRequest
3 голосов
/ 21 июля 2010

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

Вот пример события нажатия кнопки в моем коде после вызова методов из файла класса:

#region DELETE selected users - button

protected void btnDeleteSelected_Click(object sender, EventArgs e)
{
    try
    {
        UserGvUtil.DeleteSelectedUsersAndProfiles(GridView1, Msg);
    }
    catch (Exception ex)
    {
        UserGvUtil.ExceptionErrorMessage(Msg, ex);
    }
    finally
    {
        UserGvUtil.RefreshGridView(GridView1);
    }
}

#endregion

Могу ли я объединить этот блок try / catch в еще один метод и переместитьэто к тому же файлу класса?Итак, единственное, что у меня есть в событии click - это одна строка кода.

Имеет ли смысл это делать?Не уверен, почему, но я хотел бы, чтобы мой код за файлами был максимально чистым и простым, чтобы я мог вносить все изменения в одном месте.

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

Ответы [ 4 ]

3 голосов
/ 21 июля 2010

Вы можете переместить материал внутри блока try в анонимный делегат, который вы передаете разделяемому методу, который имеет try / catch. Вы действительно не должны помещать обновление в наконец, все же. На самом деле, я бы подумал, что вы захотите запустить его только в случае успеха блока try.

1 голос
/ 21 июля 2010

Вы можете подключить обработчики событий вручную.

btnDeleteSelected1.Click += Events.BtnDeleteSelected_Click;
btnDeleteSelected2.Click += Events.BtnDeleteSelected_Click;
...
btnDeleteSelected3.Click += Events.BtnDeleteSelected_Click;

public static class Events
{
  public static BtnDeleteSelected_Click(object sender, EventArgs e)
  {
     ...
  }
}

Редактировать (для downvoters: ???) Код даст вам один вкладыш, и вам не придетсябеспокоиться о записи пользовательских событий, когда они все одинаковы.

Кроме того, если служебные методы имеют одинаковую подпись, вы можете использовать универсальный метод:

public void ExecuteGvMethod(Action<GridView, string> gvMethod, GridView gv, string msg)
{
    try
    {
        gvMethod(gv, msg);
    }
    catch (Exception ex)
    {
        UserGvUtil.ExceptionErrorMessage(msg, ex);
    }
    finally
    {
        UserGvUtil.RefreshGridView(GridView1);
    }
}

И в коде:

public static class Events
{
  public static BtnDeleteSelected_Click(object sender, EventArgs e)
  {
    ExecuteGvMethod(UserGvUtil.DeleteSelectedUsersAndProfiles, (GridView)sender, "hi of whatever");
  }
}
0 голосов
/ 21 июля 2010

Я рискую понизить голос, но вот мои 2 цента:

Вместо использования try / catch, используйте метод, который возвращает код состояния.Например (просто идея, вместо использования enum вы можете использовать более сложный класс):

public enum StatusCode
{
    Success = 1,
    Error =2
}

public class UserGvUtil
{
    public StatusCode getStatusAfterDelete(GridView GridView1, string Msg) 
    {
        try
        {
            DeleteSelectedUsersAndProfiles(GridView1, Msg);
            Return StatusCode.Success;
        }
        catch (Exception ex)
        {
            UserGvUtil.ExceptionErrorMessage(Msg, ex);
            Return StatusCode.Error;
        }
    }

//your other methods here
}

Затем в коде:

protected void btnDeleteSelected_Click(object sender, EventArgs e)
{
    StatusCode sc = UserGvUtil.getStatusAfterDelete(GridView1, Msg);

    //then do something with the status code if you have to:
    if (sc==StatusCode.Error) throw new Exception("Error deleting users and profiles");
    else UserGvUtil.RefreshGridView(GridView1);

}

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

0 голосов
/ 21 июля 2010

У меня много копий и вставок кода, которые абсолютно одинаковы ... (события нажатия кнопок и тому подобное)

Просто переместите весь этот код, который дублируется, за несколькощелкните обработчики в методе в отдельном классе и передайте все, что нужно (в данном случае GridView и любой другой объект MSG) в качестве параметров.Если это экономит значительное дублирование, то имеет смысл это сделать.СУХОЙ (не повторяйся) - действующий принцип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...