Вынесение проверок в функции
Сейчас пересматривал свои последние системы и столкнулся с такой проблемой, которую я же сам и создал. Зачастую у меня одна и та же проверка есть и в функции, и перед тем, как вызывается эта функция. Где ее лучше оставить, а где все-таки лучше снести?
Пример кода:
#define DLG DialogResponse
enum
{
DLG_ENTER_PASSWORD,
}
static const
MIN_LENGTH_PASSWORD = 6,
MAX_LENGTH_PASSWORD = 16;
// неважно где
ShowPlayerDialog(playerid
, DLG_ENTER_PASSWORD
, DIALOG_STYLE_PASSWORD, "Текст", "Введите пароль", "Ок", "Закрыть"); DLG:DLG_ENTER_PASSWORD(playerid, response, listitem, inputtext[])
{
if(!response)
return 1;
new length
= strlen(inputtext
); if(!(MIN_LENGTH_PASSWORD <= length <= MAX_LENGTH_PASSWORD))
return 1;
else if(!IsValidPassword(inputtext))
return 1;
// неважно что
return 1;
}
stock IsValidPassword(password[])
{
new length
= strlen(password
); if(!(MIN_LENGTH_PASSWORD <= length <= MAX_LENGTH_PASSWORD))
return 0;
new string[33+(-2+2)*2+1] = "|[A-Za-z0-9#$-_+=;:@!?]{%d,%d}|";
format(string
, sizeof string
, string
, MIN_LENGTH_PASSWORD
, MAX_LENGTH_PASSWORD
); return regex_match(password, string);
}
Попутно так еще одну вещь хотел бы уточнить все по этому же коду. Понятно, что в моей функции IsValidPassword можно было бы обойтись без формата, если бы MIN_LENGTH_PASSWORD и MAX_LENGTH_PASSWORD были макросами. Но я решил это сделать константами. Вообще сейчас все лимиты и значения стараюсь указывать через константы. Что думаете по этому поводу? Лучше переводить на макросы и забыть про format в таких ситуациях?
- - - Добавлено - - -
Еще вспомнил, что хотел узнать уже давно, но все забывал. Если нужно, пожалуйста, перенесите в отдельную тему. Как вы смотрите на моды, написанные исключительно на C++? Ведь в них идет постоянный вызов нативных функций, что по идее плохо влияет на скорость работы. Но в то же время работа всех функций в C++ идет быстрее. Компенсируется ли быстрота работы кода в C++ вызовом нативных функций из мода?