Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
xor2016 opened this issue May 28, 2022 · 7 comments
Open

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

xor2016 opened this issue May 28, 2022 · 7 comments

Comments

@xor2016
Copy link
Contributor

xor2016 commented May 28, 2022

function getObject($name)

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


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;
}

@Alexandr-logrus
Copy link
Contributor

Alexandr-logrus commented May 29, 2022

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

@sergejey
Copy link
Owner

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

@Alexandr-logrus
Copy link
Contributor

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

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

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

}

@xor2016
Copy link
Contributor Author

xor2016 commented May 31, 2022

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

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

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

@xor2016
Copy link
Contributor Author

xor2016 commented May 31, 2022

кстати, идём в loadObject и видим там снова

function loadObject($id)

SELECT * FROM objects WHERE ID=" . (int)$id
((

@xor2016
Copy link
Contributor Author

xor2016 commented May 31, 2022

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

@xor2016
Copy link
Contributor Author

xor2016 commented Jun 2, 2022

а так?

/**
 * 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;
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants