Sign in to follow this  
Followers 0
Cawfee

Советы по написанию кода. Приведение кода к единому общепринятому стилю

4 posts in this topic

Каждый начинающий разработчик пишет код так, как видит в интернет-ресурсах. Грубо говоря, он привыкает к уже имеющимся шаблонам. Но зачастую код отдельно взятых пользователей лишь вводит в заблуждение о том, что к чему. В программировании существует некий рекомендуемый шаблон, к которому стоит стремиться каждому разработчику. Это позволяет приводить код в общий стиль, что не нарушает читаемость. 

 

Сами советы по написанию кода (рекомендации) будут появляться в данной теме отдельными постами. В создании таких постов может поучаствовать каждый пользователь. 

 

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

Share this post


Link to post
Share on other sites

#1. Названия переменных и функций не стоит писать с помощью транслитерации. Прежде всего такие названия выглядят крайне неприятно. Стоит учесть и то, что функции зачастую называют, например, так: HideRuki. То есть транслитерация и английский вперемешку. Это тоже является ошибкой при написании кода у многих недопрограммистов. К ранее сказанному, старайтесь писать названия переменных на чистом английском, понятным самим англичанам, нежели переводить отдельные части и пытаться составить из них единое название.

 

В английском языке, ровным счетом как и в русском, существуют некие устойчивые выражения. Рассмотрим одно из них - to take a seat. Если переводить каждое слово в отдельности, мы получим взять кресло. Однако, если переводить полный оборот, то увидим иной перевод - присесть. Поэтому важно понять, что перевод в отдельности каждого слова на английском не всегда дает вам адекватный вариант на английском языке.

Share this post


Link to post
Share on other sites

#2. Названия переменных стоит писать с маленькой буквы, первым символом названия не должна быть цифра, не стоит писать название слитно.

Название переменных стоит писать с маленькой буквы.

Переменные должны начинаться с буквы, а не с цифры (это не совет, просто компилятор в принципе не расценит переменную переменной, если оно начинается с цифры). Касаемо разделения написания названия:

Можно, конечно, написать вот так:

new Text: TDLogotipServera;

Но согласитесь, это не очень красиво, гораздо лучше написать в таком виде:

new Text: td_logotype_server;

Здесь мы учли сортировку переменных (о ней ниже), написание с маленькой буквы, разделение слов, название переменных на английском (выше).

Сортировка переменных:

Согласитесь, не красиво, когда у нас переменные в куче, с почти идентичными названиями(особенно если касается единой системы), гораздо лучше использовать "сортировку" переменных, например:

У нас есть переменные одной системы, переменная для таймера, переменная для текстдрава, многие бы написал так:

new SystemTimer;
new Text: SystemTD[5];

Потом гадай, откуда они, для чего они служат (особенно если вы новичок), для этого можно их "отсортировать" - привести в единый вид, вот например, те же переменные, но "отсортированные":

new timer_system;
new Text: td_system[5];

Теперь, чтобы посмотреть все переменные текстдравов, нам достаточно ввести: "td_".

Тип переменных "bool":

Если у нас переменные могут иметь только 2 значения, то лучше использовать тип "bool" например:

new bool: check_belt[MAX_PLAYERS];


if(check_belt[playerid] == false)
{
	действие;
}
else
{
	дествие
}

Данный тип переменных имеет 2 значения: true(истинна) и false(ложь).

Share this post


Link to post
Share on other sites

#3. Старайтесь не иметь скроллинг внизу. 

 

Старайтесь не иметь скроллинга внизу.

Мне например не приятно, когда приходиться скроллинг вправо двигать, чтобы просмотреть какой-либо текст или еще что-то, я просто текст растягиваю на несколько строк, стараюсь сделать это грамотно. Пример длинного текста в разных функциях(SPD, string):

SPD(playerid, 0, DSM, "Длинный диалог", "Здесь у нас будет нас текст, он ооочень длинный, это неудобно, да и некрасиво.", "Закрыть", "");

format(string, sizeof(string), "Здесь у нас будет нас текст, он ооочень длинный, это неудобно, да и некрасиво Nick_Name: %s", name);

Сделаем его короче и понятнее:

SPD(playerid, 0, DSM, 
 "\
	Длинный диалог", "Здесь у нас будет нас текст, он ооочень длинный, это неудобно, да и некрасиво.", "Закрыть", "\
 ");

format(string, sizeof(string), 
 "\
	Здесь у нас будет нас текст, он ооочень длинный, это неудобно, да и некрасиво Nick_Name: %s\
 ", name);

Если текст сам по себе длинный, то можно сделать так:

SPD(playerid, 0, DSM, 
 "\
	Длинный диалог", "Здесь у нас будет нас текст, он ооочень длинный,\
	это неудобно, да и некрасиво.", "Закрыть", "\
 ");

format(string, sizeof(string), 
 "\
	Здесь у нас будет нас текст, он ооочень длинный,\
	это неудобно, да и некрасиво Nick_Name: %s\
 ", name);

Так и текст красивее, и табуляция соблюдается. Я обычно так делаю всегда.

Пример моего кода:

static const fmt_str[] =
 "\
	{FFFFFF}Здравствуйте, {FFFF00}%s!\n{FFFFFF}Вы зашли на сервер {2979FF}"NAME_SERVER"\n\
	\n{FFFFFF}Данный аккаунт зарегистрирован\nДля авторизации аккаунта введите свой пароль:\
 ";
new string[sizeof(fmt_str)-2+MAX_PLAYER_NAME+1];
format(string, sizeof(string), fmt_str, GN(playerid));
SPD(playerid, 3, DSP, "Авторизация на A-RP", string, "Далее", "Выход");

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Sleash
      By Sleash
      Всем доброго времени суток. Сегодня мне бы хотелось вам рассказать от таких функциях в PAWN-языке, как SetTimer и SetTimerEx.
      Сразу сделаю такое примечание: Для SetTimer и SetTimerEx можно использовать ТОЛЬКО public!!!
      SetTimer
      Итак, для начала приступим к лёгкому и пойдём по нарастающей:
      Первое, это SetTimer. Функция включает в себя 3 параметра:
      native SetTimer(funcname[], interval, repeating); funcname[] - Это название функции, по сути - название вашего pablic в кавычках.
      interval - Интервалы от вызова таймера до срабатывания pablic
                     Так же если стоит повторение таймера, то будет работать как интервал между таймерами.
                     Измеряется в миллисекундах. 1000 миллисекунд равно 1 секунде
      repating - Тут всё просто: будет ли повторяться ваша функция. Может иметь значения: true - будет выполняться повторение ИЛИ false - вызывается 1 раз.
      Давайте разберём пример для наглядности:
      forward Info(); public Info() {     SendClientMessageToAll(0xFFFFFFFF, "Наш сайт: pawno-rus.ru"); } // И теперь давайте вызовем данный таймер при запуске мода public OngameModeInit() {     SetTimer("Info", 1000*60*20, true);     return true } Давайте разберёмся по интервалу: 1000*60*20. Так как я писал ранее, что 1000 млСек = 1 сек, то: 1 сек * 60 = 1 минута; 1 минута * 20 = 20 минут.
      Таким образом данный таймер будет выводить каждые 20 минут для всех игроков на сервере в чат: "pawno-rus.ru".
       
      SetTimerEx
       
      По сути с SetTimer - всё, теперь перейдём к следующей функции: SetTimerEx:
      native SetTimerEx(funcname[], interval, repeating, const format[], {Float,_}:...); Тут добавляются ещё 2 параметра:
      const format[] - формат данных для ввода в функцию. (Такие как: s, d, f);
      {Float,_}:... - переменные или значение для данных из const fromat[]
      Из данных объяснения мало что можно понять незнающему или начинающему скриптеру, поэтому давайте разберём на примере кода, который при входу даёт на авторизацию две минуты игроку:
      forward autorez(playerid); public autorez(playerid) {     if(/*проверка на то залогинился ли игрок*/)     {         SendClientMessage(playerid, 0xFFFFFFFF, "Вы были кикнуты по причине: Время на авторизацию истекло.");         Kick(playerid);         return true;     }     return true; } //Дальше уже добавлям сам таймер public OnPlayerConnect(playerid) {     SetTimerEx("autorez", 1000*60*2, false, "d", playerid);     return true; } Если первые три пункта мы уже разбирали. то начнём сразу с 4-го:
      4. Тут в кавычках надо вставлять тип данных. Наподобие функции format(output[], len, "%s %d %f", string, int, float), только без знака процента (%)
      5. Тут уже указывают сами данные, так же разберём как и предыдущий: format(output[], len, "%s %d %f ", string, int, float)
       
      Я надеюсь что кому-то помог, а если что непонятно, то спрашивайте, всегда помогу.
    • NoVate
      By NoVate
      Доброго времени суток 
       
      Многие новички задавались вопросом: "Как создать свой RP сервер?", "С чего начать разработку?", "Это сложно и я не справлюсь".
      После таких вопросов многие уходили с этой темы и оставляли её на последней полке. Некоторые брались и сталкивались с большими проблемами. И только часть из этих людей доходили до какого-то результата.
       
      Моя цель: сделать создание сервера в SA:MP проще. Чтобы каждый из тех, кто интересовался созданием сервера мог спокойно взять готовую, а что самое главное - базовую сборку и под неё уже создавать различные свои задумки. SA:MP на данный момент не особо актуален, а тем более самый обычный клиент, НО, как мне кажется, если сделать что-то невероятное, то аудитория заметит это и ей будет достаточно интересно "пощупать" данное новшество.
       
      Для тех, кто начнёт писать: "Ты видел свой код?", "Ты сделал не правильно в 777-ой строке" и так далее. Сразу отвечу, цитируя:
       
      Кому стало интересно и кто хотел бы ознакомиться со сборком - прошу в мой Github (не реклама).
      Буду делать коммиты по мере свободного времени и написании кода.
      Если есть какие-то идеи, то пишите в мой Discord сервера (не реклама), который можно будет найти на той же странице.
       
      Спасибо всем за прочтение и хорошего настроения 
    • Maxim638
      By Maxim638
      И вот снова мне приходится обращаться за помощью. Дело в клиенте уже(или кеш???) Напомню что кеш у меня модифицированный и вот я запускаю клиент, загрузочный экран прошел и я ввел пароль в поле ввода, нажал ОК, и у меня клиент завис на пару секунд и вылетел. И так повторяется постоянно, и я его переустанавливал, и пробовал перезаходить много раз. Но после каждого ввода пароля и нажимания кнопки "ок" клиент вылетает. Покопавшичь в samp.log.txt я нашел последние строки и вот такой код нашел(в спойлере). В чем дело?(добавил файл samp_log.txt чтобы полностью вы прочитали файл)
      Интересный факт: у моего друга Honor и у него оптимизация и клиент идет в 60 фпс в отличии от моего Samsung A02 на котором клиент в 20 фпс от силы,а иногда и 10, и даже 5 фпс...
       
      samp_log.txt
    • xiemoniyaz
      By xiemoniyaz
      C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 017: undefined symbol "GEO_MAX_COUNTRY_NAME_LENGTH" C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 009: invalid array size (negative, zero or out of bounds) C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : error 036: empty statement C:\Users\111\OneDrive\Ðàáî÷èé ñòîë\rrrr\gamemodes\arizona.pwn(78772) : fatal error 107: too many error messages on one line Compilation aborted. Pawn compiler 3.2.3664          Copyright (c) 1997-2016, ITB CompuPhase 4 Errors.  
       
      cmd:get(playerid, params[]) {     extract params -> new player; else return SendClientMessage(playerid, -1, !"/get [playerid]");     new string[GEO_MAX_COUNTRY_NAME_LENGTH+GEO_MAX_REGION_NAME_LENGTH+GEO_MAX_CITY_NAME_LENGTH+GEO_MAX_PROVIDER_NAME_LENGTH+GEO_MAX_MOBILE_STATUS_LENGTH+GEO_MAX_PROXY_LENGTH-6+118];     format(string, sizeof(string),     "Страна: %s\n\     Регион: %s\n\     Город: %s\n\     Провайдер: %s\n\     Использует ли моб.сеть: %s\n\     Использует ли прокси: %s",     GetPlayerIpCountry(player),     GetPlayerIpRegion(player),     GetPlayerIpCity(player),     GetPlayerIpProvider(player),     GetPlayerIpMobileStatus(player),     GetPlayerIpProxyStatus(player));     ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, !" ", string, !"Закрыть", !"");     return true; }  
    • DEST
      By DEST
      Командный процессор: zcmd / dc_cmd + sscanf.