Шаг 1.5. Оформительный
Мало написать работающую программу, надо ещё написать её красиво, удобно и понятно окружающим. Даже если в ней 10 строчек)
Поэтому-то помимо основных статей будут промежуточные, а-ля «Пишем красиво и правильно»
Первая заповедь - комментарии!
Чем больше Вы опишите - тем лучше: что делает сама программа (да-да, а то через месяц - другой сложновато разобраться, какой проект за что отвечает только по названию и быстрому взгляду), что делает та или иная функция, цикл, за что отвечают переменные и константы и так далее.
Но комментарии должны быть и осмысленными, не подтверждать очевидное. Например, описывая «iCurrentSymbol = iCurrentSymbol + 1;», вместо комментария «увеличиваем переменную на единицу» стоит написать что-то вроде «переходим на следующий символ».
Что же ещё мы можем исправить в нашей малюсенькой программке?
А вот что: «магические числа» - чем их меньше, тем лучше.
«Магическое число» - число, используемое для однозначной идентификации ресурса или данных (да здравствует Википедия!). В общем, практически любые числа, используемые в программе, когда мы что-то присваиваем, с чем-то сравниваем, на самом деле должны быть записаны как константы - вдруг нам надо будет их поменять?
Заодно возникает проблема - а как обозвать эти новоиспечённые константы и переменные? Ответ - логично, соответственно их будущему содержимому - никаких «a», «b1», «b2», ну, кроме, если только, канонических счётчиков i и j.
Посмотрим на примере, что у нас с этими самыми «магическими числами» и как всё можно исправить:
На С:
void main() { DDRB = 0b00100000; //задаём порты B на выход PORTB = 0b00100000; //по умолчанию все выключено while(1) { PORTB.B5 = ~PORTB.B5; //переключаем состояние светодиода на обратное Delay_ms(100); //делаем задержку на 100 миллисекунд } }
Внимание: номер вывода порта тоже является магическим числом!
Аналогично на Pascal-е:
{ Мигание светодиодиком } program First; begin DDRB := %00100000; //задаем порт B на вывод PORTB := %00100000; //по умолчанию все выключено while(true) do begin PORTB.B5 := not PORTB.B5; //переключаем состояние светодиода на обратное Delay_ms(100); //делаем задержечку end; end.
Единственное, что мы оставим тут, это условие бесконечного цикла - "1" на Си и "true" на Паскале.
Начинаем творить константы! Для начала определимся с типом (для Паскаля это неактуально - тут для констант тип указывать не обязательно, компилятор сам разберется). В Си же все требуемые константы будут размером 1 байт - берём тип unsigned char. Но писать "unsigned char" каждый раз очень долго, поэтому мы схитрим - используем переопределение типов: в самом-самом начале программы напишем магическую команду «typedef unsigned char byte» и далее везде вместо «unsigned char» можно писать «byte» - и короче, и понятнее!
Также помним о разумных названиях переменных!
Получаем следующее на Си:
//Мигающий светодиод //переопределение типов typedef unsigned char byte; void main() { //переменные и константы const byte ddrLEDInit = 0x30; //настройка выводов порта B - вывод B.5 на выход, все остальное на вход const byte portLEDInit = 0x30; //начальное значение порта B - вывод B.5 подтянут к единице, все остальное без подтяжки const byte DelayTimeMs = 100; //время задержки в мс const byte LED_OutputNumber = 5; //инициализация порта DDRB = ddrLEDInit; PORTB = portLEDInit; while(1) { PORTB.LED_OutputNumber = ~PORTB.LED_OutputNumber; // переключаем состояние светодиода на обратное Delay_ms(DelayTimeMs); //делаем небольшую задержку } }
Теперь расправимся с программой на Паскале:
{Мигание светодиодиком} program First; const ddrLEDInit = $30; //настройка выводов порта B - вывод B.5 на выход, все остальное на вход portLEDInit = $30; //начальное значение порта B - вывод B.5 подтянут к единице, все остальное без подтяжки DelayTimeMs = 100; //время задержки в мс LED_OutputNumber = 5; begin DDRB := ddrLEDInit; //задаём порт B на выход PORTB := portLEDInit; //по умолчанию ничего не горит while(true) do begin PORTB.LED_OutputNumber := not PORTB.LED_OutputNumber; //переключаем состояние светодиода на обратное Delay_ms(DelayTimeMs); //делаем небольшую задержку end; end.
Ещё мы использовали запись констант в шестнадцатиричном виде, а не двоичном - так короче, и через некоторое время начинаешь автоматически переводить числа из одной системы в другую без потери времени; а также мы отделили пустыми строчками логические блоки программы (объявление переменных и констант, циклы и вообще какие-либо законченные группы действий) - так становится гораздо удобнее читать и понимать код.
Автор - Moriam
Обсудить на форуме