Как лучше объявить переменную?

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
Как лучше использовать переменны?

1.
C-подобный:
ConVar g_сEnable = null;
2.
C-подобный:
Handle g_hEnable = INVALID_HANDLE;
Есть ли вообще смысл от INVALID_HANDLE и null ?
3. Или лучше объявить на прямую тот же int/bool/float ?

Вот 3 примера, что лучше по произмодительсноти?
C-подобный:
ConVar
    g_cEnablePlugin;

public void OnPluginStart()
{
    g_cEnablePlugin = CreateConVar("sm_enable", "1", "Enable/Disalbe", _, true, 0.0, true, 1.0);
    HookEvent("round_end", OnEnd);
}

public void OnEnd(Handle event, char[] name, bool dontBroadcast)
{
    if(!g_cEnablePlugin.BoolValue)
        return;
}

C-подобный:
Handle
    g_hEnablePlugin;
    
bool
    bEnabled;

public void OnPluginStart()
{
    g_hEnablePlugin = CreateConVar("sm_enable", "1", "Enable/Disalbe", _, true, 0.0, true, 1.0);
    bEnabled = GetConVarBool(g_hEnablePlugin);
    HookEvent("round_end", OnEnd);
}

public void OnEnd(Handle event, char[] name, bool dontBroadcast)
{
    if(!bEnabled)
        return;
}

C-подобный:
bool
    bEnable;

public void OnPluginStart()
{
    ConVar cvar;
    cvar = CreateConVar("sm_enable", "1", "Enable/Disalbe", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Enable);
    bEnable = cvar.BoolValue;
    
    HookEvent("round_end", OnEnd);
}

public void CVarChanged_Enable(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    bEnable = CVar.BoolValue;
}

public void OnEnd(Handle event, char[] name, bool dontBroadcast)
{
    if(!bEnable)
        return;
}
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #2
Ну конвар это новый метод, хэндл старый формат для тех же кваров (и не только). По факту сейчас конвар это дочерний от хэндла (как и ArrayList, StringMap и тд).
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
Ну конвар это новый метод, хэндл старый формат для тех же кваров (и не только). По факту сейчас конвар это дочерний от хэндла (как и ArrayList, StringMap и тд).
То есть лучше на прямую? Вроде чем больше хенделов тем хуже или как?
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #4
То есть лучше на прямую?
Что значит напрямую? Использовать ConVar? Так это обёртка для Handle, но только для использования именно кваров. Просто методмап, использующий всё те же функции.
Вроде чем больше хенделов тем хуже или как?
Немного дичь, т.к. проблем не будет если ты лишний раз создать тот же квар.
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
Что значит напрямую? Использовать ConVar? Так это обёртка для Handle, но только для использования именно кваров. Просто методмап, использующий всё те же функции.

Немного дичь, т.к. проблем не будет если ты лишний раз создать тот же квар.
То есть абсолютно без разницы каким методом действовать?
И нужно ли приравнивать к INVALID_HANDLE и null ?
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #6
То есть абсолютно без разницы каким методом действовать?
На сколько мне известно - да. Просто один старый формат, другой новый. Новый - методмат, использующий старые ф-и. В общем, тут как удобнее и кому как нравится.
И нужно ли приравнивать к INVALID_HANDLE и null ?
Опять же, на сколько мне известно, они по умолчанию имеют null. Про разницу INVALID_HANDLE и null, если честно сейчас не вспомню. По сути одно и тоже ВРОДЕ, просто первый формат исключительно для хэндлов (возможно ещё и дочерние классы), а null может ещё где-то использоваться.
В общем, тут я могу лишь ввести в заблуждение, поэтому пусть кто-то знающий наверняка даст ответ.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
ConVar, Database и прочие подобные наследуемые типы данных - попытка разработчиков прийти к ООП. Отсюда и INVALID_HANDLE == null
Все переменные, при объявлении, инициализируются со стандартным, для типа данных, значением.
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
На сколько мне известно - да. Просто один старый формат, другой новый. Новый - методмат, использующий старые ф-и. В общем, тут как удобнее и кому как нравится.

Опять же, на сколько мне известно, они по умолчанию имеют null. Про разницу INVALID_HANDLE и null, если честно сейчас не вспомню. По сути одно и тоже ВРОДЕ, просто первый формат исключительно для хэндлов (возможно ещё и дочерние классы), а null может ещё где-то использоваться.
В общем, тут я могу лишь ввести в заблуждение, поэтому пусть кто-то знающий наверняка даст ответ.
Т.е. через
C-подобный:
ConVar cvar;
cvar = CreateConVar("sm_jumpeffect_enable", "1", "Включить/выключить эффект волн при прыжке.", _, true, _, true, 1.0);
cvar.AddChangeHook(CVarChanged_Enable);
bEnable = cvar.BoolValue;
Или через Cvar или Handle на ситуацию вообще никак не влияет?
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #9
Т.е. через
C-подобный:
ConVar cvar;
cvar = CreateConVar("sm_jumpeffect_enable", "1", "Включить/выключить эффект волн при прыжке.", _, true, _, true, 1.0);
cvar.AddChangeHook(CVarChanged_Enable);
bEnable = cvar.BoolValue;
Или через Cvar или Handle на ситуацию вообще никак не влияет?
Если использовать Handle, то тебе не будет доступны медоты, проперти и тд из методмапов, например: ConVar.AddChangeHook().
По факту этот метод вызывает эту ф-ю.
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
Если использовать Handle, то тебе не будет доступны медоты, проперти и тд из методмапов, например: ConVar.AddChangeHook().
По факту этот метод вызывает эту ф-ю.
Обновил шапку. Посмотри пожалуйста.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,560
Реакции
5,063
При объявлении любого типа переменной она автоматически приравнивается к нулю (для INVALID_HANDLE прописан дефайн равный 0, кстати), если явно не указано иное.

Ты интересуешься о том как лучше работать с кварами: хранить значение в отдельной переменной и изменять её значение при изменении значения соответствующего квара или же каждый раз запрашивать текущее значение квара?
Сообщения автоматически склеены:

Во втором примере ты не отслеживаешь изменения значения квара. Квары не имеют смысла в таком случае.
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
При объявлении любого типа переменной она автоматически приравнивается к нулю (для INVALID_HANDLE прописан дефайн равный 0, кстати), если явно не указано иное.

Ты интересуешься о том как лучше работать с кварами: хранить значение в отдельной переменной и изменять её значение при изменении значения соответствующего квара или же каждый раз запрашивать текущее значение квара?
Сообщения автоматически склеены:


Во втором примере ты не отслеживаешь изменения значения квара. Квары не имеют смысла в таком случае.
Да, хочу понять какой из методов мне использовать.

К стати зачем тогда все постоянно пишут Handle g_hEnable = INVALID_HANDLE; ? Или так было в старом синтаксисе? Вроде встречаю и в новом это.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,560
Реакции
5,063
ИМХО, если значение квара будет запрашиваться редко, то можно использовать и 1-й вариант (там выигрыш всё равно будет мизерным), а если часто, то лучше второй.
Исследования не проводил, но мне кажется, что получать значение квара выйдет дороже, чем значение переменной.

Это я ещё не вспомнил, что бывают значения кваров, которые нужно обрабатывать и проверять на корректность. Ну как у меня цвета в плагинах.
Пример:
int iColor;
...
    cvar = CreateConVar("sm_*_color", "f0f", "Default * color. Set by HEX (RGB or RRGGBB, values 0 - F or 00 - FF, resp.). Wrong color code = magenta", FCVAR_PRINTABLEONLY);
...
{
    char clr[8];
    cvar.GetString(clr, sizeof(clr));
    clr[7] = 0;

    int i;
    while(clr[i])
    {
        if(!(clr[i] >= '0' && clr[i] <= '9') && !(clr[i] >= 'A' && clr[i] <= 'F') && !(clr[i] >= 'a' && clr[i] <= 'f'))
        {
            iColor = 0xFF00FF;
            return;
        }
        i++;
    }

    clr[6] = 0;
    if(i == 3)
    {
        clr[4] = clr[5] = clr[2];
        clr[2] = clr[3] = clr[1];
        clr[1] = clr[0];
        i = 6;
    }

    if(i != 6) iColor = 0xFF00FF;
    else StringToIntEx(clr, iColor, 16);
}
Тогда только 3-й вариант.
Сообщения автоматически склеены:

Кстати зачем тогда все постоянно пишут Handle g_hEnable = INVALID_HANDLE; ?
Привычка или карго-культ, наверное.
В SM1.6.3 точно было приравнивание к нулю этого типа, в более ранних версиях - хз, но и там могло так быть.
 

Nekro

Терра инкогнита
Сообщения
4,037
Реакции
2,281
значение квара выйдет дороже, чем значение переменной.
В смысле g_cEnablePlugin и bEnable ?
Сообщения автоматически склеены:

В старом INVALID_HANDLE
а в новом будет null вроде так
А какой смысл, если они изначально и так 0?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,560
Реакции
5,063
@Nekro, да
Сообщения автоматически склеены:

@babka68, ну если тип указан через пробел, а не двоеточие, то это уже новый синтаксис.
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
А какой смысл, если они изначально и так 0?
Вероятно, привычка от C++, где переменным при инициализации не присваивается значение автоматически.
А еще на старом синтаксисе было такое ключевое слово "decl", которое если использовать с массивами / строками без обнуления, то внутри окажется мусор.
 

Madness aka null138

Участник
Сообщения
713
Реакции
737
Вероятно, привычка от C++, где переменным при инициализации не присваивается значение автоматически.
А еще на старом синтаксисе было такое ключевое слово "decl", которое если использовать с массивами / строками без обнуления, то внутри окажется мусор.
или же просто повторяют за теми, которые делают по привычке, не зная для чего оно.
 
Сверху Снизу