Delphi. Немного об использовании string в CASE
Каждый разработчик для улучшения понимания кода программы, пытается повысить её читабельность. Один из вариантов это сделать - использовать оператор case при тестировании значения переменной. Но, к сожалению, в Delphi этот оператор умеет работать не со всеми типами переменных. Например, он не будет работать со строками. А что делать, если всё-таки нужно проверять переменную типа string оператором case? Давайте рассмотрим один из вариантов, как это можно сделать.
Тема сама по себе старая и известная, но, почему-то, она поднимается вновь и вновь. Кажется, достаточно открыть документацию к Delphi и увидеть, что там написано английским по "белому":
Case Statements The case statement may provide a readable alternative to deeply nested if conditionals. A case statement has the form:
case selectorExpression of where selectorExpression is any expression of an ordinal type smaller than 32 bits (string types and ordinals larger than 32 bits are invalid) |
И всё становится ясным: string types are invalid! Ну, нельзя сделать CASE по string! И всё.
Однако....
Если припомнить, что основная задача оператора CASE - повышение читабельности кода программы. Что собственно и подтверждено в процитированном выше фрагменте HELP'а The case statement may provide a readable alternative to deeply nested if conditionals. И посмотреть на вопрос об использовании string в CASE уже с этой точки зрения, то возникает совсем другое дизайнерское решение!
И так, предположим, переменная типа string, которую хочется использовать в CASE, может принимать значения: 'english', 'deutsch', 'русский' или 'français'.
А раз, все строковые значения переменной можно перечислить, то почему бы не воспользоваться перечислимым типом для этого, ведь с перечислимым типом оператор CASE работает прекрасно:
И смотрится оператор CASE в таком случае почти как "по string":
Остаётся лишь научиться находить элемент перечислимого типа, который по написанию совпадает со значением строковой переменной - фактически выполнить преобразование строки в элемент перечислимого типа, если такой, конечно, существует. Необходимый инструмент для этого находятся в unit TypInfo, а общая схема действий вырисовывается примерно следующая:
Ну и "на десерт" остаётся добавить фрагмент работающего кода:
А все остальные нюансы и "специи" добавляются по вкусу.
Комментарии
Проверил на Delphi RAD Studio 10.2 - код из статьи работает. Вы сами то пробовали или просто предполагаете?
RSS лента комментариев этой записи