Лоадер для двух классов

ForJest

- свежая кровь
2NetFly
Я могу сказать лишь что посоветовать какое-либо решение тебе невозможно при таком описании.
Я знаю и опробовал на практике различные рефакторинги. Но все они сводятся к простой мысли - устрани дублирование в коде. Если у тебя нет дублирования в коде то незачем и парится. Если оно есть - устраняй его.
Если не умеешь - читай Фаулера или приводи код, чтобы прочитавшие Фаулера люди тебя чему-то научили. Иначе просто непонятно какими решениями с тобою обмениваться.
 

whirlwind

TDD infected, paranoid
Фактически то же самое, что я описал в первом решении первого сообщения. Только фабрика в данном случае менее гибкая т.к. если возникнет необходимость заместить какой-то из объектов A и B нужно будет переопределить ClassManager.
Если возникает необходимость заместить данные инициализации для 'a' реалтайм, то запросто мона использовать использовать сетер типа $cm->SetConfig('a',$hash). У тебя же все равно после парсинга получается хеш по типу

[a]->{ v1 => 1, v2 => 2,... }
->{ x1 => 1, x2 => 2,... }

Если речь идет об изменении обработчика реалтайм, то тут либо наследование с переопределением, либо регистрация хендлеров для каждого класса. По моему фабрика в таком виде, самый удачный вариант.
 
Читаю я и Фаулера, и "Банду четырех" и прочих полезных авторов. А "парюсь" я из-за того, что прасинг xml - дело не из дешевых. Всем спасибо за помощь.
 

svetasmirnova

маленький монстрик
>А "парюсь" я из-за того, что прасинг xml - дело не из дешевых.
Таки цепляют меня задачки =)
Смотрим что можно сделать. Причём за условие я беру только указанное: настройки в одном xml-файле. Главное ограничение: всё в одном файле. Т.е. решение будет в любом случае подвидом двух приведённых. Ограничение №2: я не слишком шарю в XML, так что использовать буду SimpleXML. Вариант №1 мне не нравится по банальным причинам, поэтому оставим его. Остался вариант №2. Пусть парсинг XML занимет время мизерное по сравнению с созданием объектов. Тогда ConfigManager будет выглядеть как-то так:
PHP:
class ConfigManager {
private $xml;
private $instances = array();
public function __construct($xmlFile) {
$this->xml = simplexml_load_file($xmlFile);
}
public function getX()
{
if (!isset($this->instances['X'])) {
$this->instances['X'] = $this->createClass('X');
}
return $this->instances['X'];
}
...
}
Т.е. вариант ФорДжеста.

Теперь вернёмся к тому, что парсинг XML занимает время, которым нельзя пренебречь. К счастью, есть такая функция как [m]simplexml_load_string[/m]. Вопрос, как заполучить строку, содержащую xml, описывающий объект класса X.
PHP:
class ConfigManager {
private $xml = array();
private $instances = array();
public function __construct($xmlFile) {
//$this->xml должен стать типа:
//array (
//'X' => 'xml_not_parsed_string',
//...
//)
//сделать это можно регулярными выражениями, например
}
public function getX()
{
if (!isset($this->instances['X'])) {
$this->instances['X'] = $this->createClass('X', simplexml_load_string($this->xml['X']));
}
return $this->instances['X'];
}
...
}
Уже лучше. Может быть: регулярки вещь тоже не самая быстрая. А что быстрого придумали люди? Я знаю только индексы =)
PHP:
class ConfigManager {
private $xmlFile;
private $index;
private $instances = array();
public function __construct($xmlFile, $indexFile) {
$this->xmlFile= $xmlFile;
$this->index = new IndexProcessor($indexFile);
}
public function getX()
{
if (!isset($this->instances['X'])) {
list($startBytes, $endBytes) = $this->index->getClassPosition('X');
//считываем с $startBytes по $endBytes из xml-файла и
//присваиваем результат $xml
$this->instances['X'] = $this->createClass('X', simplexml_load_string($xml));
}
return $this->instances['X'];
}
...
}
 
Сверху