Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / [C#] Где лучше делать проверку [Решено]

[C#] Где лучше делать проверку [Решено]

Поделиться
smartxpПользовательwww4 дек. 201720:38#0
Первый пример

Где здесь лучше прописать проверку (str != null):
1 - Перед первым вызовом функции
2 - Внутри последней функции
3 - Перед каждым вызовом и внутри функции
4 - Другой вариант

public class Two
{
  public static void Function(string str)
  {
    Console.WriteLine(str);
  }
}

public class One
{
  public static void Function(string str)
  {
    Two.Function(str);
  }
}

public class Test
{
  public static void Main()
  {
    string str = null;
    One.Function(str);
  }
}

Второй пример

Где здесь лучше прописать проверку (str != null):
1 - До вызова функции Function
2 - Внутри функции
3 - До вызова и внутри функции
4 - Другой вариант

public class Test
{
  public static void Main()
  {
    string str = null;
    Function(str);
  }
  
  public void Function(string str)
  {
    Console.WriteLine(str);
  }

}

Да, примеры похожие.
Может это глупый вопрос, но меня он уже измучил.

CasDevПостоялецwww4 дек. 201721:00#1
Пиши две функции. Первая - с secure проверкой на null, вторая - реализация (вызывается из первой после проверки).
Если точно знаешь, что не null, вызываешь напрямую, и наоборот.

Есть книга: Джон Скит "C# для профессионалов. Тонкости программирования", там это разобрано в том числе для Enumerator. Сверху public метод с проверкой на null аргументов и выбросом исключения, в привате - реализация без проверки.
Но я бы делал оба метода публичными. Культура кода, и всё такое, тоже должно быть.

derketzenПостоялецwww5 дек. 20171:24#2
Для Вашего вопроса нету категорично правильного ответа.
Есть разные подходы - Design by Contract и Defensive Programming.
DbC подразумевает, что для вызываемой функции/метода/класса Вы гарантируете все условия для их успешного выполнения.
DP, же, наоборот - фукнция/метод/класс самостоятельно гарантируют свою работу вне зависимости от переданных параметров.
Очень хорошо они работают вместе, как уже указывал CasDev, для приватных вызовов - DbC, для публичных DP.
Я бы поставил во внутренних методах асерты, что бы гарантировать правильность их использования. Ну а во внешних уже проверки на null.
Сразу скажу не стоит абсолютно везде использовать DP, т.к. когда происходит ошибка, а программа продолжает работать, то, зачастую, очень сложно найти источник проблемы.

loysoПостоялецwww5 дек. 20174:32#3
smartxp
Contract.Requires(str != null);
чтобы ловило в compile-time.
https://www.microsoft.com/en-us/research/project/code-contracts

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр