November 23

Правильный поиск в строке с разделителями

Чтобы понять проблему, как всегда рассмотрим несколько утрированный пример...

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

СуммаОборота; СуммаОборотаСНДС; ээНачальныеПоказания; ээКонечныеПоказания

Так вот, на каком-то этапе некий парсинг ищет в этой строке. Как искать правильно? Допустим простое решение в лоб:

Если Найти(СтрокаПоказателей, СтрокаПоиска) Тогда

Но ведь косяк же. Видите его? Честно признаюсь, я несколько раз больно натыкался. Например:

Если Найти(СтрокаПоказателей, "СуммаОборота") Тогда

Поиск будет неожиданно успешным если суммы оборота в показателях нет, зато есть сумма оборота с НДС. Обидно. Что делать в таких случаях?

Понятно, что если перед поиском строку переделать в массив и искать в нем, все будет в порядке. Но тратить на это время, особенно если таких строк много и наш парсинг работает в цикле, такое себе решение.

Добавить в строку поиска разделитель? Но у последнего элемента разделителя же нет. Ну так в чем проблема, давайте его добавим и в строку показателей (один раз прямо перед поиском):

СтрокаПоказателей = ХранящаясяСтрокаПоказателей + ";";

Если Найти(СтрокаПоказателей, СтрокаПоиска + ";") Тогда

Вот теперь все хорошо.

Еще один важный момент. Понятно, что к поиску надо всегда относится аккуратно. Ну а наименование любых сущностей надо продумывать с удвоенной внимательностью. Что такое эта наша СуммаОборота? Какая она, с НДС или без НДС, ведь это же неочевидно, это почему-то надо помнить, и программистам, и пользователям. А вот если бы было явно: СуммаОборотаБезНДС, СуммаОборотаСНДС, то ошибки поиска бы не возникло. В итоге вырисовывается полезное правило:

Если в наименование какой-либо сущности добавляется уточнение, то тогда не должно быть случаев без этого уточнения.

←35 | заметка 36