plakapenka
Специалист
Здаров.
Следуйте стандартам оформления кода
Исходный код должен быть написан так, чтобы максимально улучшить читаемость независимо от среды
В прошлом уроке я уже показывал вам стили отступов:
Стиль «K&R»:
Стиль Олмана:
Стиль GNU:
Теперь рассмотрим стили написания составных слов:
Стандарты оформления кода в SA-MP:
Переменные именуются в стиле snake_case
Функции именуются в стиле CamelCase
Константы именуются в стиле UPPER_CASE_SNAKE_CASE
Условие следует размещать в отдельной строке
Пробелы
Давайте наглядные имена
Не экономьте на длине имени, лучше более длинное и более понятное (даже новичкам) имя.
Можно догадаться, что, наверное, это пикап банка.
Но что из них будет выход, а что вход? Что первым попадется под руку.
Этот пример можно также отнести к магическим числам. Но об этом позже..
Функции, которые возвращают только логические значения (1/0), следует именовать с префиксом is
В некоторых ситуациях префикс is лучше заменить на другой: has, can или should:
Используйте префиксы для переменных, которые хранят идентификатор чего-либо:
Комментируйте
Оставляйте комментарии для сложных участков кода, непонятных функций. И везде, где считаете нужным
Если вы разбиваете код на файлы, уделите первые пару строк нового файла тому, что в нем описывается
Разделяйте код на короткие, обособленные части
Если часть кода выполняет совершенно разнородные задачи, то разделите его
Было:
Стало:
Избегайте использования магических чисел
По максимуму
Яркий пример:
12 и 0 в данном случае "магические числа".
Не знаю, как вы, но я не помню, какой стиль диалога под каким ID идет, потому что постоянно использую DIALOG_STYLE_
Плюс представьте, что вам нужно найти обработку 12 диалога, а ид диалога у вас в switch.
Вы нажмете ctrlf+f, напишите "case 12:". И как быстро вы найдете свой диалог?
Но даже все это - лишь самые маленькие недостатки магических чисел..
Для ID's диалогов можно создать список перечислений:
Итого имеем:
Еще пример.
Женский? Но это не точно..
Заведите константу
И используйте её везде
Правила могут быть нарушены, если против них есть персональные возражения
Это набор общих рекомендаций, не навязывание. Подобный список рекомендаций, обычно заставляет людей задумываться о стиле программирования и оценке их собственных практик
Следуйте стандартам оформления кода
Исходный код должен быть написан так, чтобы максимально улучшить читаемость независимо от среды
В прошлом уроке я уже показывал вам стили отступов:
Стиль «K&R»:
C++:
stock GiveMeMoney(playerid) {
if(pData[playerid][pCash] < 500) {
SendClientMessage(playerid, 0xFFFFFFFF, "Недостаточно средств!");
return 1;
}
pData[playerid][pCash] -= 500;
}
Стиль Олмана:
C++:
stock GiveMeMoney(playerid)
{
if(pData[playerid][pCash] < 500)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Недостаточно средств!");
return 1;
}
pData[playerid][pCash] -= 500;
}
Стиль GNU:
C++:
stock GiveMeMoney(playerid)
{
if(pData[playerid][pCash] < 500)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Недостаточно средств!");
return 1;
}
pData[playerid][pCash] -= 500;
}
Теперь рассмотрим стили написания составных слов:
C++:
pawnoInfo // lowerCamelCase. Все слова, кроме первого, пишутся с прописной буквы
PawnoInfo // CamelCase. Несколько слов пишутся слитно, каждое слово с прописной буквы
pawno_info // snake_case. Слова разделяются _ вместо пробела
PAWNO_INFO // UPPER_CASE_SNAKE_CASE. Как предыдущий, но все слова пишутся заглавными буквами
Стандарты оформления кода в SA-MP:
Переменные именуются в стиле snake_case
C++:
new Float: car_x;
C++:
OnPlayerEnterHouseArea(houseid)
C++:
#define INVALID_HOUSE_ID 99999
Условие следует размещать в отдельной строке
C++:
if (true)
return SendClientMessage(playerid, -1, "Text");
Пробелы
C++:
a = (b + c) * d; // НЕ РЕКОМЕНДУЕТСЯ: a=(b+c)*d
C++:
doSomething(a, b, c, d); // НЕ РЕКОМЕНДУЕТСЯ: doSomething(a,b,c,d);
C++:
for (new i = 0; i < 10; i++) { // НЕ РЕКОМЕНДУЕТСЯ: for(new i=0;i<10;i++){
Давайте наглядные имена
Не экономьте на длине имени, лучше более длинное и более понятное (даже новичкам) имя.
C++:
new bankpic[2];
Но что из них будет выход, а что вход? Что первым попадется под руку.
Этот пример можно также отнести к магическим числам. Но об этом позже..
C++:
new pickup_bank_enter;
new pickup_bank_exit;
Функции, которые возвращают только логические значения (1/0), следует именовать с префиксом is
C++:
stock isBike(vehicleid)
{
...
}
C++:
stock hasHouse(playerid)
{
for(new house; house < TOTAL_HOUSES; house++)
{
if(strcmp(hData[house][h_owner], pData[playerid][pName]) == 0)
{
return 1;
}
}
return 0;
}
Используйте префиксы для переменных, которые хранят идентификатор чего-либо:
C++:
new td_name;
new pickup_name;
new obj_name;
new area_name;
Комментируйте
Оставляйте комментарии для сложных участков кода, непонятных функций. И везде, где считаете нужным
C++:
stock create_trigger(Float:x, Float:y, Float:z, color = 0xAA80FFDD, c_world = -1, c_int = -1)
{ // Создание цветного чекпоинта
new trigger = CreateDynamicObject(1317, x, y, z-0.5, 0.0, 0.0, 0.0, c_world, c_int);
SetDynamicObjectMaterial(trigger, 0, 18646, "none", "none", color);
trigger = CreateDynamicSphere(x, y, z, 1.5, c_world, c_int);
return trigger;
}
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Разделяйте код на короткие, обособленные части
Если часть кода выполняет совершенно разнородные задачи, то разделите его
Было:
C++:
if(listitem == 1)
{
if(hData[house][h_improve] & HOUSE_IMPROOVE_SAFE)
return SendClientMessage(playerid, color16_err, "У вас уже есть сейф!");
format(str_buy_improve, sizeof str_buy_improve, "\
{"#color_err"}Внимание!{ffffff}\n\
Вы действительно хотите купить сейф?\n\n\
Стоимость: {"#color_global"}%d {ffffff}$\n\n\
{"#color_light"}В сейфе ваши деньги и наркотики всегда будут\n\
в безопасности", correct_price(PRICE_IMPROOVE_SAFE) );
ShowPlayerDialog(playerid, d_house_menu_improve_buy, DIALOG_STYLE_MSGBOX, " ", str_buy_improve, "Купить", "Отмена");
SetPVarInt(playerid, "buy_improve_what", HOUSE_IMPROOVE_SAFE);
SetPVarInt(playerid, "buy_improve_price", correct_price(PRICE_IMPROOVE_SAFE));
return Y_HOOKS_BREAK_RETURN_1;
}
C++:
if(listitem == 1)
{
if(hData[house][h_improve] & HOUSE_IMPROOVE_SAFE)
return SendClientMessage(playerid, color16_err, "У вас уже есть сейф!");
new str_buy_improve[500];
format(str_buy_improve, sizeof str_buy_improve, "\
{"#color_err"}Внимание!{ffffff}\n\
Вы действительно хотите купить сейф?\n\n\
Стоимость: {"#color_global"}%d {ffffff}$\n\n\
{"#color_light"}В сейфе ваши деньги и наркотики всегда будут\n\
в безопасности", correct_price(PRICE_IMPROOVE_SAFE) );
ShowPlayerDialog(playerid, d_house_menu_improve_buy, DIALOG_STYLE_MSGBOX, " ", str_buy_improve, "Купить", "Отмена");
SetPVarInt(playerid, "buy_improve_what", HOUSE_IMPROOVE_SAFE);
SetPVarInt(playerid, "buy_improve_price", correct_price(PRICE_IMPROOVE_SAFE));
return true;
}
Избегайте использования магических чисел
По максимуму
Яркий пример:
C++:
ShowPlayerDialog(playerid, 12, 0, " ", "Выберите ваш пол", "Мужской", "Женский");
Не знаю, как вы, но я не помню, какой стиль диалога под каким ID идет, потому что постоянно использую DIALOG_STYLE_
Плюс представьте, что вам нужно найти обработку 12 диалога, а ид диалога у вас в switch.
Вы нажмете ctrlf+f, напишите "case 12:". И как быстро вы найдете свой диалог?
Но даже все это - лишь самые маленькие недостатки магических чисел..
Для ID's диалогов можно создать список перечислений:
C++:
enum
{
DIALOG_SELECT_SEX,
DIALOG_BUY_SKIN,
};
C++:
ShowPlayerDialog(playerid, DIALOG_SELECT_SEX, DIALOG_STYLE_MSGBOX, " ", "Выберите ваш пол", "Мужской", "Женский");
Женский? Но это не точно..
C++:
if(pData[playerid][pSex] == 0)
{
}
C++:
#define SEX_MALE 1
#define SEX_FEMALE 0
Код:
if(pData[playerid][pSex] == SEX_MALE)
{
pData[playerid][pSex] = SEX_FEMALE;
}
На сегодня закончим. Жду комментарии, поправки и предложения
Качество кода, его стиль - далеко не самые важные аспекты, особенно в SA:MP. Выше всего ценится идея!
Не зацикливайтесь на этом, особенно, если вы не программист и ничего кроме pawn скриптов писать не собираетесь
Публикация данной статьи на других ресурсах
без разрешения автора разрешена!
без разрешения автора разрешена!
Последнее редактирование:
