PDA

Просмотр полной версии : [Вопрос] Оптимизирован и правильный код? Если можно то какие вариант ещё есть ?



phpadmin
16.06.2017, 17:45
if(response)
{
switch(dialogid)
{
case 969:
{
if(!strlen(inputtext))
{
spd(playerid,969,dsi,"Введите сумму","Пополнение счета IT сообщества (пустая строка)","Скрыть","Выход");
}
#define dengi strval(inputtext)
if(dengi < 1 || dengi > 1000000)
{
scm(playerid,-1,"Нельзя пополнить счет меньше 1 и больше 1000000 вирт");
spd(playerid,969,dsi,"Введите сумму","Пополнение счета IT сообщества","Скрыть","Выход");
return true;
}
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
s_player[playerid][pDollar] -= dengi;
s_internet[idollar] += dengi;
SavePlayer();
return true;
#undef dengi
}
}
}

DeimoS
16.06.2017, 17:57
#define dengi strval(inputtext)
Что это? Зачем?
Переменная создаётся не только для того, чтоб код был более опрятный, но и для того, чтоб по 100 раз не вызывать одну и ту же функцию. С макросом же функция всё равно будет вызываться каждый раз.

И что это за коверканье стандартных функций? Что за "spd", "scm"? Самому же потом будет неудобно работать с таким кодом, если вдруг решишь сделать поиск по названию функции (будут совпадения с названиями других переменных/функций), не говоря уже о том, что ты этим убиваешь совместимость с чужим кодом. Куда вы так спешите, что вам лень написать полное название функции? Не нужно быдлокодить

ID диалогов в виде чисел - тоже такая себе идея. Заведи enum под диалоги и прописывай их там в виде членов перечисления. Так и обезопасишь себя от повтора ID, и найти нужный диалог будет проще.


И вот это что ещё такое?

if(response)
{
switch(dialogid)
{
Ты разделяешь код кнопок диалога по разным switch? Самому потом удобно будет выискивать код одного диалога по двум разным участкам OnDialogResponse?

Вот эту проверку лучше перенести в начало диалога

if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
Ибо какой смысл проводить все те махинации с "dengi", если всё упирается в количество денег у игрока?

VVWVV
16.06.2017, 17:58
Оптимизировать с помощью макросов - самый эффективный способ (сарказм)

Впрочем, я посоветовал бы вам создать новую переменную, в которую необходимо занести возвращаемое значение функции strval, а не "оптимизировать" это дело макросом. Можно ещё передавать строки с помощью оператора "!" перед кавычками, однако из-за непонятных мне функций, это будет очень сомнительно; поскольку это могут быть функции-обработчики, которые выполняют дополнительный код при каждом вызове, либо же это могут макро-функции, которые просто сокращают названия функций. Поэтому в следующий раз, если вы используете макро-функции, то лучше уточнить их функцию.

phpadmin
16.06.2017, 18:08
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?

DeimoS
16.06.2017, 18:19
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?

Тебе же его уже описали. Даже два человека. Нужно лишь чуть-чуть подумать и осмыслить написанное

VVWVV
16.06.2017, 18:23
Можете описать правильный код? по вашему мнению. А то я не понимаю. Мне дефайн ундев чем заменить new?

Абсолютно верно. Директива define и undef - части препроцессора, определяющие новый макрос (undef - удаляет макрос), значение которого будет подставлена при компиляции. В вашем случае это множество обращений к функции strval. Если же использовать оператор new, то вам не нужно будет множество раз вызывать одну и ту же функцию, для одного и того же результата, поскольку возвращаемое значение уже будет хранится в этой переменной.


new money = strval(inputtext);

phpadmin
16.06.2017, 18:27
Теперь я это написав ко всем new, мне потом всего лишь надо использовать "money" когда угодно? и всё? именно в в инпуттекстах?

- - - Updated - - -

Сори за мои знания павно мизерное. Просто стало интересно что-то мутить.

- - - Updated - - -

Или ты имеешь виду использовать по такому типу?

case 0..73:
if(s_player[playerid][pBox]>0)
{
new String[250];
s_player[playerid][pBox] -=1;
format(String, sizeof(String), "%s {FFFFFF}Вы открыли элитную коробку (осталось: %d .шт)\n\n",String,s_player[playerid][pBox]);
new rand = Vaper[random(sizeof Vaper)];
new patr = Vaper1[random(sizeof Vaper1)];
GivePlayerWeapon(playerid,rand,patr);
format(String, sizeof(String), "%s {FFFFFF}Оружие: {CC8DEC}%s\n",String,gname(rand));
new skin = Spinner[random(sizeof Spinner)];
SetPlayerSkin(playerid,skin);
format(String,sizeof(String), "%s {FFFFFF}Временная одежда: (id одежды: {708DEB}%d{FFFFFF})\n",String,skin);
new dollar = Gibby[random(sizeof Gibby)];
s_player[playerid][pDollar]+=dollar;
format(String,sizeof(String), "%s {FFFFFF}Бонусные доллары: {79D26D}%d$\n",String,dollar);
spd(playerid,9903,dsm,"{FFFFFF}Elite BOX",String,"Закрыть","");
}

- - - Updated - - -

Если что код не кривой тут так стал

- - - Updated - - -

Вот так?


case 969:
{
new dengi = strval(inputtext);
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
if(!strlen(inputtext))
{
spd(playerid,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
}
if(dengi < 1 || dengi > 1000000)
{
scm(playerid,-1,"Сумма неверная, повторите попытку!");
spd(playerid,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
return true;
}
if(s_player[playerid][pDollar] < dengi) return scm(playerid,-1,"У вас нет столько денег");
s_player[playerid][pDollar] += dengi;
s_internet[idollar] -= dengi;
SavePlayer();
return true;

VVWVV
16.06.2017, 18:54
Да. Я очень настоятельно рекомендую вам прочитать как можно больше документации по данному ЯП. Более того, вы можете прочитать статьи на этом форуме.

ziggi
16.06.2017, 20:06
scm

Почему бы не продолжить оптимизацию?

Можно оптимизировать названия некоторых функций, операторов и переменных:

strval -> sv
strlen -> sl
s_player -> s_p
s_internet -> s_i
SavePlayer -> SP
playerid -> p
pDollar -> pD
idollar -> id
inputtext -> i
return -> r

Код получается более короткий, а, значит, более понятный и оптимизированный:

case 969:
{
#define r return
#define p playerid
#define pD pDollar
#define id idollar
#define t true
new d = sv(i);
if(s_p[p][pD] < d) r scm(p,-1,"У вас нет столько денег");
if(!sl(i))
{
spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
}
if(d < 1 || d > 1000000)
{
scm(p,-1,"Сумма неверная, повторите попытку!");
spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");
r t;
}
if(s_p[p][pD] < d) r scm(p,-1,"У вас нет столько денег");
s_p[p][pD] += d;
s_i[id] -= d;
SP();
r t;
Но ещё можно оптимизировать, убрав ненужные пробелы и отступы:

case 969: {
#define r return
#define p playerid
#define pD pDollar
#define id idollar
#define t true
new d=sv(i);if(s_p[p][pD]<d)r scm(p,-1,"У вас нет столько денег");
if(!sl(i)){spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");}
if(d<1||d>1000000){scm(p,-1,"Сумма неверная, повторите попытку!");spd(p,969,dsi,"Доступ активирован","Вы активировали подключение к федеральном хранилищу банка HG\n\
На вывод денег стоит лимит. С оторожностью выводите деньги!","Ввести","Выход");r t;}
if(s_p[p][pD]<d)r scm(p,-1,"У вас нет столько денег");s_p[p][pD]+=d;s_i[id]-=d;SP();r t;

P.S. Если кто не понял - это "шутка"...

phpadmin
16.06.2017, 20:16
Сарказм принят)
Лучше скажи функцию что бы в виртуальном мире нельзя было использовать кнопки.
Типа

if (newkeys == KEY_WALK)
{
if(IsPlayerInRangeOfPoint(playerid,0.9,1542.6599,-1362.4591,329.4587))
{
if(s_player[playerid][pLic] == 1)
{
new string[500];
strins(string,"{FFFFFF}Голодные коробки\t{FFFFFF}Наименование\t{FFFFFF}Количество призов\t{FFFFFF}Цена\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Разное\t{FFFFFF}1 приз\t{79D26D}250$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Стандарт\t{FFFFFF}1 приз\t{79D26D}600$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{73E8FF}Ice(ледяной)\t{FFFFFF}2 приза\t{79D26D}1100$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFBB5C}Elite(элитное)\t{FFFFFF}3 приза\t{D8945F}30€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Music»\t{FFFFFF}Своя музыка\t{FFFFFF}Нет приза\t{D8945F}5€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Code»\t{FFFFFF}Code\t{FFFFFF}Нет приза\t{79D26D}Free\n",strlen(string));
spd(playerid,777,dls,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX",string,"Открыть","Закрыть");
}
else
{
spd(playerid,776,dsm,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX","\t\n\n{FFFFFF}Автомат с коробками Вам недоступен.\t\n\
Причина: вы не приняли условия лицензионного соглашения\n\n","Закрыть","");
}
}
Какая функция нужна или как сделать что бы этот раздел работал например в виртуальном мире определенном?

dch1hff1
16.06.2017, 20:35
Сарказм принят)
Лучше скажи функцию что бы в виртуальном мире нельзя было использовать кнопки.
Типа

if (newkeys == KEY_WALK)
{
if(IsPlayerInRangeOfPoint(playerid,0.9,1542.6599,-1362.4591,329.4587))
{
if(s_player[playerid][pLic] == 1)
{
new string[500];
strins(string,"{FFFFFF}Голодные коробки\t{FFFFFF}Наименование\t{FFFFFF}Количество призов\t{FFFFFF}Цена\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Разное\t{FFFFFF}1 приз\t{79D26D}250$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFFFFF}Стандарт\t{FFFFFF}1 приз\t{79D26D}600$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{73E8FF}Ice(ледяной)\t{FFFFFF}2 приза\t{79D26D}1100$\n",strlen(string));
strins(string,"{BCBCBC}«Hungry BOX»\t{FFBB5C}Elite(элитное)\t{FFFFFF}3 приза\t{D8945F}30€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Music»\t{FFFFFF}Своя музыка\t{FFFFFF}Нет приза\t{D8945F}5€\n",strlen(string));
strins(string,"{BCBCBC}«Hungry Code»\t{FFFFFF}Code\t{FFFFFF}Нет приза\t{79D26D}Free\n",strlen(string));
spd(playerid,777,dls,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX",string,"Открыть","Закрыть");
}
else
{
spd(playerid,776,dsm,"{1CD91F}H{FFFFFF}ungry {1CD91F}G{FFFFFF}ames BOX","\t\n\n{FFFFFF}Автомат с коробками Вам недоступен.\t\n\
Причина: вы не приняли условия лицензионного соглашения\n\n","Закрыть","");
}
}
Какая функция нужна или как сделать что бы этот раздел работал например в виртуальном мире определенном?


GetPlayerVirtualWorld. (http://wiki.sa-mp.com/wiki/GetPlayerVirtualWorld)