Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 24 Май, 2012, 10:33:13

Страниц: [1] 2
Печать
Автор Тема: Зависимость на уровне интерфейсов  (Прочитано 953 раз)
0 Пользователей и 1 Гость смотрят эту тему.
andipas    ↓ 
14 Август, 2010, 10:27:00
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

Начитался здесь и не только. Пытаюсь теперь писать грамотный ООП код. Но многого еще не понимаю.
 
Изначально я делал по старинке, глобальные классы, что есть зло?. Теперь добавляю их в конструктор, так правильней вроде? И как вообще лучше?
 
К примеру у меня есть объекты $oTag, $oTopic они нужны в множестве других классов. Как быть?
 
И по заголовку, что значит "Зависимость на уровне интерфейсов", пытался представить как это, не вышло, приведите пожалуйста примеры.
Спустя 1 минуту 26 секунд добавил
глобальные объекты*
 
здесь нельзя править свои посты?
Записан
kostyl    ↓ 
14 Август, 2010, 12:14:41 , спустя 1 час 47 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

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

качество жизни обратно пропорционально количеству лени
adw0rd    ↓ 
14 Август, 2010, 12:20:04 , спустя 5 минут 23 секунды
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17623
Сила слова: 1.67

можно регистрировать объекты, через статичекий метод
 
файл test.php
PHP

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

test::setdb($db);
 
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
kostyl    ↓ 
14 Август, 2010, 12:35:37 , спустя 15 минут 33 секунды
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

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

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);
Записан

качество жизни обратно пропорционально количеству лени
Абырвалг    ↓ 
14 Август, 2010, 12:44:31 , спустя 8 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6094
Сила слова: 1.31

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

<?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',
        );
    }
}
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
andipas    ↓ 
14 Август, 2010, 01:22:01 , спустя 37 минут 30 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16


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

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);

Т.е. мне потом в других объектах обращаться к необходимым объектам через этот класс?
 
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();
 
Записан
NRG    ↓ 
14 Август, 2010, 01:58:17 , спустя 36 минут 16 секунд
НЕ ХУЕТА! ХУЕТА!

Headshot!MultiKill!
Группа: нинзя

Карма: 777
Сообщений: 4700
Сила слова: 16.81

andipas, не делай ненужные методы типа гетДб, сетДб
ты что на каждую переменную будешь сеттер и геттер писать ?
 
сделай чтото типа setData($key, $value),  getData($key)
Записан

Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть
krasun    ↓ 
14 Август, 2010, 02:18:03 , спустя 19 минут 46 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи
Группа: Джедаи

Карма: 41
Сообщений: 1379
Сила слова: 2.97

andipas, ну можно использовать посредник - http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=36.
Вообще, все зависит от конкретных целей, которые вы преследуете.
 
Записан
kostyl    ↓ 
14 Август, 2010, 02:21:39 , спустя 3 минуты 36 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

Т.е. мне потом в других объектах обращаться к необходимым объектам через этот класс?
 
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    ↓ 
14 Август, 2010, 02:33:39 , спустя 12 минут
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

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

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

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

Ошибка будет. Т.е. этот класс использовать для вызова нужных объектов? Только я тогда не понимаю, чем это лучше global ?
Записан
kostyl    ↓ 
14 Август, 2010, 02:49:56 , спустя 16 минут 17 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

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

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

качество жизни обратно пропорционально количеству лени
Troy    ↓ 
14 Август, 2010, 03:38:22 , спустя 48 минут 26 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 45
Сообщений: 2393
Сила слова: 1.88

фото на дуда вроде похоже
Записан

andipas    ↓ 
14 Август, 2010, 08:19:40 , спустя 4 часа 41 минуту 18 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

Я делаю так

Спасибо, попробую применить это в своем мини-проекте, который изначально был полностью на функциях...
Записан
andipas    ↓ 
14 Август, 2010, 09:21:44 , спустя 1 час 2 минуты 4 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

Кстати использование Registry это и есть - Зависимость на уровне интерфейсов?
Записан
krasun    ↓ 
14 Август, 2010, 09:40:15 , спустя 18 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи
Группа: Джедаи

Карма: 41
Сообщений: 1379
Сила слова: 2.97

Я думаю, зависимость на уровне интерфейсов - это когда, ты работаешь с объектом зная только его интерфейс.
Записан
Страниц: [1] 2
Печать
 

Перейти в: