AssertStringValues

From SunFlurry wiki
Revision as of 10:29, 28 April 2019 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  AssertStringValues (Функции работы со строками)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число
Визуальность:Нет

Функция производит проверку двух строк-массивов значений, имеющих префиксы, если необходимо, указанным методом. Если проверка неудачна, создает исключение 71 ("Assertion error").

Строки-массивы используются для хранения большого количества одинаковых по натуре строк, для которых не имеет большого смысла использовать более дорогие методы хранения, типа списков или таблиц. Функции, работающие с такими кодированными массивами, в достаточной мере оптимизированы и практически не уступают по скорости сортированным таблицам или спискам, при этом занимая меньше памяти и гораздо проще с точки зрения программирования. Некоторые возможности функций для работы с такими строками (к примеру AssertStringValues, JoinStringValues) не имеют прямых аналогов в таблицах, что делает их более удобными источниками данных, когда есть необходимость в таких специфических действиях. Иными словами: данный набор функций может выиграть в просторе программирования и уменьшении потребности в памяти, тогда как работа с таблицами обычно выигрывает в скорости. Каждая строка-массив имеет формат:

  • Для строк с префиксами: <Префикс 1><Отделитель префикса><Значение 1><Разделитель значений><Префикс 2><Отделитель префикса><Значение 2><Разделитель значений>.... Пример: "1@Иванов#2@Петров#5@Сидоров" использует отделитель префикса "@" и разделитель значений "#".
  • Для строк без префиксов: <Значение 1><Разделитель значений><Значение 2><Разделитель значений>.... Пример: "Иванов"+_NEWLINE+"Петров"+_NEWLINE+"Сидоров" использует разделитель значений _NEWLINE.

Прежде чем решить, выгодно ли использование в конкретной ситуации строк-массивов, необходимо принять во внимание несколько факторов. Строки-массивы обычно используются, если данные содержат более или менее одинаковые элементы, часто, имеют одну и ту же длину, и нет необходимости в адресации конкретных элементов, выборке из массива по каждому элементу (иначе операции над массивами теряют смысл), элементы не имеют фиксированной позиции и индекса. К примеру, если имеются массивы с большим количеством серийных номеров изделий, когда необходимо проверить все ли серийные номера из массива в документе содержались в оригинальном массиве, либо исключить из оригинального массива, все серийные номера, которые были списаны во втором массиве, данный набор функций может быть успешно применен.

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

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

Пример сравнения скорости выполнения и сложности построения между функциями JoinStringValues (команда "AND") и таблицами см. в статье Пример сравнения функций строк-массивов и таблиц

Синтаксис

AssertStringValues(<Аргумент 1>,<Аргумент 2>,<Строка-разделитель>,<Тип операции (INT)>,<Разделитель префикса>="")

Аргументы

  • <Аргумент 1> - Строка-массив для проверки.
  • <Аргумент 2> - Вторая строка-массив для проверки или аргумент с другим назначением в зависимости от типа операции.
  • <Строка-разделитель> - Строка-разделитель элементов массива. Оба массива должны иметь одинаковый разделитель.
  • <Тип операции (INT)> - Тип операции проверки. Возможны следующие значения:
    • 0: Аргумент 2 должен быть подмножеством первого аргумента, иначе будет вызвано исключение.
    • 1: Аргумент 2 не должен содержать ни одного значения первого аргумента, иначе будет вызвано исключение.
    • 2: Аргумент 2 должен быть равен первому аргументу (значения могут быть перемешаны, дубли значений разрешены), иначе будет вызвано исключение.
    • 3: Аргумент 2 должен быть равен первому аргументу (значения могут быть перемешаны, дубли значений не разрешены), иначе будет вызвано исключение.
    • 4: Аргумент 2 является числом. Все значения первого аргумента проверяются на длину, заданную вторым аргументом, если хоть одно значение имеет иную длину, будет вызвано исключение.
    • 5: Аргумент 2 является числом. Все значения первого аргумента проверяются на длину, заданную вторым аргументом, если хоть одно значение имеет иную длину, будет вызвано исключение. В первым аргументе допускаются, однако, пустые значения.
  • <Разделитель префикса (STRING)> - (необязательный аргумент) Строка разделитель префиксов значений. По умолчанию отсутствует (т.е., префиксы не используются).

Возвращаемое значение

Функция не возвращает результат, если проверка неудачна, функция вызывает исключение.

Примеры

Randomize(1);
аСтр:="";
аСтр2:="";
For i:=1 To 10000 Do
  бСтр:=Str(Random(10))+Random(10)+Random(10)+Random(10);
  бСтр2:=Str(Random(10))+Random(10)+Random(10)+Random(10);
  AppendStringToBufferedString(аСтр,бСтр+_NEWLINE);
  AppendStringToBufferedString(аСтр2,бСтр2+_NEWLINE);
EndDo;

AssertStringValues(аСтр,бСтр2,_NEWLINE,2);
//Будет вызвано исключение, с описанием, что значение с индексом 3994 первого аргумента отсутствует во втором аргументе.