как правильно назвать класс

Активист

Активист
Команда форума
Собственно, есть задача, выдергивать данные, в зависимости от конструктора, как правильно называется реализация этого класса, хелпер?

Есть объект типа Base_Fias_AddressObject (адресный объект ФИАС), также есть объект ФИАСа дом (Base_Fias_House) и два дополнительных аттрибута - house_custom, flat.

Нужно: вытягивать актуальный объект, а также дополинтельно из дерева ФИСА вытаскивать регион, город, район и т.п. (вообщем все уроня) , а также получить представление адреса, реализация:

Как правильно называть?) Хелпер

PHP:
<?php 
class Base_Fias_Address_Helper
{
    /**
     * GUID региона (L1)
     * @var string (UUID)
     */
    public $region_guid;

    /**
     * Регион
     * @var null|Base_Fias_AddressObject
     */
    protected $region;    
   
    /**
     * GUID автономии (L2, в документации - зарезирвировано, в БД ФИАС объектов с L2 нет
     * @var string (UUID)
     */
    public $auto_guid;
   
    /**
     * Автономии (L2, в документации - зарезирвировано, в БД ФИАС объектов с L2 нет)
     * @var null|Base_Fias_AddressObject
     */
    protected $auto;
   
    /**
     * GUID района (L3)
     * @var string (UUID)
     */
    public $area_guid;
   
    /**
     * Район
     * @var null|Base_Fias_AddressObject
     */
    protected $area;    
   
    /**
     * GUID города (L4)
     * @var string (UUID)
     */
    public $city_guid;
   
    /**
     * Улица
     * @var null|Base_Fias_AddressObject
     */
    protected $city;
   
    /**
     * GUID внутрегородского района (L5)
     * @var string (UUID)
     */
    public $ctar_guid;
   
    /**
     * Внутрегородского район (L5)
     * @var null|Base_Fias_AddressObject
     */
    protected $ctar;
   
    /**
     * GUID населенного пункта (L6)
     * @var string (UUID)
     */
    public $place_guid;
   
    /**
     * Населенный пункт (L5)
     * @var null|Base_Fias_AddressObject
     */
    protected $place;
   
    /**
     * GUID улицы (L7 для улиц, L91 для улиц на дополнительных территориях)
     * @var string
     */
    public $street_guid;
   
    /**
     * Улица
     * @var null|Base_Fias_AddressObject
     */
    protected $street;
   
    /**
     * GUID дополнительной территории
     * @var string
     */
    public $inner_area_guid;
   
    /**
     * Дополнительная территория
     * @var null|Base_Fias_AddressObject
     */
    protected $inner_area;
   
    /**
     * Идентификатор дома
     * @var string
     */
    public $house_guid;

    /**
     * Дом
     * @var null|Base_Fias_AddressObject
     */
    protected $house;
   
    /**
     * Дом (указан вручную)
     * @var string
     */
    public $house_custom;
   
    /**
     *  Квартида, дом, офис
     *  @var string
     */
    protected $flat;
   
    /**
     * Полное наименование адреса
     * @var string
     */
    public $presintation;
   
    /**
     * Идентификатор объекта
     * @var string
     */
    protected $aoguid;    
   
    /**
     * Базовые реализации методов выборки из БД ФИАС
     * @var Base_Fias
     */
    protected $fias;    
   
    /**
     * Содержит экземляр для работы с БД
     * @var Base_Database
     */
    protected $database;
   
    /**
     * Конуструктор объекта
     * @param string $guid
     * @param string $house_guid
     * @param string $house_custom
     * @param string $flat
     * @param Base_Fias $fias
     * @param Base_Database $database
     */
    public function __construct( $aoguid, $house_guid, $house_custom, $flat, Base_Fias $fias, Base_Database $database) 
    {
        $this->aoguid = $aoguid;
        $this->house_guid = $house_guid;
        $this->house_custom = $house_custom;
        $this->flat = $flat;

        $this->fias = $fias;
        $this->database = $database;
       
        // По GUID адресного объекта получим актуальный адресный объект
        $address_object = $fias->getActualAddressObjectUsingGuid($this->aoguid, $database);
       
        if (!$address_object) {
           
            return;
        }

        $presentation_parts = array();
       
        // По Структуре адреса установим аттрибуты
        foreach ( $fias->getActualAddressThread( $address_object, $this->database) as $node) {
           
            if ($node->ACTSTATUS) {
                // Адресный объект атуален
                $actual_node = $node;
            } else {
                // Адресный объект устарел
                $actual_node = $fias->getNextAddressObject( $node, $this->database);
            }
           
            switch ($node->AOLEVEL ) {
               
                case 1:
                    // Регион
                    $this->region = $actual_node;
                    $this->region_guid = $actual_node->AOGUID;
                    break;
                   
                case 2:
                    // Автономия
                    $this->auto = $actual_node;
                    $this->auto_guid = $actual_node->AOGUID;
                    break;
                   
                case 3:
                    // Район
                    $this->area = $actual_node;
                    $this->area_guid = $actual_node->AOGUID;
                    break;
                   
                case 4:
                    // Город
                    $this->city = $actual_node;
                    $this->city_guid = $actual_node->AOGUID;
                    break;
                   
                case 5:
                    // Внутрегородской район
                    $this->ctar = $actual_node;
                    $this->ctar = $actual_node->AOGUID;
                    break;
                   
                case 6:
                    // Населенный пункт
                    $this->place = $actual_node;
                    $this->place_guid = $actual_node->AOGUID;
                    break;
                   
                case 7:
                    // Улица
                    $this->street = $actual_node;
                    $this->street_guid = $actual_node->AOGUID;
                    break;
                       
                case 90:
                    // Пополнительная територия
                    $this->inner_area = $actual_node;
                    $this->inner_area_guid= $actual_node->AOGUID;
                    break;
                   
                case 91:
                    // Улица на дополнитеьной территории
                    $this->street = $actual_node;
                    $this->street_guid = $actual_node->AOGUID;
                    break;
            }
           
            $presentation_parts[] = $actual_node->getPrintableName();
        }
       
        if ( $this->house_guid ) {
            // Дом, выбран из БД ФИАС (дома)
            $house = $this->fias->getActualHouseUsingGuid($this->house_guid, $this->database);
            // Добавим в представление адреса
            $presentation_parts[] = $house->getPrintableName();
             
        } elseif ($this->house_custom) {
            // Дом указан вручную
            $presentation_parts[] = $this->house_custom;
        }
       
        if ($this->flat) {
            // Добавим к представлению кв., офис. и т.п.
            $presentation_parts[] = $this->flat;
        }
       
        $this->presintation = implode(", ", $presentation_parts);
    }

    public function getRegionGuid()
    {
        return $this->region_guid;
    }

    public function setRegionGuid($region_guid)
    {
        $this->region_guid = $region_guid;
        return $this;
    }

    //....
}
 

Активист

Активист
Команда форума
Не, Active Records дергаю из ФИАС отдельным объектом
PHP:
<?php
class Base_Fias
{
    /**
     * Получаем регионы
     * @param Base_Database $database
     * @return multitype:Base_Fias_AddressObject
     */
    public function getRegions(Base_Database $database)
    {
        $sht = $database->query("select * from `app_fias_address_object` where `AOLEVEL` = '1' && `ACTSTATUS` = '1' && `LIVESTATUS` = '1' order by `OFFNAME`");       
        return $sht->fetchAll(PDO::FETCH_CLASS, "Base_Fias_AddressObject");
    }

    /**
     * Получаем адресный объект по AOID
     * @param Base_Database $database
     * @param string $AOGUID
     * @return Base_Fias_AddressObject|false
     */
    public function getAddressObject($AOID, Base_Database $database)
    {
        $sht = $database->prepare("select * from `app_fias_address_object` where `AOID` = :AOID");
        $sht->execute(array("AOID" => $AOID));
      
        return $sht->fetchObject("Base_Fias_AddressObject");
    }
  
    /**
     * Получаем объекты следующего (объект изменен, имеется запись с таким же AOGUID, но уникальным AOID)
     * @param Base_Database $database
     * @param Base_Fias_AddressObject $address_object
     * @return array
     */
    public function getNextAddressObject(Base_Fias_AddressObject $address_object, Base_Database $database )
    {
        $sht = $database->prepare("select * from `app_fias_address_object` where `AOID` = :NEXTID");
        $sht->execute(array("NEXTID" => $address_object->NEXTID));
      
        return $sht->fetchObject("Base_Fias_AddressObject");
    }
  
    /**
     * Получаем актуальный объект по уникальному идентификаторы AOID адресного объекта
     * @param string $AOID
     * @param Base_Database $database
     * @return multitype:Base_Fias_AddressObject
     */
    public function getActualAddressObject($AOID, Base_Database $database)
    {
        $address_object = $this->getAddressObject($AOID, $database);
      
        while ($address_object && $address_object->NEXTID) {
          
           $address_object = $this->getNextAddressObject($address_object, $database);
       }
      
       return $address_object;
    }
  
    /**
     * Возвращает актуальный адресный объект по GUID адресного объекта
     * @param string $address_object $AOGUID
     * @param Base_Database $database
     * @return Base_Fias_AddressObject|boolean
     */
    public function getActualAddressObjectUsingGuid( $AOGUID, Base_Database $database)
    {
        $sht = $database->prepare("select * from `app_fias_address_object` where `AOGUID` = :AOGUID && `ACTSTATUS` = '1'");
        $sht->execute(array("AOGUID" => $AOGUID));
  
        return $sht->fetchObject("Base_Fias_AddressObject");
    }
  
  
    /**
     * Возвращает дочерние элементы
     * @param Base_Fias_AddressObject $address_object
     * @param Base_Database $database
     * @return multitype:Base_Fias_AddressObject
     */
    public function getChildrenActualAddressObjects(Base_Fias_AddressObject $address_object, Base_Database $database)
    {
        $sht = $database->prepare("select * from `app_fias_address_object` where `PARENTGUID` = :AOGUID && `ACTSTATUS` = '1' && `LIVESTATUS` = '1' order by `OFFNAME`");
        $sht->execute(array("AOGUID" => $address_object->AOGUID));
      
        return $sht->fetchAll(PDO::FETCH_CLASS, "Base_Fias_AddressObject");
    }
  
    /**
     *
     * @param Base_Fias_AddressObject $address_object
     * @param unknown $AOLEVEL
     * @param Base_Database $database
     * @return multitype:
     */
    public function getChildrenActualAddressObjectsWithSameLevel( Base_Fias_AddressObject $address_object, $AOLEVEL, Base_Database $database)
    {
        $sht = $database->prepare("select * from `app_fias_address_object` where `PARENTGUID` = :PARENTGUID && `AOLEVEL` = :AOLEVEL && `ACTSTATUS` = '1' && `LIVESTATUS` = '1' order by `OFFNAME`");
        $sht->execute(array("PARENTGUID" => $address_object->PARENTGUID, "AOLEVEL" => $AOLEVEL));
      
        return $sht->fetchAll(PDO::FETCH_CLASS, "Base_Fias_AddressObject");
    }
  
    /**
     * Возвращает адреса для конечных объектов
     * @param Base_Fias_AddressObject $parent_address_object
     * @param unknown $offset
     * @param unknown $limit
     * @param Base_Database $database
     * @return multitype:Base_Fias_AddressObject
     */
    public function getStreets(Base_Fias_AddressObject $parent_address_object, $offset, $limit, Base_Database $database)
    {
        if ($parent_address_object->AOLEVEL == 90) {
      
            $sht = $database->prepare("select * from `app_fias_address_object` where `PARENTGUID` = :PARENTGUID && `AOLEVEL` = '91' && `ACTSTATUS` = '1' && `LIVESTATUS` = '1' order by `OFFNAME`  limit :OFFSET, :LIMIT");
          
            $sht->bindParam("PARENTGUID" , $parent_address_object->AOGUID, PDO::PARAM_STR);
            $sht->bindParam("OFFSET", $offset, PDO::PARAM_INT);
            $sht->bindParam("LIMIT", $limit, PDO::PARAM_INT);
          
            $sht->execute();
          
        } else {
          
            $sht = $database->prepare("select * from `app_fias_address_object` where `PARENTGUID` = :PARENTGUID && `AOLEVEL` = '7' && `ACTSTATUS` = '1' && `LIVESTATUS` = '1' order by `OFFNAME`  limit :OFFSET, :LIMIT");
          
            $sht->bindParam("PARENTGUID" , $parent_address_object->AOGUID, PDO::PARAM_STR);
            $sht->bindParam("OFFSET", $offset, PDO::PARAM_INT);
            $sht->bindParam("LIMIT", $limit, PDO::PARAM_INT);
          
            $sht->execute();
        }
      
        return $sht->fetchAll(PDO::FETCH_CLASS, "Base_Fias_AddressObject");
    }
  
    /**
     * Возвращает акутальные дома
     * @param Base_Fias_AddressObject $address_object
     * @param string $offset
     * @param string $limit
     * @param Base_Database $database
     * @return multitype:Base_Fias_House
     */
    public function getActualHouses(Base_Fias_AddressObject $address_object, $offset = null, $limit = null, Base_Database $database)
    {
        if (isset($offset) && isset($limit)) {
      
            $sht = $database->prepare("select * from `app_fias_house` where `AOGUID` = :AOGUID && `ENDDATE` >= NOW() limit :OFFSET, :LIMIT");
          
            $sht->bindParam("AOGUID" , $address_object->AOGUID, PDO::PARAM_STR);
            $sht->bindParam("OFFSET", $offset, PDO::PARAM_INT);
            $sht->bindParam("LIMIT", $limit, PDO::PARAM_INT);
          
        } else {
          
            $sht = $database->prepare("select * from `app_fias_house` where `AOGUID` = :AOGUID && `ENDDATE` >= NOW() ");
          
            $sht->bindParam("AOGUID" , $address_object->AOGUID, PDO::PARAM_STR);
          
        }
          
        $sht->execute();
      
        $objects = $sht->fetchAll(PDO::FETCH_CLASS, "Base_Fias_House");
      
        $housenum = $buildnum = $strucnum = array();
      
        foreach ($objects as $key => $house_object) {
            /* @var $house_object Base_Fias_House */
            $housenum[$key] = $house_object->HOUSENUM;
            $buildnum[$key] = $house_object->BUILDNUM;
            $strucnum[$key] = $house_object->STRUCNUM;
        }

        array_multisort($housenum, SORT_NATURAL, $buildnum, SORT_NATURAL, $strucnum, SORT_NATURAL, $objects);
      
      
        return $objects;
    }
  
    /**
     * Возвращает актуальный дом
     * @param string $HOUSEID
     * @param Base_Database $database
     * @return Base_Fias_House
     */
    public function getActualHouse($HOUSEID, Base_Database $database)
    {
        $sht = $database->prepare("select * from `app_fias_house` where `HOUSEID` = :HOUSEID ");
        $sht->execute(array("HOUSEID" => $HOUSEID));
        return $sht->fetchObject("Base_Fias_House");
    }
  
   // ..
}
Но, структура ФИАС такова - хранится только последний объект в уровня (скажем УЛИЦА или доп территория (СНТ) ), остальные объекты достраиваются по цепочке уровней, но в моей БД мне надо хранить GUIDы всего дерева (что бы дергать контрагентов по ГЕО локационным данным), а также строить тесктовую интерпритацию адреса (представление адреса), вот и класс, который по GUID. Так вот, как назвать класс в который я передаю данные GUID и доп параметры (дом), а тот уже выполняеет операции, отдает мне нужные аттрибуты.
 

fixxxer

К.О.
Партнер клуба
Непонятно как назвать, потому что это очень странная архитектура (особенно касаемо логики в конструкторе). Я бы вообще поделил на три класса это:
1) доставалка из базы
2) хелпер с логикой (твои эти ифы и свитчи)
3) value object, содержащий собственно нужные тебе данные
 

флоппик

promotor fidei
Команда форума
Партнер клуба
fixxxer, я уже приготовил попкорн. Щас тебе расскажут, почему ты не понимаешь ничего в русском-ОПП-родом-из-1-С.
 

Активист

Активист
Команда форума
1) доставалка из базы
Есть объьект, Base_Fias (она достает из базы)

2) хелпер с логикой (твои эти ифы и свитчи)
Т.е. это как раз хелпер?

3) value object, содержащий собственно нужные тебе данные
$sht->fetchObject("Base_Fias_AddressObject");
Как раз и возвращает адресный объект ФИАС ( http://wiki.gis-lab.info/w/ФИАС ), который в точность повторяет структуру базы данных ФИАС

Что касается логики конструктора:
1. Сама по себе адресная база ФИАС как бы должна быть всеобъемлющая и содержать даже поле в сельской местности, и дома с точностью до литеры (по факты там 2 с половиной миллиона адресных объектов и около 35 миллионов домов). Адресный объект состоит из AOID (уникальный ключ UUID), и GUID - по которому ищится история.
2. Бывает, что дома нет в ФИАС, и его нужно указывать вручную.
Плюс адресный объект это и регион, и район, и все, в общем, все адресные объекты лежат в одной базе, вот и вопрос - как правильно назвать класс, который из одного адресного объекта вытягивает всю его структуру, а если еще и указали
свой дом (которого нет) и уточняющий парамтер (офис там).
3. Юзер из формы передается конечный (один GUID), младший по уровню, вот и из этих пользовательских данных (один GUID, GUID дома, кастомный дом и квартира) нужно вытянуть полную структуру базы, засунуть все в СУБД (что бы вытягивать контрагентов по региону, городу, в пределах радиуса)
 
Последнее редактирование:

Активист

Активист
Команда форума
Сверху