Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

FAQ Какой стиль кода выбрать?

plakapenka

Специалист
Здаров.

Правила могут быть нарушены, если против них есть персональные возражения

Это набор общих рекомендаций, не навязывание. Подобный список рекомендаций, обычно заставляет людей задумываться о стиле программирования и оценке их собственных практик


Следуйте стандартам оформления кода
Исходный код должен быть написан так, чтобы максимально улучшить читаемость независимо от среды

В прошлом уроке я уже показывал вам стили отступов:

Стиль «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;
Функции именуются в стиле CamelCase
C++:
OnPlayerEnterHouseArea(houseid)
Константы именуются в стиле UPPER_CASE_SNAKE_CASE

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)
{
    ...
}
В некоторых ситуациях префикс is лучше заменить на другой: has, can или should:
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, " ", "Выберите ваш пол", "Мужской", "Женский");
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 скриптов писать не собираетесь
Публикация данной статьи на других ресурсах
без разрешения автора разрешена!

​
 
Последнее редактирование:
Сверху Снизу