Отзывы о сообщении Gooddy (сообщение в теме «В помощь новичкам и любителям.»)

За данное сообщение: +1 Всего отзывов: 1 Положительные: +1 Отрицательные: 0
Запутанные идентификаторы.

Вроде бы все понимают проблему, и тем не менее, всё рано продолжают использовать названия, которые совершенно ничего не объясняют, либо используют короткие названия.

Вот несколько примеров того, как некоторые из нас пишут, и как им надо было писать:

I.
var 
  del, Val, MAX: longint;

Кажется что проблемы только с переменной del, но не тут то было!

var
  Divider, Value, MaxValue: LongInt;

Выводы:
1. Сокращения позволяются с общепринятыми названиями (max(imal), val(ue), i(ndex)). Но лучше их не использовать.
2. Переменные с транслитерованными русскими словами - плохая идея. Моя переменная del - транслитерация от delitel, я заменил её на английское слово Divider.
3. Используйте одинаковый регистр для всех переменных. В примере сначала del - в нижнем, MAX в верхнем регистрах, а Val - с большой буквы.
4. Идентификаторы должны иметь хорошее отношение понятность/длина. Max - короткий идентификатор, но какой максимум он отображает можно не понять, поэтому я дописал - MaxValue, и теперь точно понятно, что MaxValue - самое большое значение Value в коде.

II.

  unsigned char ts,kod,ks;
  int adr,i;

10 минут у меня ушло, только чтобы понять, что значат переменные ts и ks, а суть одной переменной (sk) я так и не понял, две (pr_z, chet) вообще не используются в коде!

  uchar NowSum, CheckSum, Code;
  int Adress, Index;

Оказалось, что ts - текущая сумма, ks - контрольная сумма, adr и i - очевидные сокращения, но как же красиво выглядит код с нормальными Adress и Index.

Прим. На языке си++ принято соглашение о именовании имён переменных с маленькой буквы. Тогда код станет такой:

  uchar nowSum, checkSum, code;
  int adress, index;

На мой взгляд читаемость немного ухудшилась, но разобраться что за что отвечает всё равно легко.

III.

...
const
  n = 15;
type
  mas = array[0..n - 1] of integer;
 
  procedure ra( var x: mas );
  var
    ind: integer;
  //...
 
  procedure printmas( const x: mas );
  var
    ind: integer;
  //...
 
  procedure ex( var x: mas; var ch: integer );
  var
    ind: integer;
  //...
 
var
  x:  mas;
  ch: integer;
begin
  Ra( x );
  printmas( x );
  ex( x, ch );
  printmas( x );
end;

Это код одного из участников нашего портала, надеюсь он не обидится, что я укажу на его ошибки.

...
const
  ArrayLength = 15;
type
  TArray = Array[0..ArrayLength - 1] of Integer;
 
  procedure FillArrayRandom( var ArrayToFill: TArray );
  var
    Index: Integer;
  //...
 
  procedure PrintArray( const ArrayToPrint: TArray );
  var
    Index: Integer;
  //...
 
  function MakeArrayPositive( var ArrayToChange: TArray ): Integer;
  var
    Index: Integer;
  //...
 
var
  WorkArray:  TArray;
  NumberOfOperations: integer;
begin
  FillArrayRandom( WorkArray );
  PrintArray( WorkArray );
  NumberOfOperations := MakeArrayPositive( WorkArray );
  PrintArray( WorkArray );
end;

Выводы:
1. Не используйте сокращения для нескольких слов даже если они кажутся вам понятными. Человеку писавшему этот код казались понятными: ch, ex, ra, ind.
2. Начинайте названия типов с буквы T. Это общее соглашение для всех дельфистов. Сишники, начинайте названия классов с большой буквы.
3. Имена параметров должны прояснять, что делает функция. Например если вы не понимаете смысл фразы Fill array random то, посмотрев на её параметр ArrayToFill, всё сразу прояснится.
4. *Оффтоп* Если процедура возвращает значение, лучше оформить её как функцию.
MakeArrayPositive( x, ch ) превратилась в ch:=MakeArrayPositive( x ).
Теперь вызывающий точно знает что в ch он ничего не передаёт процедуре, и что она точно что то ему вернёт.

Отзывы участников:

Ерёмин А.А.
Ерёмин А.А.
Отзыв: +1 +1
Отзыв добавлен: 14 июня 2011, 13:21

Отлично! Почти что готовая статья!