JastaFly
@JastaFly

Как сделать код ревью?

Доброго всем времени суток! Попросили сделать код ревью:
<?php

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) {
    die();
}

use Bitrix\Main\Data\Cache;

$cache = Cache::createInstance();
/*ttl 604800 is week*/
if(!$cache->initCache(604800, 'library_classifiers_result_'.$arParams['SEARCH'] ?? 'nosearch', '/iblock/library_classifiers/')) {
    $cache->startDataCache();
    $tmpArResult = [];
    foreach($arResult as $section => $items) {
        foreach($items as $item) {
            if(isset($arParams['SEARCH'])) {
                $continueFlag = true;
                foreach($item['PROPERTIES'] as $propAr) {
                    if($propAr['CODE'] === 'depth' || $propAr['CODE'] === 'PARENT_CODE') {
                        continue;
                    }
                    if(strpos(strtolower($propAr['~VALUE']), strtolower($arParams['SEARCH'])) !== false) {
                        $continueFlag = false;
                        break;
                    }
                }
                if($continueFlag) {
                    continue;
                }
                if(isset($item['PROPERTIES']['PARENT_CODE']['~VALUE'])) {
                    $tmpParents = [];
                    if(!isset($tmpArResult[$section][$item['PROPERTIES']['PARENT_CODE']['~VALUE']])) {
                        $anParent = $item['PROPERTIES']['PARENT_CODE']['~VALUE'];
                        while (!isset($tmpArResult[$section][$anParent]['SECTION_ID']) && isset($anParent)) {
                            $parent = [];
                            foreach($items as $itemTmp) {
                                if($itemTmp['FIELDS']['CODE'] === $anParent) {
                                    $parent = $itemTmp;
                                    break;
                                }
                            }
                            handleElement($parent, $tmpParents, $section, $arParams['SEARCH']);
                            $anParent = $parent['PROPERTIES']['PARENT_CODE']['~VALUE'] ?? null;
                        }
                        $tmpParents[$section] = array_reverse($tmpParents[$section], true);
                        $tmpArResult = array_merge_recursive($tmpArResult, $tmpParents);
                    }
                }
            }
            handleElement($item, $tmpArResult, $section);
        }
    }
    $cache->endDataCache($tmpArResult);
}
else {
    $tmpArResult = $cache->getVars();
}
$arResult = $tmpArResult;

function handleElement($item, &$tmpArResult, $section, $search = false) {
    foreach($item['PROPERTIES'] as $propAr) {
        if($propAr['CODE'] === 'depth') {
            if($propAr['~VALUE'] > 1) {
                $tmpArResult[$section][$item['FIELDS']['CODE']]['DEPTH'] = $propAr['~VALUE'];
            }
            continue;
        }
        if($propAr['CODE'] === 'PARENT_CODE') {
            $tmpArResult[$section][$item['FIELDS']['CODE']]['PARENT_CODE'] = $propAr['~VALUE'];
            $tmpArResult[$section][$propAr['~VALUE']]['CHILDES'] = true;
            continue;
        }
        $tmpArResult[$section][$item['FIELDS']['CODE']]['VALUES'][] = $propAr['~VALUE'];
        $tmpArResult[$section][$item['FIELDS']['CODE']]['NAMES'][] = $propAr['NAME'];
        if($search !== false && $tmpArResult[$section][$item['FIELDS']['CODE']]['INACTIVE'] !== true && strpos(strtolower($propAr['~VALUE']), strtolower($search)) === false) {
            $tmpArResult[$section][$item['FIELDS']['CODE']]['INACTIVE'] = true;
        }
    }
    $tmpArResult[$section][$item['FIELDS']['CODE']]['SECTION_ID'] = $item['SECTION_ID'];
}

Это модификатор компонента Битрикса. Опыта в этом деле у меня не особо много, поэтому подскажите на что стоит обращать внимание? Пока мне тут не нравится куча ифов. Почему не использовать else if? Вообще что лучше с точки зрения производительности куча if или else if или switch case?
  • Вопрос задан
  • 371 просмотр
Пригласить эксперта
Ответы на вопрос 4
zorca
@zorca
А зачем Вас заставили делать код ревью, если Вы даже не знаете, как должно быть? Почитайте код Symfony, попробуйте понять почему так написано... и увольтесь с работы, где заставляют ревьюить код Битрикса. Ведь тут всё гавно, начиная отсутствия единой точки входа в приложение и заканчивая псевдо-ООП в стиле вызова статических методов.
Ответ написан
usdglander
@usdglander
Yipee-ki-yay
Ответ написан
Комментировать
SerafimArts
@SerafimArts
Senior Notepad Reader
Ну... как бы так сказать. С ревью будет сложно, так как тут плохо абсолютно всё. Ну т.е. вообще каждая строчка, кроме "use Bitrix\Main\Data\Cache;". Её переписывать, думаю, не надо. Остальное под нож.

Фиг знает как учиться ревьювить то, что надо просто удалить и написать заново, честно.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Начал было писать комментарии в вашем коде, но тут все очень плохо.

1. Не юзайте подход с проверкой константы и die/exit - это рудимент из времен, когда было модным пихать исполняемый код в публичный каталог вебсервера.
2. Не скупитесь на названия переменных, tmpArResult и anParents - это названия которые не говорят ни о том, что у вас там ни о том, зачем оно.
3. Вынесите логику получения ваших данных в отдельный класс, без кэша.
4. Для сложных данных вполне норм использовать DTO / Entity, ассоциативные массивы не обладают задекларированной структурой.
5. Не используйте глобальные перменные, вообще лучше забудьте про их существование.

Поправьте для начала это, потом приходите посмотрим еще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы