Отзывы о сообщении 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

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