2014-10-22 2 views
-1

У меня есть три потенциальные категории ввода, являющиеся именем человека, именем компании или адресом, соответственно.Уместно ли здесь использовать делегат?

Игнорирование моих заполнителей и специальных методов, вот два из них:

protected void nameSearch_Click(object sender, EventArgs e) 
     { 
      if (offRadio.Checked == false && comRadio.Checked == false) 
      { 
       errorAlert("Please specify the search type"); 
      } 
      else 
      { 

       strValidator(nameBox.Text);// This is the function I need to change. 
          //In it's current condition, it will only validate against 
          // general properties, however to do more in depth 
          // validation, the validation method needs to be dependant 
          // on the type of input 


       if (nameBox.Text != string.Empty) 
       { 
        if (offRadio.Checked == true) 
            //This is an input of the person name category 
        { 
         logic.createQuery(fnms(nameBox.Text), 
                "personName", lnms(nameBox.Text)); 
        } 
        else if (comRadio.Checked == true) 
            //And this is of the Company name category 
        { 
         logic.createQuery(nameBox.Text, "companyName"); 
        } 
       } 
       else 
       { 
        errorAlert("Please enter a search parameter"); 
       } 
      } 
     } 

Целью здесь является анализ вклада от nameBox.Text и ветеринара это против протоколов анти-инъекций. Я хотел бы в идеале использовать один метод для этого, и для этого метода быть разными в зависимости от того, является ли вход от имени человека (offRadio.Checked = true) или название компании (comRadio.Checked = true). I может иметь два метода (или даже один, основанный на условии), но это приведет к тому, что nameSearch_Click() станет относительным трясином вложенных операторов, чего я бы хотел избежать.

Согласно некоторым моим исследованиям, способ сделать это - использовать пустоту делегата, однако я не понимаю, как это реализовать. Является ли мой метод валидации делегатом? Или мне нужно создать новый метод делегирования и переместить содержимое моего Click событий?

Кроме того, как добавить логику, чтобы определить, что такое категория ввода?

+0

Почему 'делегат'? Не можете ли вы назвать некоторый метод класса проверки с некоторыми параметрами (значениями переключателей или значением «enum» на основе их значений)? Например, 'Validator.CheckUrl (textBoxUrl.Text, Validator.Mode.TrimSpaces);' – Sinatr

+0

@Sinatr. Идея заключалась в том, чтобы сохранить код как можно меньше, однако вы можете быть правы в том, что ваше предложение может быть моим ... «безопасный» вариант. – Wolfish

+0

Show пожалуйста * большой * код и посмотрим. – Sinatr

ответ

0

Создание VALIDATE делегат будет приемлемым подходом:

delegate void Validate(string text); 

protected void nameSearch_Click(object sender, EventArgs e) 
{ 
    Validate validate; 

    if (offRadio.Checked) 
     validate = PersonNameValidator; 
    else if (comRadio.Checked) 
     validate = CompanyNameValidator; 
    else 
     validate = GeneralValidator; 

    validate(nameBox.Text); 

    ... More code, blah blah ... 
} 

private void PersonNameValidator(string text) 
{ 
    // Validate person name 
} 

private void CompanyNameValidator(string text) 
{ 
    // Validate company name 
} 

private void GeneralValidator(string text) 
{ 
    // Validate general properties 
} 

Обычно, я бы ожидать Validate делегат типа возврата bool так что он может вернуться false на провал, или true на успех. Таким образом, методы проверки достоверности ограничиваются только обработкой валидации. Вызывающая функция будет отвечать за обработку отказа/успеха.

+0

Использование делегатов здесь не добавляет значения. Вместо того, чтобы назначать делегат, вы можете просто вызвать метод; он был бы функционально идентичен. – Servy

+0

@Servy Возможно, вы правы. Тем не менее, я лично нахожу намерение более ясным, особенно если цепочка if/else делает больше, чем просто присваивает переменную validate. Он ставит валидационный вызов в одном месте, а не распространяется на несколько строк if/else messiness. Он также четко показывает и гарантирует и что методы проверки имеют одинаковую подпись. У вас не может быть один валидатор, возвращающий bool, а другой возвращает что-то еще. – itsme86

+0

@Servy В этом случае, я думаю, я согласен с itsme86 здесь, хотя я узнал немного больше о делегатах и ​​внедрил его несколько иначе. – Wolfish

Смежные вопросы