[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Новая структура.
twin
Переделал я структуру на другой принцип. В двух словах:

1. Фреймворк запускается с пустым хранилищем. Вообще пустой.
2. При первом обращении за каким-нибудь сервисом включается билдер сервиса, формирует все зависимости, складывает в локатор и сразу выдает пользователю.
3. При следующих обращениях билдер отдыхает, просто достает сервис из локатора.

Что это дает.

1. Экономию памяти.
2. Не нужно мудрить с удовлетворением вложенных зависимостей на уровне контейнера со всякими рефлексиями.
3. Полную автономию компонентов и неограниченные возможности по их сборке в сервис
4. Подменив папку с билдерами на тесты мы легко получим автоматическое тестирование всего фреймворка.
5. Скрытые возможности. Можно совершенно спокойно обратиться напрямую к компоненту и творить с ним все что угодно. Это к вопросу о том, что задекларировано в спецификации:
Цитата
Фреймворк дает свободу программисту, не создавая каких-либо структурных ограничений и конвенций

6. Легкость разработки компонентов, так как они теперь могут спокойно взаимодействовать друг с другом, оставаясь самодостаточными.
7. Сервис можно компановать не только компонентами, но и внешними зависимостями.

Вобщем я не знаю, как этот паттерн называется, я не видел такого в тех фреймворках, в которых рылся в исходниках. Может проглядел, не важно. Важно что мне пока очень нравится.

Есть какие подводные камни?

Я на всякий случай сделал два компонента (mysqli и sqldebug), и билдер к ним.
Все вроде работает как часики smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Молчание - знак согласия? Неужели ни у кого не возникло вопросов? И что, тут раскритиковать нечего что ли... Обидно даже. biggrin.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Молчание - отсутствия интереса.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
chee
Ну а чего тогда тут делаешь? biggrin.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
bestxp
ящик пандоры какой-то

ничем не отличаеться от того что я руками подключу mysqlService когда мне надо будет его использовать прописав коннекты к нему и я бы хотел видеть ошибку при обращении к несуществующему сервису нежели открыть ящик пандоры и удалить весь контент
twin
Цитата (bestxp @ 23.10.2015 - 07:50)
ящик пандоры какой-то

ничем не отличаеться от того что я руками подключу mysqlService когда мне надо будет его использовать прописав коннекты к нему и я бы хотел видеть ошибку при обращении к несуществующему сервису нежели открыть ящик пандоры и удалить весь контент

Или ты не понял, или я тебя. Какая пандора... ошибку он выдаст при обращении к несуществующему сервису, а остальное не догоняю. чего куда руками подключать?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
bestxp
ну ты так написал что builder сам все сделает =) значит он решает за меня как лучше
а зачем мне навязывать решения

или ты не так выразился что теперь точно не понять
twin
Смысл вот в чем. Разбить функционал на мелкие компоненты, а в билдере собирать из них сервис. Вот сейчас есть компонент коннекта Mysqli к примеру и есть компонент коннекта PDO. И есть третий, это дебаггер SQL. Так вот билдер собирает нужную конфигурацию. Берет дебаггер и передает его зависимостью в коннект. Из трех компонентов можно сделать два сервиса. Если добавить еще какой-нибудь, условно скажем SQLite (так не выйдет сейчас, адаптировать надо), то три сервиса из 4 компонентов. Ну и так далее.

Собирается все по общему принципу, в Closure. Но не помещается в конейнер сразу. А только при первом обращении. При следующием готовый сервис достается из контейнера уже.

Вот так билдер устроен:

/**
* Получает сервис из локатора если он есть
* или сначала помещает его туда
*
*
@return object
*/

public function get()
{
if (!$this->locator->checkService($this->service)) {
$this->buildService();
}

return $this->locator->get($this->service);
}

/**
* Строит сервис, удовлетворяя зависимости.
*
*
@return void
*/

protected function buildService()
{
$component = '\ABC\abc\components\\'. $this->service .'\\'. $this->service;
$data = @$this->config[$this->service] ?: [];

$this->locator->setGlobal(
$this->service,
function() use ($component, $data) {
$data['debugger'] = isset($data['debug']) ? new SqlDebug(new View) : null;
return new $component($data);
}
);
}

На каждый сервис свой билдер.

Что я жду от этого, читай выше. :)

А ошибку выдаст процессор, зачем в каджый билдер совать исключения.
    /**
* Выбирает и запускает сервис
*
*
@return object
*/

public function getService($service = null)
{
if (empty($service) || !is_string($service)) {
throw new \InvalidArgumentException('Service name should be a string', E_USER_WARNING);
}

$builder = '\ABC\abc\builders\\'. $service .'Builder';

if (!class_exists($builder)) {
throw new \BadFunctionCallException('Service "'. $service .'" is not defined.', E_USER_WARNING);
}

$builder = new $builder;
$builder->config = $this->config;
$builder->locator = $this->locator;
return $builder->get($service);
}


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

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