четверг, 16 апреля 2015 г.

XC4: Оформление точки входа модуля.Глобальные переменные

правильно думаю так
if (
active_module_XXX
&& func_XXX_is_allowed_something(common_vars)
) {
func_XXX_do_something1(common_vars);
}

где
func_XXX_do_something существующая функция, которая зависит от переменных ядра



Вопрос1
а как лучше передавать глобальные переменные? Если, например, мне надо записать результат в $smarty. Вызывать ее в функции как global или передавать через переменную по ссылке? и $xcart_dir - ее то наверно можно вызывать как global?

Ответ1
те глобальные переменные которые уже есть
можно использовать как глобальные

новых заводить нельзя

ссылки также ухудшают стабильность и сопровождаемость кода
тк облегачают написание кода, но усложняют его чтение и понимание
должно быть наоборот


но будет готов, что мы попросим сделать рефакторинг старой глобальной переменной если ясно видно что она порождает баговый, несопровождаемый код. И твой модуль использует этот баговый, несопровождаемый код.
тут нужно смотреть конкретный случай

Комментарий1
> Если, например, мне надо записать результат в $smarty
Считаю, что как объект (который в РНР передается по ссылке)

Вдруг, рано или поздно, у нас будет несколько объектов Smarty, например,
class MailTemplater extens Smarty
и
class HTMLTemplater extens Smarty
- один для подготовки mail body, другой - для отображения в браузер.
В этом случае не придется модифицировать функцию, в зависимости от назначения твоей функции, приедется вызывать её либо дважды, либо единожды:

func_by_chemisk( $smarty, $params);
func_by_chemisk( $mail_smarty, $params);

Комментарий2
А вообще, мне не нравятся многоэтажные условия в if()
Мне не нравится, что код загроможден большим количеством однотипных конструкций вида
if (!empty($active_modules['Some_Module']))
some_function( $arg1, $arg2, $arg3);

Предлагаю вот такое решение чтобы убрать лишний код.
function func_if_module( $module, $function) { // {{{
global $active_modules;
assert( 'isset( $active_modules) && is_array( $active_modules)');
assert( func_num_args()." >= 2");
$arg_list = func_get_args();
$module = array_shift( $arg_list);
$function = array_shift( $arg_list);
if( !empty( $active_modules[ $module]) && $active_modules[ $module] == "Y") {
assert( 'function_exists( $function)');
return call_user_func_array( $function, $arg_list);
}
} // }}}

Комментарий3
когда ты пишешь в коде
func_if_module( "Some_Module", "some_function", $arg1, $arg2, $arg3);

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

если читатель находится на уровне абстракции 1
ты вынуждаешь его спустится на уровень абстракции 2
тк вызов выглядит безусловным

в этом смысле код

if (
active_module_XXX
&& func_XXX_is_allowed_something(common_vars)
) {
func_XXX_do_something1(common_vars);
}

не меняет уровень абстракции


вызовы типа
if (!empty($active_modules['Some_Module']))
some_function( $arg1, $arg2, $arg3);
можно и переделать на
func_if_module( "Some_Module", "some_function", $arg1, $arg2, $arg3);


если вариант
if (
active_module_XXX
&& func_XXX_is_allowed_something(common_vars)
) {
func_XXX_do_something1(common_vars);
}

не будет читаться лучше

Комментарий4
func_if_module - интересная конструкция, вот только проблема: аргументы будут вычислены безусловно, то есть всегда.

да это точно
func_if_module может увеличивать кол-во нотисов в магазине

Комментариев нет:

Отправить комментарий