[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Посоветуйте организацию объектной модели
wosheg
В целях обучения на своей работе в техподдержке написал парсер OTRS, но он явно не гибок и наверное неправильно организован с точки зрения ООП.
Пишу сюда, с просьбой дать совет как правильно перестроить уже написанное.

С чем работаем:
Подключаемся к сайту и скачиваем исходный код заявки. В исходном коде при помощи регулярок достаем нужную информацию, среди которой будут пути к файлам для скачивания и ID-сообщений, исходный код которых нужно также скачивать с сайта и вновь парсить.

Что сделано:
Имеется 4 класса: Менеджер (Manager), Заявка (Bid), Общие функции (General), Внешние функции (External).

1) В классе Manager я подключаю через require_once файлы с остальными классами.
Здесь происходит первичное подключение к сайту через curl, скачивание исходного кода заявки и передача его для парсинга в класс Bid, скачивание сообщение и передача их для парсинга в класс Bid, скачивание файлов.
А также множество таких функций, цель которых получить не всю пропарсенную заявку, а только конкретный её элемент, например только владельца:

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

Структура класса такова:

class Manager extends Bid {

function __construct($login, $password, $url) {
...

}

public function getBid($bidId) {
...
return Bid::__construct($bidId, $bidSrc);
}

public function owner() {
return $this->owner;
}
...
}

2) Класс Bid предназначен для парсинга переданного в его конструктор исходного кода заявки и присвоение найденного результата к protected переменным. Также в конструкторе мы обращаемся в класс Manager, чтобы он скачал сообщения для дальнейшего парсинга.

Структура класса:

class Bid extends General {

protected $BidId;
protected $owner;
...


private $bidSrc;

function __construct($bidId, $bidSrc) {
$this->bidId = $bidId;
$this->bidSrc = $bidSrc;
$this->getOwner();
...


$this->messagesSrc = Manager::getDownloadMessages();
$this->getEmail();
...

}

protected function getOwner() {
$resOwner = array();
if (preg_match_all('/<label>Владелец:<\/label>[^>]+<p[^>]+title=([\'"])?((?(1).+?|[^\s>]+))(?(1)\1)/', $this->bidSrc, $resOwner)) {
$this->owner = $resOwner[2][0];
return true;
} else {
$this->owner = 'failed';
return false;
}
}

...
}

3) Класс General содержит общие функции, одни из которых предназначены для класса Manager (для работы с файлами), а другие для класса Bid (например, перевод даты в формат timastump и прочее).

Структура класса:

class General extends External {

function __construct() {

}


protected function dateToTimestamp($resDateCreation) {
...
}
...
}

4) Класс External содержит функции написанные не мной, например сохранение массива в файл, транслитерация русских букв в латиницу и прочее. Данные функции могут использоваться как классом Manager, так и классом Bid.

Структура класса:

class libExternal {
protected function translit($name) {}
...
}

В фирме также имеются php-программисты, но отвлекать их от работы нельзя. Хотя, одному более-менее лояльному дал посмотреть свой код, так он сказал, что чуть ли всё ошибочно. Так он заявил, что я не понимаю для чего нужно наследование, раз использую такую цепочку наследований. Тем более, что тут наследованием и не пахнет.
Сказал, что если я захочу использовать класс Bid отдельно, то из-за $this->messagesSrc = Manager::getDownloadMessages(); сделать этого не смогу. Что объектная модель не гибкая. Например, если я захочу получить только список файлов для скачивания, а не скачивать их, то этого сделать не смогу, так как не предусмотрено и мне придется лезть в твой класс и вносить изменения, а представь, что сделать я этого не могу.
Посоветовал переделать все так, чтобы от пользователя скрывалась вся техническая сторона (подключение к сайту, парсинг, скачивание файлов), но пользователь не ограничевался бы в возможностях по манипуляции с полученными данными. Что называть классы как "Общие функции" и "Внешние функции" глупо.

Вот прошу Вас дать советы, как было бы правильно перестроить код с точки зрения ООП.

Понятно, допустим я наследование уберу, но как я буду передавать в другой класс собранные ID сообщений для их скачивания и обратной передачи их исходного кода в класс парсинга.


Спасибо за любые советы.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.