За последние 24 часа нас посетили 21996 программистов и 987 роботов. Сейчас ищут 665 программистов ...

Context

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 18 июн 2010.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Есть система, состав:
    1) библиотеки ядра
    2) пользовательские библиотеки, претендующие на звание "ядровых" (свои драйвера для Translate, Cache, SessionStorage и тд)
    3) 3rdparty libraries (Twig, zf, phpseclib, etc)
    4) модули

    Модули бывают фронтенд и бекенд (клиент и админка соответственно). На клиентской части есть еще виджеты, которые запускаются через шаблоны. Определены интерфейсы вот этих модулей и виджетов:

    PHP:
    1. <?php
    2. interface BL_Application_ModuleInterface
    3. {
    4.     public function __construct(BL_Context $context);
    5.    
    6.     public function process();
    7. }
    8.  
    9. interface BL_Application_WidgetInterface
    10. {
    11.     public function __construct(BL_Context $context, $settings = array());
    12.  
    13.     public function process();
    14. }
    15.  
    То есть в любой модуль или виджет мы обязательно передадим контекст. Что такое контекст? Контекст это

    PHP:
    1. <?php
    2.  
    3. class BL_Context
    4. {
    5.     /**
    6.      *
    7.      * @var BL_Loader
    8.      */
    9.     protected $loader;
    10.     /**
    11.      *
    12.      * @var BL_Application
    13.      */
    14.     protected $app;
    15.     /**
    16.      *
    17.      * @var BL_Request
    18.      */
    19.     protected $request;
    20.     /**
    21.      *
    22.      * @var BL_Response
    23.      */
    24.     protected $response;
    25.     /**
    26.      *
    27.      * @var BL_Page
    28.      */
    29.     protected $page;
    30.     /**
    31.      *
    32.      * @var BL_Locale
    33.      */
    34.     protected $locale;
    35.     /**
    36.      *
    37.      * @var BL_Event_Dispatcher
    38.      */
    39.     protected $eventDispatcher;
    40.  
    41.     protected $db = array();
    42.  
    43.     /**
    44.      *
    45.      * @var BL_Session
    46.      */
    47.     protected $session = NULL;
    48.  
    49.     protected $user = NULL;
    50.  
    51.     protected $users = NULL;
    52.  
    53.     protected $usersManager = NULL;
    54.  
    55.     private static $instance = NULL;
    56.  
    57.     public function __construct()
    58.     {
    59.         $this->request  = BL_Request::instance(); //TODO: use `new`
    60.         $this->response = BL_Response::instance($this->request);
    61.         $this->page     = BL_Page::instance();
    62.     }
    63.  
    64.     /**
    65.      *
    66.      * @return BL_Context
    67.      */
    68.     public static function instance()
    69.     {
    70.         return self::$instance ? self::$instance : self::$instance = new self;
    71.     }
    72.  
    73.     public function injectApp(BL_Application $app)
    74.     {
    75.         $this->app = $app;
    76.         $eventsDir = 'config/application/';
    77.         $eventsDir .= $app->isBackend() ? 'admin/events' : 'events';
    78.         $this->eventDispatcher = new BL_Event_Dispatcher($eventsDir);
    79.  
    80.         $this->loader
    81.             ->injectApp($app) // BC
    82.             ->injectContext($this);
    83.  
    84.         return $this;
    85.     }
    86.  
    87.     public function injectLoader(BL_Loader $loader)
    88.     {
    89.         $this->loader = $loader;
    90.     }
    91.     /**
    92.      *
    93.      * @return BL_Application
    94.      */
    95.     public function app()
    96.     {
    97.         return $this->app;
    98.     }
    99.  
    100.     /**
    101.      *
    102.      * @return BL_Event_Dispatcher
    103.      */
    104.     public function eventDispatcher()
    105.     {
    106.         return $this->eventDispatcher;
    107.     }
    108.  
    109.     /**
    110.      *
    111.      * @return BL_Page
    112.      */
    113.     public function page()
    114.     {
    115.         return $this->page;
    116.     }
    117.  
    118.     /**
    119.      *
    120.      * @return BL_Request
    121.      */
    122.     public function request()
    123.     {
    124.         return $this->request;
    125.     }
    126.  
    127.     /**
    128.      *
    129.      * @return BL_Response
    130.      */
    131.     public function response()
    132.     {
    133.         return $this->response;
    134.     }
    135.  
    136.     /**
    137.      *
    138.      * @return BL_Database
    139.      */
    140.     public function db($token = 'default')
    141.     {
    142.         return isset($this->db[$token]) ? $this->db[$token] : $this->db[$token] = new BL_Database(BL_Settings::get('database', $token));
    143.     }
    144.     /**
    145.      *
    146.      * @return BL_Loader
    147.      */
    148.     public function loader()
    149.     {
    150.         return $this->loader;
    151.     }
    152.  
    153.     /**
    154.      *
    155.      * @return BL_Session
    156.      */
    157.     public function session()
    158.     {
    159.         return $this->session ? $this->session : $this->session = new BL_Session($this->request, $this->response, array(), $this->eventDispatcher);
    160.     }
    161.     /**
    162.      *
    163.      * @return BL_Auth_User
    164.      */
    165.     public function user()
    166.     {
    167.         return $this->user ? $this->user : $this->user = BL_Auth_User::instance($this);
    168.     }
    169.     /**
    170.      *
    171.      * @return BL_Auth_Users
    172.      */
    173.     public function users()
    174.     {
    175.         return $this->users ? $this->users : $this->users = BL_Auth_Users::instance($this);
    176.     }
    177.  
    178.     /**
    179.      *
    180.      * @return BL_Auth_Manager_Users
    181.      */
    182.     public function usersManager()
    183.     {
    184.         return $this->usersManager ? $this->usersManager : $this->usersManager = BL_Auth_Manager_Users::instance($this);
    185.     }
    186. }
    187.  
    Здесь в основном instance - пережитки прошлого.

    Имеет ли право на жизнь такая система?
    Какие могут возникнуть проблемы в дальнейшем и как их разруливать?
     
  2. да )
    непонятно, зачем ты заводил красивые интерфейсы, если спаунишь
    :)
    сделай им тоже интерфейсы и заюзай какой нить dependency container (видимо симфониевский, раз уж у тебя там твиг и евент диспетчер ихние)

    А вообще, красиво так, нравится. Ну, и сам контекст тоже поменять бы. И инстансы из него возращать через мажик-методы, например, что бы не писать руками к каждому новому компоненту строчку в контекстном обьекте.

    Я кстати, вообще лох - у меня контекст - это не обьект, а просто массив ;)
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    сорри, не понял

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


    сейчас есть автодополнение в IDE за счет phpDoc'ов.

    оу, ее, +10 пунктов к самооценке
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    на жизнь имеет право всё, кроме кодогенератора =)
    а так, видится больше проблем чем удобства, во всяком случае для меня. контекст - массив, лучше смотрится.
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дык массив мы можем поломать. А тут никак
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    вообще нужно оценивать относительно вида разработки в котором ведётся проект.
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    это типа фреймворк
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    у меня просто мурашки по коже, от класс монстра в который это может вилиться. а класс монстры это зло
    смотря какой опять же.
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    это скорее CMF наверное?
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    будет приобретать размеры монстра - заюзаю контейнер и все эти db()/request() - будут отрабатывать через __call. Тогда правда придется попрощаться с автодополнением.

    управление контентом - просто модуль. BL_Deploy, который я выкладывал недели 2 назад - из этого же fw.
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Koc
    ты уже пробовал юзать это в реальном проекте. Попробуй, может вообще взгляд поменяешь. Попробуй в одном-двух...
     
  12. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    в чем преимущество? только в
    ? или это просто: часть большой системы(c)
    если фреймворк или какая то либа тогда конечно в классы надо все прятать, что бы как сказал флоппик не засирать глобальную область видимости)
    а если нет то
    :DDD
     
  13. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    та в том-то и весь прикол, что сейчас нужно другими вещами заниматься по этому проекту, но вот руки сопротивляются... Хочется определиться как быть


    дык я и не засираю глобальную область видимости
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Koc
    я вот во многом не могу определиться пока не начну юзать реально и не в одном проекте, потому что ты просто пишешь как бы по ООП, всякие методики применяешь, типа инъекций, а нужны ли там реально эти инъекции или нет, фиг знает, может там и так всё завязано будет, что инъекции нафиг не нужны, ну это например. Пока не сделаешь на своих "велосипедах" пару-тройку РАЗНЫХ проектов, толком не поймешь. Ну мне так кажется. Я, допустим, не могу понять, потому что у меня опыта столько нету, чтобы сразу понять, или потому что я цели плохо ставлю. (зы: но я над этим усердно работаю ;) )

    правильно, она и так засрана кучей функций...
     
  15. У тебя классы жестко закодены. Это херня, и вся твоя "гибкость" ломается тут. Поэтому то и нужен DI контейнер.
    А рефлексия там только в дампере, который юзается для кеширования (читай, нет) а даже если и есть - чем плоха рефлексия? Тем что будет выполнять скрипт, а не другой программист?
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Koc
    так вся эта штука в итоге нужна чтобы инициализировать состояние объекта в итоге?
    Костян
    по мне так просто вся практически инфа про php oo начинается с того что показывают как описывается класс, дескрипторы и т.п. и еше шаблонов проектирования накидано из java, я сейчас решил java немного по изучать (или много если понравится ) так вот там ман и книжка начинается сразу с ооп, написано что "тут не получится писать не классами" (как то так) и начинается описание что зачем почему, почему так а не иначе, где применяется, чем полезно, подробно подробно...
    зы: строгая типизация убивает :\
     
  17. У вас тут еще одна проблема, очень неочевидная для вас (да и в прошлом, и для меня):that cleverness cannot win.
    http://alarmingdevelopment.org/?p=422
    Та же проблема по русски но в общих чертах - http://www.kraynov.com/2010/06/17/cheating-is-good/
     
  18. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Меня убивает до сих пор её отсутствие =)
     
  19. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Padaboo
    так у джавы по-моему не объектов и нету практически...

    а вообще, в php можно обходиться самыми примитивными шаблонами и массивами, потому что это конёк php, зато можно такое накрутить, которое нафиг не надо, но и можно сделать всё очень очень просто, гибко и аккуратно.
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Apple
    еще в 2008 была http://www.php.net/manual/en/language.o ... .php#83442

    но я не проверял его код.


    флоппик
    а, да то понятно, что сейчас классы захардкожены. Но главное то, что их названия уже в одном месте а не разбросаны по всему проекту. Ну какой контейнер посоветуешь? Phemto?
    Тот, который в sf2 не подходит так как требует 5.3.х, а тот, который в 1.4 - отпадает из-за не PEAR-именования классов
     
  21. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    это кто к чему привык))
    флоппик
    Это метод симплеиста, учить человека находить ответ))
    ну... на моем уровне лучше пробовать писать самому чтобы понимать как это работает, к примеру я не пользовался jquery пока не стал до конца уверен, что самостоятельно смогу реализовать хоть немного похожий функционал...
    кроме того это ж интересно самому написать то)
     
  22. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    флоппик
    что то я не понял твой намёк, можешь объяснить конкретно?
     
  23. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Костян
    намек в том что нету ничего зазорно использовать чужие решения, это экономит время, время = деньги)
    так что выходит писать свое решение дорого) как и перфекционизм)
    тут много тем было разных, что воткнуть железку дешевле чем выжимать последнее из кода и т.п.
    если я правильно понял конечно)
     
  24. это экономит поиск ошибок которые уже кто-то нашел, экономит изменение другими кода после тебя, сводит исправление многих ошибок (а то и расширение функционала) к простому апдейту, это делает лучше всем.

    Я решил стать евангиелистом правильной парадигмы программирования )
     
  25. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мне больше это понравилось
    Programming will not grow up until our culture grows up.