majordomo icon indicating copy to clipboard operation
majordomo copied to clipboard

Упрощение нагруженной функции getObject

Open xor2016 opened this issue 2 years ago • 7 comments

https://github.com/sergejey/majordomo/blob/c772b18d1ddb0579820031a0b8f6d6161a333683/lib/objects.class.php#L389

Опираясь на постулат, что имя объекта в системе уникально, можно упростить весьма часто используемую функцию


function getObject($name)
{
    if (trim($name)=='') return 0;
    if (preg_match('/^(.+?)\.(.+?)$/', $name, $m)) { //уберём класс спереди
        $name = $m[2];
    }
    $rec = SQLSelectOne("SELECT ID FROM objects WHERE TITLE = '".DBSafe($name)."'");
    if ($rec['ID']) {
        include_once(DIR_MODULES . 'objects/objects.class.php');
        $obj = new objects();
        $obj->id = $rec['ID'];
        $obj->loadObject($rec['ID']);
        return $obj;
    }

    return 0;
}

xor2016 avatar May 28 '22 08:05 xor2016

У себя здесь селект и разбор имени вообще убрал, передаю нейм в копию лоадобъекбутитле. В цикл.пхп только поправить вызов этой с классом

Alexandr-logrus avatar May 29 '22 09:05 Alexandr-logrus

Так а выигрыш в чём? Если условие того, что имя состоит из КЛАСС.ОБЪЕКТ не сработает, то код внутри не будет выполняться.

sergejey avatar May 30 '22 17:05 sergejey

класс.объект только в одном месте, у себя подобное исключил, ксор выше несколько сократил объем функции этой и сджойнил во второй, но я б пошел дальше

function getObject($name) { if (trim($name)=='') return 0;

include_once(DIR_MODULES . 'objects/objects.class.php');
$obj = new objects();
$obj->loadObjectByTitle($name);
return $obj;

}

Alexandr-logrus avatar May 30 '22 17:05 Alexandr-logrus

Так а выигрыш в чём? Если условие того, что имя состоит из КЛАСС.ОБЪЕКТ не сработает, то код внутри не будет выполняться.

старался сохранить логику работы. вызов функции возможен с параметром $name = 'object' либо $name = 'class.object'. не понял, для чего нужна проверка на if (!$rec['ID']) с идентичным запросом, убран запрос с объединением объектов и классов. ну и сам принцип уникальности имён объектов приводит к идее Логруса об излишествах в виде класс.объект и ещё большему упрощению)

Кстати, в курсе, что разрешение символа _ в имени приводит к возможной путанице? типа объект_1 , объект11,..., объектz1 попадают по маске объект_1 (

xor2016 avatar May 31 '22 20:05 xor2016

кстати, идём в loadObject и видим там снова https://github.com/sergejey/majordomo/blob/c772b18d1ddb0579820031a0b8f6d6161a333683/modules/objects/objects.class.php#L322 SELECT * FROM objects WHERE ID=" . (int)$id ((

xor2016 avatar May 31 '22 20:05 xor2016

видим, что в getObject слазили в таблицу, нашли всю инфу по объекту и вызываем loadObject, где снова лезем туда же за уже готовым( Соглашусь с Логрусовым loadObjectByTitle ))

xor2016 avatar May 31 '22 21:05 xor2016

а так?

/**
 * Summary of getObject
 * @param mixed $name Object name/class.object name
 * @access public
 * @return int|objects
 */
function getObject($name)
{
    if (trim($name)=='') return 0;
	include_once(DIR_MODULES . 'objects/objects.class.php');
	$obj = new objects();
	$obj->loadObjectByTitle($name);
	return $obj;
}
/**
* loadObjectByTitle
*
* Description
*
* @access public
*/
    function loadObjectByTitle($name)
    {
    if (trim($name)=='') return 0;
//для совместимости
//----------------------
    if (preg_match('/^(.+?)\.(.+?)$/', $name, $m)) { //уберём класс спереди
        $name = $m[2];
    }
//----------------------
        $rec = SQLSelectOne("SELECT  objects.*,classes.TITLE CL_TITLE  FROM objects join classes ON objects.CLASS_ID = classes.ID WHERE objects.TITLE = '".DBSafe($name)."'");
        if (IsSet($rec['ID'])) {
            $this->id = $rec['ID'];
            $this->object_title = $rec['TITLE'];
            $this->class_id = $rec['CLASS_ID'];
            $this->class_title = $rec['CL_TITLE'];
            $this->description = $rec['DESCRIPTION'];
            $this->location_id = $rec['LOCATION_ID'];
            if (preg_match('/^sdevice(.+?)/', $rec['SYSTEM'], $m)) {
                $this->device_id = $m[1];
            }
        } else {
            return false;
        }
    }

xor2016 avatar Jun 02 '22 09:06 xor2016