Перейти к содержимому

Delphi. Немного об использовании string в CASE

Каждый разработчик для улучшения понимания кода программы, пытается повысить её читабельность. Один из вариантов это сделать — использовать оператор case при тестировании значения переменной. Но, к сожалению, в Delphi этот оператор умеет работать не со всеми типами переменных. Например, он не будет работать со строками. А что делать, если всё-таки нужно проверять переменную типа string оператором case? Давайте рассмотрим один из вариантов, как это можно сделать.

Тема сама по себе старая и известная, но, почему-то, она поднимается вновь и вновь. Кажется, достаточно открыть документацию к Delphi и увидеть, что там написано английским по «белому»:
Case StatementsThe case statement may provide a readable alternative to deeply nested if conditionals. A case statement has the form:case selectorExpression of  caseList1: statement1;  ...  caseListn: statementn;endwhere 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

Ваш комментарий будет первым

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *