Загадочные числа
Определяйте числа как константы, а не как макросы.
Программисты, пишущие на С, традиционно использовали для определения загадочных чисел директиву #define. Однако препроцессор С – мощный, но несколько туповатый инструмент, а макросы – вообще довольно опасная вещь, поскольку они изменяют лексическую структуру программы. Пусть лучше язык делает свойственную ему работу. В С и C++ целые (integer) константы можно определять с помощью выражения enurn (которое мы и использовали в предыдущем примере). В C++ любые константы можно определять с помощью ключевого слова const:
const int MAXROW = 24, MAXCOL = 80;
В Java для этого служит слово final:
static final int MAXROW = 24, MAXCOL = 80;
В С также можно определять значения с помощью ключевого слова const, но эти значения нельзя использовать как границы массива, так что зачастую придется прибегать все к тому же enum.
Используйте символьные, а не целые константы.
Для проверки свойств символов должны использоваться функции из <ctype .h> или их эквиваленты. Если проверку организовать так:
? if (с >= 65 && с <= 90) ?….
То ее результат будет всецело зависеть от представления символов на конкретной машине. Лучше использовать:
if (с >= 'А' с <= 'Z') ?…
Но и это может не принести желаемого результата, если буквы в имеющейся кодировке идут не по порядку или если в алфавите есть и другие буквы. Лучшее решение – привлечь на помощь библиотеку в С и C++:
if (isupper(c))
Или в Java:
if (Character .isllpperCase(c))
Сходный вопрос – использование в программе числа 0. Оно используется очень часто и в различных контекстах. Компилятор преобразует это число в соответствующий тип, однако читателю гораздо проще понять роль каждого конкретного 0, если тип этого числа каждый раз обозначен явным образом. Так, например, стоит использовать (void *)0 или NULL для обозначения нулевого указателя в С, а ' \0' вместо просто 0 – для обозначения нулевого байта в конце строки. Другими словами, не пишите:
А пишите:
Мы рекомендуем использовать различные явные константы, оставив 0 для простого целого нуля, – такие константы обозначат цель использования данного значения. Надо отметить, правда, что в C++ для обозначения нулевого указателя принято использовать все же 0, а не NULL. Лучше всего проблема решена в Java – там ключевое слово null определено как ссылка на объект, которая ни к чему не относится.