July 9

ЗначениеЗаполнено() может быть опасным

Пример вполне логичного ошибочного применения популярной функции...

Значение какой-нибудь ссылочной переменной может быть не просто пустым, а по разному пустым: пустой ссылкой, Неопределено и даже Null (если получилось из запроса с соединением без преобразования). Но есть удобная универсальная функция, которая очень помогает жить:

Результат = ЗначениеЗаполнено(Товар);

Тут ведь еще такой момент, этим кодом мы уходим от технической конкретики в сторону предметной области. Ну красота же.

Но что будет если эту функцию применять бездумно? Что будет если...

Результат = ЗначениеЗаполнено(Массив.Найти(Товар));

Ну то есть, хотим понять есть ли в массиве нужная номенклатурная позиция. В 99% все будет хорошо. Но вот если искомое в первом же элементе, то приплыли. Дело в том, что Найти() для массивов в случае успеха возвращает индекс, а не значение, а для первого элемента - это ноль, а значит, наша любимая функция ЗначениеЗаполнено() вернет Ложь. Вы представляете, к какой тяжелой труднообнаружимой ошибке приводит этот простой и вроде бы логичный код...

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

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

Понятно, что поезд давно ушел и это уже никак не изменить. Может в каком-нибудь светлом будущем появится язык в котором упор будет сделан не на скобки, отступы и странные парадигмы, а на привычную человеческую логику... А пока, в конкретном представленном примере надо делать так:

Результат = Массив.Найти(Товар) <> Неопределено;

←24 | заметка 25 | 26→