Шаг 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
Обсудить на форуме