@prophp7

Страница 832 из 1387
Dmitry
13.12.2017
17:05:08
ну и это тоже, вообще больше композиции меньше наследования ;) другое дело, что композиция тоже потребует рефакторинга скорее всего, если заранее не запланировали

Alexander
13.12.2017
17:06:56
рефакторинга любой код потребует, как по мне

Dmitry
13.12.2017
17:15:57
ну как раз наследование с ненарушенным LSP по сути рефакторинга не потребует

Нуу... Я его просто не могу понять ) Все остальные освоил легко, а здесь какой-то тупняк. Ни на классическом примере с квадратами-прямоугольниками, ни на примере с бойлерами отсюда https://dou.ua/lenta/articles/liskov-substitution-principle/
вот, кстати, можешь сказать, почему вот так вот можно: class A { function foo(): ?int { return null; } } class B extends A { function foo(): int { return 1; } } а вот так вот нельзя class A { function foo(): int { return 1; } } class B extends A { function foo(): ?int { return null; } }

Google
Dmitry
13.12.2017
18:41:25
я Алексею, как раз про понимание LSP

Anton
13.12.2017
18:41:45
сори я думал ты спрашиваешь

Konstantin
13.12.2017
19:43:36
почему при использовании в модыксе рево formit с аджакс оберткой я указываю &successMessage=Сообщение успешно отправлено а во всплывающем сообщении написано совсем иное при успешной отправке

Евгений
13.12.2017
19:49:59
смотри, был у тебя car, он принимал любой setspeed.... и ты не парился вообще, и везде делал ->setSpeed(); а потом появился heavycar и ты сидишь, думаешь... а как же сделать так,что бы нельзя было ставить ->setSpeed(250).... в принципе, любое, что придумаешь - скорее всего нарушит LSP. Кинишь исключение - но у тебя код, который раньше работал со спорткаром не ожидает исключение - программа просто упадет... проигнорируешь - тоже плохо, тебе скорость изменили, а ты не бе не ме... в принципе, можешь на ->setSpeed(250) поставить внутри $this->_speed = 80... но тут опять же, зависит от того, как объект используется, например, ты поставил скорость 250 и знаешь, что приедешь в город через час (посчитал), а реально - не приедешь, ибо реальная скорость 80 Как справляться? рефакторить, например ;)
Переопределить метод setSpeed родителя, когда делаешь потомка и поставить ограничение на скорость

Евгений
13.12.2017
19:52:27
что значит "поставить ограничение"?
Ну, если вызываешь этот метод в классе тяжелой машины и скорость превышает 250, то выбрасывать исключение

Dmitry
13.12.2017
19:53:18
но твой другой код, который вызывает setspeed не ждет исключения... никто не ждет.. в итоге программа падает

Dmitry
13.12.2017
19:54:12
вероятно нужно вводить свойство $maxSpeed и каждому наследнику его указывать, т.е. потребуется рефакторинг родительского класса в том числе

Dmitry
13.12.2017
19:55:09
Исключение будет бросать наследник
твой код не знает, с кем работает - с родителем, или с наследником, он знает только про то, что там есть setSpeed

Dmitry
13.12.2017
19:56:55
я правильно понимаю что принцип о том, как правильно расширять логику, а не как проектировать родительские классы на все случаи жизни?

Google
Евгений
13.12.2017
19:57:15
А если потребуется гоночный болид?

Dmitry
13.12.2017
19:57:39
там в примере про SportCar и было

суть одна

Dmitry
13.12.2017
19:58:30
принцип о том, что неверное использование наследования приводит к проблемам ;)

Sergey
13.12.2017
20:53:37
а не все подряд

Dmitry
13.12.2017
20:54:19
одно другому не противоречит ;)

Sergey
13.12.2017
20:55:18
эт да

тут Алан кей недавно в блоге Бугаенко проходил и вещал за то что наследование не очень хорошо к слову) буквально вчера)

Dmitry
13.12.2017
20:57:51
ну против наследования за композицию я вообще давно слышу... несколько лет точно ;)

если у нас есть extended от неабстрактного класса - с большой вероятностью будут проблемы... но в общем, теория не всегда совподает с жизнью ;)

Sergey
13.12.2017
20:59:23
ну против наследования за композицию я вообще давно слышу... несколько лет точно ;)
из таких серьезных источниклв это книжечка GoF где этому целая глава отведена. Это первое упоминание этой мысли из тех что я знаю которая оформлена хорошо (может и раньше были, даже уверен что были), а это уже 94-ый год... больше чем некоторые в этом чате живут

Dmitry
13.12.2017
21:00:46
ну я имею ввиду массовые источники.. форумы всякие, хабр тот же. Книжки хорошо, только кто их читает... единицы ;)

Sergey
13.12.2017
21:01:11
может кому интересно будет) смакота в комментах

там неплохой экскурс в историю

> Note that inheritance can be really useful in very narrow uses, such as refinement. The problem with it in most languages that have it — including Smalltalk-80 — is that you can do too many things with it, and this destroys the ability to reason about what you get when you do inherit.

Andrew
13.12.2017
21:19:40
о, свеженькое :)

?
14.12.2017
01:27:36
PHP RFC: Namespace-scoped declares https://wiki.php.net/rfc/namespace_scoped_declares

Anton
14.12.2017
03:47:36
Наследование - это жесткая зависимость одного класса от другого.

Google
Dmitry
14.12.2017
06:58:46
Всем привет. Подскажите, использование очередей предполагает некое распараллеливание задач на исполнителей. А как узнать, что общая задача выполнена? Пример, парсер нескольких источников. Разбрасываем источники на 3-4 исполнителя. Каким образом (кроме как смотреть состояние очереди) можно узнать, что задача выполнена и можно приступать к обработке результатов?

Ivan
14.12.2017
07:03:18
Писать в конце выполнения куда-то статус. В GEARMAN можно так http://php.net/manual/en/gearmanclient.addtaskbackground.php ( setCompleteCallback при выполнении каждой отдельной задачи) , а в $gmc->runTasks() он сам дожидается

Dmitry
14.12.2017
07:06:32
Писать в конце выполнения куда-то статус. В GEARMAN можно так http://php.net/manual/en/gearmanclient.addtaskbackground.php ( setCompleteCallback при выполнении каждой отдельной задачи) , а в $gmc->runTasks() он сам дожидается
но это накладывает ограничение на то, что я должен знать сколько задач сформулировано и сколько успешных статусов получено....?

Dmitriy
14.12.2017
07:07:28
сохраняй куда-нить результаты работы

Ilya
14.12.2017
07:08:26
можно считать количество отправленных задач и количество выполненых, когда счётчик обнулится значит задачи выполнены

Ivan
14.12.2017
07:12:04
но это накладывает ограничение на то, что я должен знать сколько задач сформулировано и сколько успешных статусов получено....?
нет, просто в коде который ставти задачи когда runTasks выполнится, знгачит все выполнено

Dmitry
14.12.2017
07:12:26
ну то есть предложенный принцип следующий: я запускаю общую задачу парсинга по 10 источникам на 3 воркера. Выполнив задачу, воркер пишит в таблицу какую-то метку и успешность результата (с целью перевыполнить). Считаю кол-во меток. Если совпадет то можеет приступать следующий сервис к работе ... так?

Ilya
14.12.2017
07:16:19
перед добавлением задачи в очередь инкрементируешь счётчик, как задача выполняется декрементируешь его, и в цикле проверяешь не равен ли счётчик 0

Ilya
14.12.2017
07:19:20
счётчик может быть в каком-нибудь редисе

Dmitry
14.12.2017
07:36:30
Вот интересный пример еще (последний коммент)

https://stackoverflow.com/questions/13861459/rabbitmq-wait-for-multiple-queues-to-finish

Victor
14.12.2017
07:50:00
Ребзя, такой оффтоп, должны ли микросервисы быть стейт-лесс ?

Sergey
14.12.2017
07:50:11
почему ты сделал такое предположение?

и где ты собрался в таком случае хранить стэйт

Victor
14.12.2017
07:51:46
Ну, если они будут иметь состояние на себе, тогда их не получиться горизонтально масштабировать

Sergey
14.12.2017
07:52:12
ммм.... то есть ты хочешь сказать что базу данных невозможно горизонтально масштабировать потому что в ней лежит стэйт?)

Sergey
14.12.2017
07:53:32
вот у тебя есть микросервис пользователей, который отвечает за такие мелочи как регистрация, авторизация и т.д. У него своя база данных которая по сути имеет только таблички с профайлами, кредами и т.д.

Google
Sergey
14.12.2017
07:53:41
что тебе мешает масштабировать этот микросервис?

и что именно ты будешь масштабировать?

Яўген
14.12.2017
07:55:09
В вычислительной технике, протокол без сохранения состояния (англ. Stateless protocol) — это протокол передачи данных, который относит каждый запрос к независимой транзакции, которая не связана с предыдущим запросом, то есть общение с сервером состоит из независимых пар запрос-ответ[en].

Сергей, если ты хочешь хранить куки в микросервисе, то не стоит

Sergey
14.12.2017
07:55:46
Сергей, если ты хочешь хранить куки в микросервисе, то не стоит
ммм так я потому и уточнил что подразумевается под стэйтлесс)

если тебе важно с какой копией микросервиса ты говоришь - то да это будет проблемой

ps. хранить не куки а сессии

Яўген
14.12.2017
07:56:58
в общем, лучше всякий раз представляться, когда обращаешься к сервису

Maksim
14.12.2017
07:57:07
что значит "храните куки в микросервисе"?

Яўген
14.12.2017
07:57:35
Admin
ERROR: S client not available

Victor
14.12.2017
07:58:35
Вот я о том же, если говорить о базе, то как бы Ее можно реплицировать или сделать общей. Но вот как быть с локальным состоянием ?

Maksim
14.12.2017
07:58:54
зукипер спешит на помощь

Sergey
14.12.2017
07:59:05
в общем, лучше всякий раз представляться, когда обращаешься к сервису
1. скорее всего у тебя будет единый сервер авторизации который будет предоставлять токены/шмокены 2. скорее всего раз ты упарываешься по микросервисам то про hmac скорее всего ты вкурсах

Яўген
14.12.2017
07:59:32
это как обращение к БД, ты всякий раз должен ввести логин/пароль и новый запрос никак не зависит от предыдущих (опустим кэширование и блокировки)

Sergey
14.12.2017
07:59:44
Вот я о том же, если говорить о базе, то как бы Ее можно реплицировать или сделать общей. Но вот как быть с локальным состоянием ?
база данных по сути является локальным состоянием микросервиса. А глобального состояния у нас нет)

это как обращение к БД, ты всякий раз должен ввести логин/пароль и новый запрос никак не зависит от предыдущих (опустим кэширование и блокировки)
когда ты работаешь с БД, ты один раз вводишь логин и пароль и устанавливаешь соединение с конкретным инстансом (вполне себе стэйтфул штука)

масштабирование в этом случае ты можешь достичь за счет репликации и хранения пула соединений

Вот я о том же, если говорить о базе, то как бы Ее можно реплицировать или сделать общей. Но вот как быть с локальным состоянием ?
так вот, что для тебя микросервис и что он содержит? Откуда там взялся локальный стэйт и что это такое?

Google
Sergey
14.12.2017
08:02:18
и еще один момент - как локальный стэйт мешает тебе масштабироваться? Ведь масштабирование стэйта подразумевает какой-либо вариант репликации и синхронизации данных

Яўген
14.12.2017
08:02:31
если, конечно, упаси б-г, не персистентное

Sergey
14.12.2017
08:03:00
если, конечно, упаси б-г, не персистентное
я никому ничего не должен, да и странное правило которое актуально только для php приложений

Maksim
14.12.2017
08:03:00
эм, а что не так с персистентным?

Sergey
14.12.2017
08:03:16
эм, а что не так с персистентным?
видимо он когда-то не словил исключение и не откатил транзакцию)

Victor
14.12.2017
08:03:31
так вот, что для тебя микросервис и что он содержит? Откуда там взялся локальный стэйт и что это такое?
Ну например, есть сервис который работает с почтой(gmail). Для доступа в неё он получает разрешение от пользователя. Но вот в какой то момент он перестал справляться, в итоге решили его дублировать. (Доступ у пользователя запрашивается единоразово)

Яўген
14.12.2017
08:04:20
видимо он когда-то не словил исключение и не откатил транзакцию)
в персистентном соединении ты хер узнаешь какую транзацию закомитил или откатил ?

Sergey
14.12.2017
08:04:21
по smtp ходит в gmail и скачивает письма?

в персистентном соединении ты хер узнаешь какую транзацию закомитил или откатил ?
у тебя одна транзакция на соединение, это мне будет жирным спойлером о том как организовать работу с ними

Яўген
14.12.2017
08:05:26
а сколько соединений у тебя при pconnect?

Sergey
14.12.2017
08:05:38
Яўген
14.12.2017
08:05:40
Трофимов приглашается

Victor
14.12.2017
08:06:33
по smtp ходит в gmail и скачивает письма?
Заходит По токену, перебирает письма как то их анализируя.

Sergey
14.12.2017
08:06:49
если там только на чтение операция

Petr
14.12.2017
08:07:06
персистентное соединение - кот в мешке. надо четко понимать зачем вы его используете

Sergey
14.12.2017
08:09:00
персистентное соединение - кот в мешке. надо четко понимать зачем вы его используете
* - кот в мешке - надо четко понимать зачем вы его используете и насколько хорошо вы понимаете риски

Victor
14.12.2017
08:09:23
и в чем проблема с маштабированием?
Ну, вот создал я копию, и теперь нужно у пользователя опять попросить доступ что бы сервис мог работать. (Фактически сервис выполняет задачи в фоне по расписанию)

Victor
14.12.2017
08:10:23
Sergey
14.12.2017
08:10:46
Да, токен для доступа к gmail
а как у тебя было до? вот получил ты токен, что дальше? ты его где хранишь?

Страница 832 из 1387