Перегрузка, необязательные аргументы или что-то еще? - PullRequest
2 голосов
/ 18 октября 2010

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

  1. Мой собственный объект, который содержит регулярное выражение и диапазон (для строки это диапазон длины).
  2. Список возможных значений.

Так что я могу сделать это:

public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters)
{
...
}    
public static bool Validate(string fieldValue, string fieldType, string[] possibleValues)
{
...
}  

Но для этого нужно, чтобы пользователь безобразно if.
Я также могу сделать это:

public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters=null,string[] possibleValues=null)
{
...
}  

Теперь пользователь может просто отправить свои данные без избыточности if, но я не могу убедиться, что validationParameters или possibleValues (один из них) получил значение.

Есть ли третий вариант, при котором пользователю не нужно проверять, какой метод он использует, но мне не нужно беспокоиться, что он не отправляет ни одно из двух полей (в коде, а не в документации )
Если нет, какой из этих двух способов лучше (менее подвержен ошибкам и более элегантен)?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 18 октября 2010

Я бы лично сделал два перегруженных метода. Основными причинами этого являются:

Но я не могу убедиться, что validationParameters или возможных значения (один из них) получили значение.

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

Ваша основная причина избегать этого выглядит так:

Но это требует от пользователя безобразия, если.

Однако я не вижу проблемы. Пользователю нужно будет создать либо коллекцию строк (которую я лично сделал бы IEnumerable<string> вместо string[] или params string[] possibleValues), либо ValidationParameters. Если им уже нужно создать аргументы для передачи, добавление условного выражения if кажется ненужным (каждый путь может просто вызывать проверку).

2 голосов
/ 18 октября 2010

Если они подтверждаются различными концепциями, их, вероятно, следует назвать по-разному.Скажем, ValidateByValidationParameters и ValidateByPossibleValues.Теперь возникает вопрос: почему бы вам не захотеть, чтобы вызывающий абонент тщательно выбирал, какой из них он использует?

0 голосов
/ 18 октября 2010

Вы можете перегружать методы - как вы сказали - или делать что-то вроде этого:

       enum TYPE { VAL_1, VAL_2 }

       void function(TYPE validateType, object o)
       {
        swich(validateType)
        { 
           case VAL_1:
              List<string> par = o List<String>;
              if(par != null)
              {
                 //...
              }
           break;

           case VAL_2:
              List<MyObject> par = o as List<MyObject>;
              if(par != null)
              {
                 //...
              }
          break;
        }
  }

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

0 голосов
/ 18 октября 2010

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

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