Идет бета-тестирование портала. Об ошибках пишите нам или на форуме.

По пустому наименованию – 2. Из цикла «Знаете ли вы платформу»

0

Занимательное программирование

19.11.2008 [26.11.2008]

Описание

Prehistoric:
Потеряв кучу времени на отладку кода типа:
ПустойКонтрагент = Справочники.Контрагенты. ПустаяСсылка();
Для каждого Строка из СписокСтрок Цикл
ТекКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(Строка);
Если ТекКонтрагент =  ПустойКонтрагент тогда
ЧтоНибудьУжеСделайСЭтим();
КонецЕсли;
КонецЦикла;

обнаружил, что при пустом значении Строки, платформа 8.1.11.67
выдает не пустую ссылку, но ссылку на первый же имеющийся элемент справочника.

Исполнившись любви к братьям 1снегам, сообщил о своём печальном опыте здесь,
надеясь, что благодарные (за сэкономленное в аналогичной ситуации время) братья
хоть немного восстановят мою пошатнувшуюся нервную систему немножкими плюсиками.

Представьте, каково пришлось моим нервам, когда столь благие мои намерения
некоторыми местными сидельцами (эпитеты опущены по соображениям безопасности) были
сходу отмечены оголтелыми минусами. Даже САМ! Владелец ресурса присоединился к ним,
что еще более опечалило моё сердце. Ну, его я могу понять и простить, большой ведь уже мальчик,
опытным путем познавший, что не следует открывать рот на Владельца, если у тебя нет на это
достаточно веской причины.

В развернувшейся, тем не менее, затем дискуссии, мои уважаемые оппоненты попытались
обосновать свою позицию. Аргументация ихняя сводится к следующему:
1. Если бы я указал в НайтиПоНаименованию() второй параметр Истина, всё было бы хорошо.
2. Оправданием того, что разработчики платформы обрабатывают отсутствие символа в строке так же, как первый символ, является «работа с индексами».
3. Указанием, что «настоящие» языки тоже показывают в строке нулевой индекс как для первого символа, так и для пустой ссылки.

По первому пункту. Я вынужден согласиться, что если баг документирован, и к нему выпущена
заплатка, то это уже не баг, а фича. Публично прошу везде, где в упомянутом блоге с моей стороны
употреблен термин «баг», читать термин «фича». Но дело-то не в том. Дело в том, что если ты не наступал
уже на эти грабли, или тебя о них не предупредили, то у тебя должны быть довольно-таки кривые мозги,
чтобы на них не наступить.
Ибо одна честная прямая извилина уверена, что символ либо есть, либо его нет.
Если символа нет, то просто потому, что его нет, он не может, не «будет соответствовать (ни) левой части наименования», ни «полностью совпадать» с любым наименованием, имеющим хоть один символ, а значит не имеет значения, какой-такой там «второй параметр». Это, в общем-то, верно. С точки зрения логики. Здравого смысла.
За исключением ситуаций в таких языках как С, Паскаль и 1С (вас не улыбнуло еще?), где в строковый
примитив разработчики из-под тишка подпихивают пустую ссылку на примитив типа литерал.
Т.е. на самом деле они работают со строкой не как с вектором (массив значений одного типа) даже,
а как со структурой. Что было несколько неожиданно. Ибо нигде не написано, что ссылку на пустую строку
1С обрабатывает как полноправный char.

По второму. А вот уж хренушки. Если для двух разных (двух разных, ахтунг? как вообще можно
сравнивать символ и отсутствие символа?!) элементов возвращается один и тот же индекс,
то это не работа с индексами, а кривая, можно даже сказать – лажовая, работа с индексами.
Индексы – это нумерация элементов вектора, ребята. А мы напоролись на структуру, т.е. индекса недостаточно,
надо указывать еще и тип элемента, отдельно – мухи, отдельно – котлета.
Да и вообще, в 1ске, в скриптовой ее части, строка символов отнесена к примитивам, так что говорить
здесь об индексах – значит привлекать выходящую за рамки «предметно-ориентированного»
программирования сущность.

Ладно, хватит. Вторая серия – завтра.

Вау! Натурально – интрига на тему байтов, это ли ни прикольно, это ли ни круто? Впрочем,
если иметь в виду «Нерпу» - не прикольно. Как знать, не индексы ли строки там обрабатывались?
Итак, продолжим. С утра признаю сразу, что я – не программист. Во всяком случае, в древнейшем смысле этого слова.
Во всяком случае – не такой программист, как мои уважаемые оппоненты.

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

Ага, вот по ходу другая цитатка, С.С.Лавров, ПРОГРАММИРОВАНИЕ. МАТЕМАТИЧЕСКИЕ ОСНОВЫ,
СРЕДСТВА, ТЕОРИЯ: «…простые типы. …а если строки считаются простыми значениями, то и string (строка).»
Ключевое слово – «считаются». Числются, значит. Имеются в виду.
В 1ске, повторюсь, в скриптах, строка объявлена примитивом. Если ты поверил в это, у тебя будут проблемы.

Так. Это был не Лавров. А кто же? Ага, вот. Кажется, это были П.Ноутон и Г.Шилд, JAVA 2.
Нортон и Шилд – правильные программисты, однозначно.
И они не определяли заморочки типа string. Есть char – символ.
Символы в Яве – это индексы в наборе символов Unicode.
Вот. С этого места начинаем цитировать:
«Строковые литералы в Java определяются так же, как в большинстве других языков – включением
последовательности символов между парой двойных кавычек… В большинстве других языков, включая С/С++,
строки реализованы как массивы символов. Однако в Java дело обстоит не так. Строки – фактически объектные
типы.»

Во как. Что с этого имеем? Ну, прежде всего, объявление строки примитивом в 1сных мануалах – полная лажа,
которая, впрочем, вполне съедобна, если вы в состоянии дочитать ее до того места, где говорится о необходимости
«установить второй параметр для полного совпадения». Ну, да. Была бы съедобна, если бы эти ребята здесь малость
продолжили: «в том числе пустой строки именно с пустой строкой, а не с любой непустой».
Ну, теперь я сделал это доброе дело.

Следующим шагом проверим, на всякий случай, покажет ли 1ска наличие пустой строки в непустой строке в запросе.

**
ниже идет первоначальный текст блога
____
На тему "знаете ли вы 8" ((8.1.11.67))
__
я тут заметил между делом
http://www.infostart.ru/projects/2909/#comm30
а потом решил, помочь "братьям"
__
Например, если братья поверят 1су, что
"НайденнаяСсылка = Валюты.НайтиПоНаименованию(СтрокаНаименования);"
Возвращаемое значение:
Тип: СправочникСсылка. Ссылка на найденный элемент справочника. Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка."
и, поверив, будут рассчитывать получать пустую ссылку, когда для поиска передадут пустую строку (зная наверняка, что пустых наименований в справочнике нет), то нарвутся на такое грабло:
возвращаться будет первый же элемент справочника.

Ну. чтобы "братья" не повторяли моей ошибки (не тратили время на поиски этого бага), собственно, и выкладываю это сюда :)

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

Оценка сообщества

Плюсы (+8):

, , , , , , ,

Минусы (– 8):

, , , , , , ,


Добавить плюс Добавить минус

Комментарии (112)

Страницы: 123 ... 6Вперед

1.
+ -
19.11.2008 13:11:48

Причем тут баг? Все работает правильно - как и заявлено в хэлпе. Хочешь найти точное соответствие - используй второй параметр Истина.

2.
+ -
19.11.2008 13:11:42

блин, не буду больше помогать таким "братьям".
Для идиотов, еще раз, последний:
1. в хелпе написано. что если в справочнике нет элемента с таким наименованием. возвращается пустая ссылка.
2. в справочнике нет элемента с наименованием = ""
3. ссылка возвращается не пустая, на первом же элементе справочника.
Понял. тупой?

[-]: ,
3.
+ -
19.11.2008 13:11:36

(2) Из хэлпа:
"Поиск будет успешным, если строка поиска: в случае значения параметра Ложь - будет соответствовать левой части наименования; в случае значения параметра Истина - будет полностью совпадать с наименованием (за исключением "хвостовых" пробелов в наименовании)."

- где ты тут увидел "что если в справочнике нет элемента с таким наименованием".

4.
+ -
19.11.2008 14:11:25

"тут" я вижу перевод стрелок на "хвостовые" пробелы.
Разработчики не доделали алгоритм для предельного случая, когда в наименовании вообще нет ничего, кроме одного большого "пробела".
Встречный такой же глупый вопрос: сколько пробелов ты насчитаешь в строке же поиска = ""? (зы: я не нашел ни одного)

5.
+ -
19.11.2008 14:11:17

Поиску по пустой строке, если в справочнике нет элементов с пустым наименованием, должна соответствовать пустая ссылка, а соответствуют (в чем и состоит баг) - все имеющиеся элементы.

6.
+ -
19.11.2008 14:11:12

открыли табло, настучали выражение ""=" ", жамкнули ентер, получили "ложь"

7.
+ -
19.11.2008 14:11:40

"будет соответствовать левой части наименования" - ты эти слова не видишь чтоли?

8.
+ -
19.11.2008 14:11:58

Можно дать такое определение: баг состоит в том, что первым знаком строки наименования в данном случае считается (по версии хелпа и ГорячегоПарня) отсутствие знака.
Те, кто привык считать NULL отсутствием, а не нулем, на эти грабли наступят. (если не прочитают этот замечательный блог :)

9.
+ -
19.11.2008 14:11:49

что есть "часть наименования"? пусть даже крайняя левая? определенно - буква. или цифра. или пробел. короче, несколько байтов. но никак не отсутствие каких бы то ни было байтов.

10.
+ -
19.11.2008 14:11:24

NULL <> ПустоеЗначение
может, так будет понятно?

11.
+ -
19.11.2008 14:11:54

(9) "" + Наименование = Наименование. А ты и задаешь для поиска "", которая находится в левой части. Так что все тут с логикой в порядке.

12.
+ -
19.11.2008 14:11:18

не-а
из Найти("PowerBoy","")=1 (по версии 1С) не следует, что считать отсутствие символа символом - правильно, не по-скульному это
об этих-то граблях и завел речь.
Но, конечно. у 1С (и многих 1снегов, соответственно) всегда была своя, особенная логика. Так что, зря я на тебя обиделся. извини :)

13.
+ -
19.11.2008 14:11:25

патамушта по-1сному Найти("PowerBoy","") = Найти("PowerBoy","P") = истина
а стало быть P == ""
гы-гы-гы
Ну. что исправляешь - на +?

14.
+ -
19.11.2008 15:11:25

Заметь, в Найти() - никаких "вторых параметров" и "хвостовых пробелов", отмазаться нечем :)

15.
+ -
19.11.2008 17:11:49

(12) И логика эта совсем придумана не 1С, возьмем к примеру Foxpro:
? "Чтото" = "" - Истина
Логика эта идет от индексного поиска значений. Так просто принято во всех СУБД.

16.
+ -
19.11.2008 17:11:35

1. Я не вижу за что здесь хаять 1с.
2. Это не баг, а заявленная функциональность.

Если поправишь свой блог, то и минус уберу. :)

17.
+ -
19.11.2008 17:11:52

Все таки согласен с (1), отрабатывает верно.

18.
+ -
19.11.2008 17:11:58

1снег, я же сказал, что понял и не обижаюсь.
твой минус - это характеристика тебя
это для тебя, 1снег (и для Душелова, старого 1снега, конечно, и для собственно 1С)
Найти("PowerBoy","") = Найти("PowerBoy","P") - правильно
а по мне - баг

19.
+ -
19.11.2008 17:11:30

из-за таких "профессионалов", как Вы, срабатывает противопожарная автоматика на подлодках

20.
+ -
19.11.2008 17:11:38

(18) При чем тут 1снег?
Код на c#:

string str = "PowerBoy";
int a1 = str.IndexOf("");
int a2 = str.IndexOf("P");

Результат: а1 = 0, а2 = 0, т.е. а1 = а2.

Страницы: 123 ... 6Вперед

Для добавления комментария необходимо зарегистрироваться.
Есть вопросы?
тел. (812) 309-06-46
support@infostart.ru
Обратная связь
Логин :
Пароль :
Забыли пароль?

Статистика

Пользователей: 43876

См. также