Кому то просто нужно ближе подобраться к понятию инициализация
Вид для печати
Кому то просто нужно ближе подобраться к понятию инициализация
Данный приём стоит использовать только тогда, когда массив имеет большое кол-во ячеек.
Ибо инициализация таких объемных наборов данных занимает достаточно продолжительное время, особенно в тех массивах, кои занимают по 1500-2000 байт и выше.
Применять оператор goto, или отправлять инструкцию jump, в местах, например, где необходимо проинициализировать массив, заточенный под форматирование - бессмысленно.
Так и не решился создавать отдельную тему, так что отпишу сюда.
Очень часто в чужих скриптах вижу, как один и тот же диалог повторяется в нескольких местах. Это мало того, что потребляет лишнюю память, так ещё и доставляет трудности в случае, если вдруг захочется изменить текст этого диалога (да, можно пользоваться автозаменой, но я хочу предложить альтернативу, которая и уменьшит потребление памяти, и не заставит мучиться с автозаменой).
А если это целая система, построенная на диалогах - всё становится ещё страшнее, ибо переплетение в виде кучи вызовов разных диалогов напрочь убивает читаемость.
В общем-то, думаю, ни для кого не секрет, что повторяющийся код лучше убирать в отдельную функцию и вызывать уже функцию, а не каждый раз прописывать код. И как раз именно это я предлагаю использовать. Только если в случае с одним конкретным диалогом всё, вроде как, понятно, то когда у вас целая система, построенная на диалогах, создавать для каждого диалога свою функцию тоже не очень удобно, ибо придётся помнить кучу ненужных названий. Собственно, я хочу предложить решение (точнее, просто натолкнуть на эту идею тех, кто сам до неё не дошёл) для подобных ситуаций. Заключается оно в том, что для одной конкретной системы будет использоваться одна функция, через которую уже будут показываться все диалоги этой системы. В общем-то реализация проста:
И уже просто в том месте, где нужно (повторно) показать диалог, прописываем:PHP код:
stock ShowRegistrationDialog(playerid, dialogid)
{
switch(dialogid)
{
case id_диалога_1:
{
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case id_диалога_2:
{
//Тут любой код, что требуется выполнять при каждом показе диалога
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case id_диалога_3:
{
ShowPlayerDialog(playerid, /*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/, прочая_информация);
}
}
return 1;
}
Всё это и код в более опрятный вид приводит, ибо нет строк, что за границы экрана уходят, и позволяют без проблем вызывать диалоги там, где это требуется, без каких-либо копирований целого диалога.PHP код:
ShowRegistrationDialog(playerid, id_диалога_1);
Только стоит обязательно учитывать, что не стоит в одну такую функцию пихать кучу диалогов, ибо это будет, опять же, неудобно. Лучше, как я писал выше, для каждой системы выделять одну функцию.
И если использовать перечисление для хранения ID диалогов, то код становится ещё опрятнее:
Собственно, всё. Вроде, вполне логичное оформление кода, но, судя по коду в паблике, практически никто не доходит до использования подобного.PHP код:
enum
{
dRegisterMain,
dRegisterInputName,
dRegisterInputPass
}
stock ShowRegistrationDialog(playerid, dialogid)
{
switch(dialogid)
{
case dRegisterMain:
{
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case dRegisterInputName:
{
//Тут любой код, что требуется выполнять при каждом показе диалога
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case dRegisterInputPass:
{
ShowPlayerDialog(playerid, /*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/, прочая_информация);
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case dRegisterMain:
{
if(!response)
return 1;
else
return ShowRegistrationDialog(playerid, dRegisterInputName);
}
case dRegisterInputName:
{
if(!response)
return ShowRegistrationDialog(playerid, dRegisterMain);
else
return ShowRegistrationDialog(playerid, dRegisterInputPass);
}
case dRegisterInputName:
{
if(!response)
return ShowRegistrationDialog(playerid, dRegisterInputName);
else
return SpawnPlayer(playerid);
}
}
}
Для подобных случаев есть: TDW Dialog Library
Ну, во-первых, знания о том, как такое можно реализовать, лишними не будут никогда. Слепое пользование чужим инструментом часто приводит к тому, что пользователь не может решить, казалось бы, простые проблемы, связанные с этим инструментом.
Во-вторых, изучать синтаксис целой библиотеки (который, к слову, далеко не самый удачный, как по мне) ради подобного - не самое лучшее распределение собственного времени =)
Использую самописанную библиотеку для тех же целей, похожую на версию от Стяжкина (то бишь, синтаксис максимально приближен к синтаксису оригинальных функций), но это не помешало написать мне тот пост :) У каждого свои предпочтения и, как можно заметить, большинство предпочитает не пользоваться какими-то сторонними библиотеками для обработки диалогов. И моя информация именно для них