Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Какую имплементацию синглтона выбираете вы? / 19 сообщений из 19, страница 1 из 1
01.04.2012, 15:54:25
    #37733533
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
... и почему?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
<?php
switch ($argv[1]) {
    case 'a':
        class Singleton {
            public function getInstance() {
                static $instance;
                return $instance ?: $instance = new static;
            }

            protected function __construct() {}
            protected function __clone() {}
        }

        class a extends Singleton {}
        class b extends Singleton {}
        class c extends a {}
        break;
    case 'b':
        class Singleton {
            private static $instances = array();

            public function getInstance() {
                $class = get_called_class();
                return isset(self::$instances[$class]) ? self::$instances[$class] : self::$instances[$class] = new static;
            }

            protected function __construct() {}
            protected function __clone() {}
        }

        class a extends Singleton {}
        class b extends Singleton {}
        class c extends a {}
        break;
    case 'c':
        class a {
            private static $instance;

            public function getInstance() {
                return self::$instance ?: self::$instance = new self;
            }
        }

        class b {
            private static $instance;

            public function getInstance() {
                return self::$instance ?: self::$instance = new self;
            }
        }

        class c extends a {
            private static $instance;

            public function getInstance() {
                return self::$instance ?: self::$instance = new self;
            }
        }
        break;
    case 'd':
        class Singleton {
            public function getInstance() {
                return static::$instance ?: static::$instance = new static;
            }
        }

        class a extends Singleton {
            protected static $instance;
        }

        class b extends Singleton {
            protected static $instance;
        }

        class c extends a {
            protected static $instance;
        }
        break;
}

var_dump(a::getInstance() === a::getInstance());
var_dump(b::getInstance() === b::getInstance());
var_dump(c::getInstance() === c::getInstance());
var_dump(get_class(a::getInstance()) == 'a');
var_dump(get_class(b::getInstance()) == 'b');
var_dump(get_class(c::getInstance()) == 'c');

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    a::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    b::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    c::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i) {
    a::getInstance();
    b::getInstance();
    c::getInstance();
}
echo microtime(true) - $start_uts, "\n";

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
an0nym@MacBook-Air-an0nym.local ~ $ php test.php a 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.349072933197
1.3529658317566
1.3770401477814
3.5435800552368
an0nym@MacBook-Air-an0nym.local ~ $ php test.php b 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.8438360691071
1.774337053299
1.7799360752106
4.8197588920593
an0nym@MacBook-Air-an0nym.local ~ $ php test.php c 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.3446218967438
1.3232281208038
1.3223729133606
3.5394291877747
an0nym@MacBook-Air-an0nym.local ~ $ php test.php d 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.5106999874115
1.5163450241089
1.5146861076355
4.0018219947815
...
Рейтинг: 0 / 0
01.04.2012, 15:57:49
    #37733535
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
an0nym,

Это типа опроса?
...
Рейтинг: 0 / 0
01.04.2012, 16:27:39
    #37733549
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
А как инстансы получать?
...
Рейтинг: 0 / 0
01.04.2012, 16:31:47
    #37733551
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Я бы предпочел вариант A (хотя раньше делал вариант C), мне они кажутся более простыми и логичными.
Вопрос в том, как заставить редакторы понимать инстанс правильно?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?php

abstract class Singleton {

    /** @return чо? */
    public static function getInstance()
    {
        static $instance;
        return $instance ?: new static;
    }

    protected function __construct(){}
    protected function __clone(){}
}

class B extends Singleton {

    protected $_data;

    public function set($key, $value)
    {
        $this->_data[$key] = $value;
    }
    public function get($key)
    {
        return isset($this->_data[$key]) ? $this->_data[$key] : null;
    }
}

$b = B::getInstance();

//Тот же PHPStorm не понимает правильно методы:
$b->set('a', 10);
var_dump($b-get('a'));
...
Рейтинг: 0 / 0
01.04.2012, 16:52:47
    #37733566
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Я там в варианте 'a' допустил небольшую ошибку - public >static< function getInstance(). :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
an0nym@MacBook-Air-an0nym.local ~ $ php test.php a 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
0.6561861038208
0.65943384170532
0.65889692306519
1.4924190044403
...
Рейтинг: 0 / 0
01.04.2012, 16:53:11
    #37733567
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Hett,

хороший вопрос. Я не знаю.
...
Рейтинг: 0 / 0
01.04.2012, 16:57:03
    #37733570
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
ShSergean0nym,
Это типа опроса?Скорее не опрос в привычном понимании данного слова, а мозговой штурм минусов разных подходов. Я на данный момент больше склоняюсь к подходу один, но меня тем не менее смущает static переменная внутри метода - получается некоторый отход от ООП парадигмы. Но костыли с реализацией синглтона в других подходах меня смущают еще больше. Копипасту имплементации в каждом классе вообще считаю злом.
...
Рейтинг: 0 / 0
01.04.2012, 17:04:46
    #37733578
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
HettЯ бы предпочел вариант A (хотя раньше делал вариант C), мне они кажутся более простыми и логичными.
Вопрос в том, как заставить редакторы понимать инстанс правильно?В будущем можно будет делать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php
class Singleton {
    public static function getInstance() {
        static $instance;
        return $instance ?: $instance = new static;
    }
}

class a {
    use Singleton;

    public function testa() {}
}

a::getInstance()->testa();

(PHPStorm 4.0 EAP понимает, PHPStorm 3.0 возможно нет - в нём вроде не было поддержки trait'ов.)
...
Рейтинг: 0 / 0
01.04.2012, 17:05:57
    #37733579
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
abstract class Singleton {
    public static function getInstance()
    {
        return new static;
    }
    protected function __construct(){}
    protected function __clone(){}
}
...
Рейтинг: 0 / 0
01.04.2012, 17:07:24
    #37733580
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
автор(PHPStorm 4.0 EAP понимает, PHPStorm 3.0 возможно нет - в нём вроде не было поддержки trait'ов.)

Буквально позавчера читал про это нововведение. ПХП становится все ООПшнее.
В Yii подобная реализация имеется (не смотрел как там сделано), называется behavior
...
Рейтинг: 0 / 0
01.04.2012, 17:26:22
    #37733591
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
abstract class Singleton {
    public static function getInstance()
    {
        return new static;
    }
    protected function __construct(){}
    protected function __clone(){}
}


Ой, все, мне идти спать надо, показало что оно работает, сидел думал почему, оказалось что просто проверил не правильно.
...
Рейтинг: 0 / 0
01.04.2012, 17:28:04
    #37733592
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
я там в своем синглетоне опечатался, надо так конечно.

Код: php
1.
 return $instance ?: $instance = new static;
...
Рейтинг: 0 / 0
01.04.2012, 22:25:34
    #37733844
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
Код: php
1.
 return isset(self::$instances[$class]) ? self::$instances[$class] : self::$instances[$class] = new static;


это уже нифига не синглтон. это уже фабрика.
...
Рейтинг: 0 / 0
02.04.2012, 02:55:42
    #37734035
Какую имплементацию синглтона выбираете вы?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
abstract class singleton {

    protected static $_instance;

    final private function __construct() {

    }

    final private function __clone() {

    }

    final public static function getInstance() {
        return static::$_instance ? : static::$_instance = new static();
    }

}


?
...
Рейтинг: 0 / 0
02.04.2012, 06:25:44
    #37734056
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
какой использовать надо решать исходя из требований проекта. если только php 5.3 и выше то одна реализация, если нужна совместимость с 5.2 или ниже, другая и т.д. разницы особой нет.
главное не увлекаться им в принципе. иначе от его использования может быть проблем больше чем профита)
...
Рейтинг: 0 / 0
02.04.2012, 10:31:23
    #37734231
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
ScareCrow
Код: php
1.
 return isset(self::$instances[$class]) ? self::$instances[$class] : self::$instances[$class] = new static;


это уже нифига не синглтон. это уже фабрика.
тогда уж не фабрика а реестр. И если сингтонов много почему бы в реестр не переконвертировать?
Имхо А лучший если брать из предоставленых. Больше на реестр похож, только реализован не на фабрике а на наследовании.
...
Рейтинг: 0 / 0
02.04.2012, 11:00:22
    #37734264
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
РенатИ если сингтонов много почему бы в реестр не переконвертировать?

если синглтонов много - значит чтото не так в архитектуре. зачем их много?
зачастую синглтоны суют везде где даже не нужно, и туда где без них прекрасно можно обойтись
...
Рейтинг: 0 / 0
02.04.2012, 11:08:22
    #37734276
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
r u...зачастую синглтоны суют везде где даже не нужно, и туда где без них прекрасно можно обойтись
На пхп, яве, на сишарпе писал - никогда по жизни синглтоны не требовались. Имхо, слово красивое - мода пошла. :)
...
Рейтинг: 0 / 0
02.04.2012, 11:25:22
    #37734309
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какую имплементацию синглтона выбираете вы?
ShSergeНа пхп, яве, на сишарпе писал - никогда по жизни синглтоны не требовались. Имхо, слово красивое - мода пошла. :)
да похоже на моду. даже разработчики php в доках пишут что синглтон это ахтунг, и надо юзать его очень осторожно. а некоторые вообще считают его антипаттерном(ибо почти тоже самое что global variables).
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Какую имплементацию синглтона выбираете вы? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]