Как же не хватает в дотнете типа StringNotNull. Чтобы быть гарантированно уверенным, что параметр не может быть null и не проверять в 100 методах его перед обработкой.
Полностью аналогичное обычному String, но при этом чтобы переменной этого типа невозможно было присвоить null и соответственно методы объекта никогда не могли упасть с NPE.
1) нужно. Не этот случай, проехали. 2) НЕ НУЖНО. Никому нахер не нужна обработка "ААА! Параметр нулевой!". Один вред от такого кода. 3) нужно, но по хитрому. Тогда я обычно юзаю хелперы (this)
псевдокод: public static string Scheisse(this string paramName) { if (paramName == null) return 'Scheisse' else return paramName; }
У меня стандартный случай такой: нужно принятую строку обработать, не учитывая регистр. Я ее привожу, например, к нижнему, в виде s.ToLower(). Если при этом предварительно не проверить на !=null - все сыпется с малопонятными исключениями, не дай бог кто-то передаст null.
Это как const в плюсах. Когда хоть где-то возникают нот-налл типы, они просачиваются во всю прилагу. А когда просачиваются, то возникают вопросы, например:
1) Что делать с неинициализированными филдами классов в момент вызова конструктора? С одной стороны, если какие-то из них помечены как not-null, то как же тогда выполнять тело конструктора - ведь в какой-то момент (до присваивания этому филду значения) контракт будет нарушен.
2) Что делать с вызовами базового конструктора? С одной стороны, хочется сделать как обычно - выполнить его до конструктора наследника, но если у наследника есть филд not-null, ну дальше понятно.
3) Веселые косяки ждут дизайнера языка, если он решит консистентности ради разрешить массивы not-null типов. Тот же вопрос - что делать с инициализацией?
Кароче - в языках, где возможны частично инициализированные объекты, например, во всех ОО-языках, введение not-null типов порождает или неиллюзорный гемор, или неконсистентность, или и то, и другое.
no subject
Date: 2010-01-31 07:26 pm (UTC)no subject
Date: 2010-01-31 07:27 pm (UTC)no subject
Date: 2010-01-31 07:31 pm (UTC)Там был больше сарказм, чем собственно вопрос :)
no subject
Date: 2010-01-31 07:30 pm (UTC)no subject
Date: 2010-01-31 07:52 pm (UTC)no subject
Date: 2010-01-31 07:36 pm (UTC)no subject
Date: 2010-01-31 07:41 pm (UTC)no subject
Date: 2010-01-31 07:41 pm (UTC)no subject
Date: 2010-01-31 07:51 pm (UTC)Но собственно можно ведь Spec# заиспользовать. Прямое так сказать назначение. В чём проблема? ;-)
no subject
Date: 2010-01-31 07:53 pm (UTC)no subject
Date: 2010-01-31 08:06 pm (UTC)Проверять обычно или:
1) нужно. Не этот случай, проехали.
2) НЕ НУЖНО. Никому нахер не нужна обработка "ААА! Параметр нулевой!". Один вред от такого кода.
3) нужно, но по хитрому. Тогда я обычно юзаю хелперы (this)
псевдокод:
public static string Scheisse(this string paramName)
{
if (paramName == null)
return 'Scheisse'
else
return paramName;
}
no subject
Date: 2010-01-31 08:09 pm (UTC)no subject
Date: 2010-01-31 08:11 pm (UTC)no subject
Date: 2010-01-31 09:06 pm (UTC)no subject
Date: 2010-01-31 09:09 pm (UTC)no subject
Date: 2010-02-01 08:59 am (UTC){
return String.IsNullOrEmpty(p)?"":p;
}
S(s).ToLower()
Да ты и сам это знаешь :-)
Кстати, мне кажется, что таки в этом случае правильно делать параметр для поля и в геттер всовывать проверку, чтобы нулл не могли присвоить.
no subject
Date: 2010-01-31 08:28 pm (UTC)no subject
Date: 2010-01-31 09:44 pm (UTC)1) Что делать с неинициализированными филдами классов в момент вызова конструктора? С одной стороны, если какие-то из них помечены как not-null, то как же тогда выполнять тело конструктора - ведь в какой-то момент (до присваивания этому филду значения) контракт будет нарушен.
2) Что делать с вызовами базового конструктора? С одной стороны, хочется сделать как обычно - выполнить его до конструктора наследника, но если у наследника есть филд not-null, ну дальше понятно.
3) Веселые косяки ждут дизайнера языка, если он решит консистентности ради разрешить массивы not-null типов. Тот же вопрос - что делать с инициализацией?
Кароче - в языках, где возможны частично инициализированные объекты, например, во всех ОО-языках, введение not-null типов порождает или неиллюзорный гемор, или неконсистентность, или и то, и другое.
no subject
Date: 2010-02-01 09:29 am (UTC)no subject
Date: 2010-02-01 04:40 pm (UTC)