ФорумПрограммированиеPHP для идиотовPHP и ООП → Зависимость на уровне интерфейсов

Зависимость на уровне интерфейсов

  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 14 августа 2010 г. 10:27

    Начитался здесь и не только. Пытаюсь теперь писать грамотный ООП код. Но многого еще не понимаю.

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

    К примеру у меня есть объекты $oTag, $oTopic они нужны в множестве других классов. Как быть?

    И по заголовку, что значит "Зависимость на уровне интерфейсов", пытался представить как это, не вышло, приведите пожалуйста примеры.
    Спустя 86 сек.
    глобальные объекты*

    здесь нельзя править свои посты?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 12:14, спустя 1 час 47 минут 41 секунду

    andipas, здесь надо заработать право править свои посты.
    Я, например, храню глобальные данные приложения в реесре, а не очень глобальные в объектах по шаблону monostate
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 14 августа 2010 г. 12:20, спустя 5 минут 23 секунды

    можно регистрировать объекты, через статичекий метод

    файл test.php

    class test
    {
       public static setdb($db){
      self::$db = $db;
    }
       private static $db;
    }

    test::setdb($db);
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 12:35, спустя 15 минут 33 секунды

    adw0rd, чуть вот так надо, что бы была зависимость


    class test
    {
    public static setdb(Db $db){
    self::$db = $db;
    }
    /**
    * @return Db
    */
    public static getDb()
    {
    return self::$db;
    }
    /**
    * @var Db
    */
    private static $db;
    }

    test::setdb($db);
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 12:44, спустя 8 минут 54 секунды

    кстати, помните я говорил, что нужно генерировать фейковые классы для автодополнения? Ну собсно говоря Фабьен так и делает, только он их же и использует, а не __call, как я планировал.


    <?php

    use Symfony\Components\DependencyInjection\ContainerInterface;
    use Symfony\Components\DependencyInjection\Container;
    use Symfony\Components\DependencyInjection\Reference;
    use Symfony\Components\DependencyInjection\Parameter;
    use Symfony\Components\DependencyInjection\ParameterBag\ParameterBag;

    /**
    * ProjectServiceContainer
    *
    * This class has been auto-generated
    * by the Symfony Dependency Injection Component.
    */
    class ProjectServiceContainer extends Container
    {
       protected $shared = array();

       /**
        * Constructor.
        */
       public function __construct()
       {
           parent::__construct(new ParameterBag($this->getDefaultParameters()));
       }

       /**
        * Gets the 'mail.transport' service.
        *
        * @return Zend_Mail_Transport_Smtp A Zend_Mail_Transport_Smtp instance.
        */
       protected function getMail_TransportService()
       {
           $instance = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array('auth' => 'login', 'username' => $this->getParameter('mailer.username'), 'password' => $this->getParameter('mailer.password'), 'ssl' => 'ssl', 'port' => 465));

           return $instance;
       }

       /**
        * Gets the 'mailer' service.
        *
        * This service is shared.
        * This method always returns the same instance of the service.
        *
        * @return Object A %mailer.class% instance.
        */
       protected function getMailerService()
       {
           if (isset($this->shared['mailer'])) return $this->shared['mailer'];

           $class = $this->getParameter('mailer.class');
           $instance = new $class();
           $this->shared['mailer'] = $instance;
           $instance->setDefaultTransport($this->getMail_TransportService());

           return $instance;
       }

       /**
        * Returns service ids for a given tag.
        *
        * @param string $name The tag name
        *
        * @return array An array of tags
        */
       public function findTaggedServiceIds($name)
       {
           static $tags = array (
    );

           return isset($tags[$name]) ? $tags[$name] : array();
       }

       /**
        * Gets the default parameters.
        *
        * @return array An array of the default parameters
        */
       protected function getDefaultParameters()
       {
           return array(
               'mailer.username' => 'foo',
               'mailer.password' => 'bar',
               'mailer.class' => 'Zend_Mail',
           );
       }
    }

  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 14 августа 2010 г. 13:22, спустя 37 минут 30 секунд


    adw0rd, чуть вот так надо, что бы была зависимость


    class test
    {
    public static setdb(Db $db){
    self::$db = $db;
    }
    /**
    * @return Db
    */
    public static getDb()
    {
    return self::$db;
    }
    /**
    * @var Db
    */
    private static $db;
    }

    test::setdb($db);



    Т.е. мне потом в других объектах обращаться к необходимым объектам через этот класс?


    class Db
    {
    public function query($s) {
    echo $s;
    }
    }

    class App
    {
    public static function setdb(Db $db){
    self::$db = $db;
    }
    /**
    * @return Db
    */
    public static function getDb()
    {
    return self::$db;
    }
    /**
    * @var Db
    */
    public static $db;
    }

    class Test
    {
    function go() {
    App::$db->query('go go go');
    }
    }

    $db = new Db;
    App::setdb($db);

    $test = new Test();
    $test->go();
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 14 августа 2010 г. 13:58, спустя 36 минут 16 секунд

    andipas, не делай ненужные методы типа гетДб, сетДб
    ты что на каждую переменную будешь сеттер и геттер писать ?

    сделай чтото типа setData($key, $value), getData($key)
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 14:18, спустя 19 минут 46 секунд

    andipas, ну можно использовать посредник - http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=36.
    Вообще, все зависит от конкретных целей, которые вы преследуете.

  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 14:21, спустя 3 минуты 36 секунд

    Т.е. мне потом в других объектах обращаться к необходимым объектам через этот класс?

    PHP

    class Db
    {
       public function query($s) {
           echo $s;
       }
    }

    class App
    {
       public static function setdb(Db $db){
          self::$db = $db;
       }
       /**
        * @return Db
        */
       public static function getDb()
       {
           return self::$db;
       }
       /**
        * @var Db
        */
       public static $db;
    }

    class Test
    {
       function go() {
           App::$db->query('go go go');
       }
    }

    $db = new Db;
    App::setdb($db);

    $test = new Test();
    $test->go();

    не правильно, на до
       /**
        * @var Db
        */
      private static $db; //скрытой делать.



    NRG, не обязательно. Вот например если много надо получать всякой фигни, то да, а если надо получить бд, сессию, и еще одну фигню, то можно и три метода сделать только. Я делаю так
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 14 августа 2010 г. 14:33, спустя 12 минут

    не правильно, на до
    /**
    * @var Db
    */
    private static $db; //скрытой делать.


    Тогда здесь как быть?


    class Test
    {
    function go() {
    App::$db->query('go go go');
    }
    }


    Ошибка будет. Т.е. этот класс использовать для вызова нужных объектов? Только я тогда не понимаю, чем это лучше global ?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 14:49, спустя 16 минут 17 секунд

    class Test
    {
    function go() {
    App::getDb()->query('go go go');
    }
    }


    переменная db в App должна быть скрытой, иначе городить это всё смысла нет. Если она будет скрытой и соответсвовать интерфейсу Db. тогда ты сможешь подменить её другим объектом, который сможет реализовать этот интерфейс. Вопросы, что чем лучше глобал или не глобал, надо рассматривать на конкретном приложении, к конкретными ТЗ и планами развития иначе это будут спорные вопросы.
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 15:38, спустя 48 минут 26 секунд

    фото на дуда вроде похоже
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 14 августа 2010 г. 20:19, спустя 4 часа 41 минуту 18 секунд

    Я делаю так


    Спасибо, попробую применить это в своем мини-проекте, который изначально был полностью на функциях…
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 14 августа 2010 г. 21:21, спустя 1 час 2 минуты 4 секунды

    Кстати использование Registry это и есть - Зависимость на уровне интерфейсов?
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 14 августа 2010 г. 21:40, спустя 18 минут 31 секунду

    Я думаю, зависимость на уровне интерфейсов - это когда, ты работаешь с объектом зная только его интерфейс.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!