варианты использования функции - PullRequest
0 голосов
/ 28 марта 2011

У меня есть вопрос, касающийся вариантов использования функций, в каких случаях я должен использовать какие функции ниже?

void function(string k,string l)
{
    if(k!=null &l!=null)
    {
        //do some operation on k and l 
    }
}

void function(string k,string l)
{     
    //do some operation on k and l
    //i do understand that i get nullreference 
    //exceptions for null values of k and l
    //one use case i have seen this type of function: in a class
    //private methods when u are sure of passing non-null objects.
}


void function(string k,string l)
{     
    if (k==null)
        throw new ArgumentNullException("k is null");
    if (k==null)
        throw new ArgumentNullException("l is null");
        // do some operation on k and l
}

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

Пожалуйста, перечислите варианты использования для каждой функции.

Ответы [ 5 ]

3 голосов
/ 28 марта 2011

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

Первое решение почти никогда не должно использоваться.Только при обстоятельствах, когда чрезвычайно ясно для вызывающей стороны, что код не будет выполняться, если значения равны нулю, если будет использоваться этот вид техники.(но не знаю слов) это Дизайн по контракту .DbC - это методика / парадигма проектирования, в которой разработчик устанавливает явные контракты с вызывающими сторонами, следуя очень специфическим правилам, касающимся того, как обрабатываются входные данные и что обещает каждый метод.Правильно составленный контракт сделает явным для вызывающей стороны, как именно метод будет вести себя при любом вводе.

1 голос
/ 28 марта 2011

Ваш вопрос на самом деле: где я должен обнаруживать ошибки в аргументах и ​​что мне делать, если я их обнаруживаю - другими словами, кто должен обрабатывать ошибки?

Где обнаружить: Случаи № 1 и № 3 обнаруживаются в подпрограмме. Случай № 2 обнаруживает вызывающая сторона (поскольку подпрограмма не может выдавать исключение при ошибках аргумента - она ​​может выполняться, просто предоставляя неверные результаты)

Кто обрабатывает: Case # 1 обрабатывает в подпрограмме. Дело № 2 и дело № 3 обрабатываются вызывающим абонентом.

Я всегда рекомендую Случай № 3. Причины:

  1. Дело № 1 молча провалилось. Звонящий может никогда не узнать, если вы не вернете код ошибки.
  2. Случай № 2 слишком непредсказуем, поскольку вызывающая сторона отвечает как за обнаружение, так и за обработку. Если вызывающий абонент считает, что вызов в порядке, а затем вы измените реализацию подпрограммы, он может нарушить код вызова.

Предложения с .NET: Установите контракты кода. Таким образом, вы получаете статическую проверку аргументов. Вы можете сделать:

string MyFunction (string k, string l)
{
    Contract.Requires(!string.IsNullOrWhiteSpace(k));
    Contract.Requires(!string.IsNullOrWhiteSpace(l));
    Contract.Ensures(!string.IsNull(Contract.Return<string>()));
         :
}
0 голосов
/ 28 марта 2011

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

второй формат: как указано, один вариант использования - это частные методы, где параметры проверяютсяранее.Другим примером может быть случай, когда вы хотите отслеживать случаи, когда k или l равны нулю.Эти случаи могут быть признаком проблемы, и вы хотите, чтобы верхние уровни отслеживали их через исключение времени выполнения.

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

0 голосов
/ 28 марта 2011

Использование: обрабатывает случай, когда k или l равны нулю, ничего не делая. Используется в тех случаях, когда с недопустимыми параметрами ничего не следует делать.
Примечание. Возможно, вы имели в виду && вместо &

void function(string k,string l)
{
 if(k!=null &l!=null)
   {
    //do some operation on k and l 
    }
}

Использование: Игнорирует вероятность того, что k или l равны нулю. Используется, если вы точно знаете, что k и l были созданы.

void function(string k,string l)
{     
   //do some operation on k and l
   //i do understand that i get nullreference 
   //exceptions for null values of k and l
   //one use case i have seen this type of function: in a class
  //private methods when u are sure of passing non-null objects.
}

Использование: обрабатывает случай, когда k или l равны нулю, заставляя вызывающее местоположение обрабатывать ошибку. Используется в случаях, когда функция не обладает достаточными знаниями для правильной обработки ошибки.

void function(string k,string l)
    {     
       if (k==null)
          throw new ArgumentNullException("k is null");
       if (k==null)
          throw new ArgumentNullException("l is null");
       // do some operation on k and l
    }
0 голосов
/ 28 марта 2011

В большинстве случаев я иду на это:

void function(string k,string l)
{
 if(k!=null && l!=null)
  {
    //do some operation on k and l ..
  } else {
    //throw exception / other error handling...
  }
}

Если есть вероятность, что аргументы могут быть нулевыми объектами, лучше всего проверить их в начале вашей функции и предпринять необходимые действия.

Приведенный выше стиль кодирования также является стандартом кодирования Java (где вы сравниваете! = Ноль). стандарты рекомендуют использовать его вместо сравнения == для нуля.

Кодирование функции без проверок не является хорошим. Но для небольших проектов и надежных функций съемки вы можете избежать проверки.

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