Синглтон, антипаттерн и все-все-все

MiksIr

miksir@home:~$
Это и есть предмет разговора. Такая магия — это просто говнокод..
Если формально, то это как раз не магия. Магией в php называется как раз ->smthing при отстутствии prublic $smthing.
Ты сейчас взял и свёл всю тему в другое русло, обсуждение какой-то там фишки PhpStorm, а ведь так всё хорошо шло, можно было прямо из ковшика говном этого падавана юного поливать.
Извини, что не дал тебе поумничать, обсасывая какую-то херню. Но раз хочешь - ты облажался и сам решил срулить с темы. Облажался тут и пытаешься срулить на автокомплит. Так что не нужно говна накидывать - сам измажешься.
 

AmdY

Пью пиво
Команда форума
Закрываю холивар, здесь нет программирование, а какие-то личные разборки. Как маленькие.

p.s. Народ хочет ещё похоливарить, так что просто перенёс в оффтопик.
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
Если формально, то это как раз не магия. Магией в php называется как раз ->smthing при отстутствии prublic $smthing.

Извини, что не дал тебе поумничать, обсасывая какую-то херню. Но раз хочешь - ты облажался и сам решил срулить с темы. Облажался тут и пытаешься срулить на автокомплит. Так что не нужно говна накидывать - сам измажешься.
Кто тебе вообще сказал, что свойства нет?
PHP:
class Foo {
    private $queryParser;

    public function __construct(QueryParser $queryParser) {
        $this->queryParser = $queryParser;
    }

    public function bar() {
        $this->queryParser->....
    }
}
vs
PHP:
class Foo {
    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }

    public function bar() {
        $this->container->get('QueryParser')->....
    }
}
Так тебе доступнее? Ты видишь, что во втором случае есть зависимость от контейнера? Ты осознаешь, что это antipattern и говнокод? Если тебе что-то неясно, то lemme know.

Меня тут принципиально раздражает тот момент, что ты, будучи не разобравшись в теме, ляпнул какую-то херню и этот чувак сразу подхватил «да-да, я это имел в виду». Ты ошибся, с кем не бывает. А этот [censored] — понял, что ошибся, и решил срулить с темы с твоей помощью.
 
Последнее редактирование модератором:

AmdY

Пью пиво
Команда форума
Это никакой не синтаксис, это зависимость от контейнера. Решил сменить Pimple на Symfony DIC, а хрен там — Redjik захардкодил всё нахуй.
чё там, сразу на спринговский DI менять стоит, если никто не нахардкодил.
 

Вурдалак

Продвинутый новичок
чё там, сразу на спринговский DI менять стоит, если никто не нахардкодил.
Давай без этого, на практике все так или иначе где-то пишут говнокод, но почему писать вот так правильнее, чем так понимать нужно.
 

Фанат

oncle terrible
Команда форума
давайте не будем переходить на личности спасибо
 

Фанат

oncle terrible
Команда форума
Ок, тему я открыл.
Но кто первый начнет переходить рамки цивилизованного общения - не важно, ради троллинга ли, поведясь ли на троллинг - я буду ходатайствовать перед админом забан, невзирая на лица.
Если блин не можете держать себя в руках самостоятельно - будем помогать техническими средствами.

Мат и личные оскорбления недопустимы ни в какой форме.
Жёсткий стёб типа "ххх головного мозга" - можно. Но помните, что
"Крепкое словцо, вовремя и к месту сказанное, облегчает душу. Частая
ругань лишает ругательство смысла. Примечание: ругань не сделает карты
хорошими, а ветер - попутным"
http://lib.ru/LONDON/night.txt
 
Последнее редактирование:

Redjik

Джедай-мастер
Ой, да тему можно было и не открывать, но я могу подвести итог.

Рома, в рамках твоего класса SL, кончено, не нужен, тут я согласен с Никитой.
Но говорить, что SL антипэттерн - глупо, и это уже мое мнение.

Вурдалак путает DIC и DI. Подменяет в своих примерах эти понятия. Отсюда и общее недопонимание.
Ежу понятно что посреди контроллера $container->get('mail') - говнокод, но я не вижу ничего криминального (как и авторы популярных фреймворков, да и просто люди с большим опытом - не вижу ничего зазорного перенимать чужой опыт) использовать SL для крупных компонентов.

PHP:
public function doSmth()
{
    $acl = $this->getAcl();
}

/**
* reutrn какойнить интерфейс или обьект
*/
protected function getAcl()
{
    return $this->get('security.acl.provider');
}
И yii и yii2 и даже богоугодный symfony2 постоянно используют DIC в качестве SL (и да я подменяю намеренно это понятия, ибо я хз - где можно DIC использовать, кроме как в качестве SL, хотя и можно извратиться)

Чтобы не быть голосовным
yii - 351 раз в ФВ используется Yii::app() (в районе 50 на тесты и в райное 100 на виджеты - их можно не считать)
yii2 - 183 рвза в ФВ используется Yii::$app (тоже довольно много на тесты, виджеты еще не ковырял)
symfony2 - 193 раза в ФВ используется getContainer

И да, я постоянно применяю то, о чем говорю на практике и никаких проблем ни с тестами, ни с автокомплитом ни у кого не было.
Если нужно получить какой-то компонент из SL, то лучше это делать через гетер, тогда все прекрасно мОкается.
 
  • Like
Реакции: Dez

Redjik

Джедай-мастер
Просто порой смешно читать гнев и ярость теоритиков, которые с пеной у рта доказывают, что надо везде пихать DI.
Если бы они написали хоть одно простенькое приложение, то понимали бы, что будет огромный оверхед, если пихать через DI в контроллер и RBAC и mail и какой-нибудь RpcConnector. Мне эти компоненты не нужны, когда я пишу страницу с hello world, но нужны в другом месте приложения.

1) Можно тупо пихать во все контроллеры эти компоненты, но страдает lazyLoad
2) С другой строны можно пробовать отследить зависимости перед инициализацей обьекта контроллера через рефлексию, но это срадни лечению гланд через анальное отверстие
3) А можно не капать на мозги и испоьзовать, ГРАМТОНО !!!1111, DIC в качестве SL
 

Redjik

Джедай-мастер
Еще раз извиняюсь за свое неприемлемое поведение, порой школоло в голову бьет :D
 

Вурдалак

Продвинутый новичок
Вурдалак, по твоему использование гетеров приравнивается к пэттерну? внутри то тот же самый $container->get('QueryParser')
не трясите ерундой, разницы нет
— этот человек с утра вообще не понимал о чём идёт речь, теперь лезет в бой. После драки кулаками не машут, чувак.
 

MiksIr

miksir@home:~$
Зачем так много писать. Достаточно пойти и почитать Фаулера. Что-то я не находил у него там слов "антипаттерн", когда он сравнивал DI и SL. Что-то я даже у него находил идею, что можно брать SL и инжектировать его. А что тут кто на форуме пишет... баловство.
Для многих случаев SL вполне достаточно. А термин DIC вообще непонятно откуда взялся и походу каждый понимает под ним что-то свое, от банального SL до Ioc контейнера.
И, кстати, вот не представляю себе DI с Lazy Load классов.
 

MiksIr

miksir@home:~$
MiksIr, Вурдалак дал хорошую ссылку http://phpclub.ru/talk/threads/Синглтон-антипаттерн-и-все-все-все.77408/#post-696868 на чём и стоило остановить холивар, каждый сам может решать что и когда применять.
Так себе ссылка, те же абстрактные бла-бла.
It is really hard to write a unit-test in the first case. You can not “click through” to where the code behind this service is located. You don’t get auto completion on the functions you call, so it’s hard to find out which other methods you could use. It’s even hard to find out which other parameters you could pass! You’re locking your code into Symfony. It’s easy for your controller to grow too bit and secretly require more services then one class should ever use
Не нравится $sl->get('service') из-за автокомплита, пусть будет $sl->service. Прекрасно можно описать. Тесты? Ну, в абстрактном бла-бла я предпочитаю Фаулера.
I've often heard the complaint that these kinds of service locators are a bad thing because they aren't testable because you can't substitute implementations for them. Certainly you can design them badly to get into this kind of trouble, but you don't have to. In this case the service locator instance is just a simple data holder. I can easily create the locator with test implementations of my services.
 

Вурдалак

Продвинутый новичок
Достаточно пойти и почитать Фаулера. Что-то я не находил у него там слов "антипаттерн"
Argumentum ab auctoritate. «Не нашёл у Фаулера!»

Для многих случаев SL вполне достаточно
Для многих случаев и Singleton достаточно. Есть куча простых приложений.

Скорее всего тут непонимание слова «antipattern». Я всегда понимаю под этим нечто, что может на первый взгляд решать проблемы здесь и сейчас, но ведёт к созданию проблем в будущем. Если какая-то шняга мне может создать проблемы в будущем, то это явно говнокод. Другое дело, что я иногда пишу, как и вы все, говнокод осознанно, понимая, что мне нужно решить задачу, а не подрочить на код. Service Locator именно antipattern. Тут начинаются всякие аргументы к авторитетам: мол, вот же, делают! Если авторитет нафигачил говнокод, то это и не говнокод вовсе. Да нихера. Вот этот самый SL на PHP вы максимум что будете делать это реализовывать через наследование от существующего контейнера с @property. А потом, если проект начнёт расти, вы начнете понимать, что ваши @property могут давно и успешно расходиться с реальностью, потому что это гребаная магия и костыль. На языке Fowler'а, к которому ты ссылаешься, такого говна быть не может.
 

Redjik

Джедай-мастер
Вот этот самый SL на PHP вы максимум что будете делать это реализовывать через наследование от существующего контейнера с @property.
Есть и другой вариант, не все же ровняются на симфони, в богомерзком yii, все @property находятся в одном месте, так что нет проблем ни с тестированием (setComopnent('mail','MySuperMock')), ни с автокомплитом, ни даже с заменой вдруг phpMailer на SwiftMail - @protperty придется менять ровно в одном месте...

но yii же такой фуфуфу
 

Redjik

Джедай-мастер
Да и вообще мне такая позиция кажется ханжеством и лицемерием

1) Не признавай авторитеты - SL антипэттерн, так сказал один чувак... взаимоисключение не?
2) SL говнокод, надо везде DI, иначе проблемы с автокомплитом - но один фреймворк не может нормально работать и расширяться без SL, know ur tools уже в конце концов, если не умеешь писать, так, чтобы не было проблем с SL, не надо срываться на других.
3) На Java нет с этим проблем? - ну так пиши на Java блин

Я не вижу ни конструктивной критики, ни реальных фактов, ни даже более менее четко сформулированной точки зрения - я вижу только бабку на базаре, которая старается как можно громче кричать.

И да - по поводу
MiksIr, Вурдалак дал хорошую ссылку http://phpclub.ru/talk/threads/Синглтон-антипаттерн-и-все-все-все.77408/#post-696868 на чём и стоило остановить холивар, каждый сам может решать что и когда применять.
Он сам себе противоречит, и противоречит этой статье своим же примером.

Напомню в статье 2 примера:
1) SL container в родительском классе
2) SL container инжекстится в конструктор

а вот пример, в котором осуждается 2ой вариант из статьи
PHP:
class Foo {
    private $queryParser;

    public function __construct(QueryParser $queryParser) {
        $this->queryParser = $queryParser;
    }

    public function bar() {
        $this->queryParser->....
    }
}
vs
PHP:
class Foo {
    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }

    public function bar() {
        $this->container->get('QueryParser')->....
    }
}
 

Вурдалак

Продвинутый новичок
все @property находятся в одном месте
В жопе что ли? Извините :D Естественно, в одном. Это не решает проблемы расхождения реального инстанса и этих @property.

Он сам себе противоречит, и противоречит этой статье своим же примером.
Я и приводил best vs bad practice вообще-то, чувак. Открой глаза шо ле.
 

WMix

герр M:)ller
Партнер клуба
вопрос в том что модель не должна иметь записи $this->sl->get('model') или даже в контроллере не должна встречаться?
 
Сверху