
Evgeniy
25.06.2017
12:51:04
из глубокого покажу ситуации что объект имутабельный не является имутабельном в случае если принимает хоть одно мутабельное свойство
и покажу такой пример)
ну и объясню соответственно а как вывод просто подвиду под сложность, что сложна жить когда объект меняется
особенно в много поточных система с конкаренси, но и в пхп без этого тоже вносит некую сложность)

Google

Sergey
25.06.2017
12:52:38
введи понятие "стэйт"

Evgeniy
25.06.2017
12:52:54
да стейт в самом начале введу
в определение объект

Sergey
25.06.2017
12:53:06
а еще дай отсылку на goto considered harmful

Evgeniy
25.06.2017
12:53:24
объект это состояние и методы над этим состоянием и все это описано в классе

Sergey
25.06.2017
12:53:33
http://david.tribble.com/text/goto.html

Evgeniy
25.06.2017
12:54:19
я там не глубоко почти без подготовки

Sergey
25.06.2017
12:54:35
а объект - мне тут нравится аналогия Грэга Янга - что мол это такой маленький комьютер. со своей изолированной памятью где он хранит стэйт и работает с ним.

Evgeniy
25.06.2017
12:54:57
вон я выше это примерно и написал)

Sergey
25.06.2017
12:55:03
настолько примерно что нет

Evgeniy
25.06.2017
12:55:50
мб мб

Google

Sergey
25.06.2017
12:55:51
смотри, с аналогией с комьютерами - представь что у тебя все объекты в системе общаются по сети. И реально один объект - это комьютер
отсюда следует что геттеры/сеттеры - неэффективно потому что тебе придется передавать "по сети" большое количество данных. И это как бы плохо с точки зрения изоляции

Evgeniy
25.06.2017
12:56:45
но теперь надо объяснить людям что такое изоляция

Sergey
25.06.2017
12:57:05
"изоляция это когда у тебя есть что-то внутри и что-то снаружи. И то что снаружи не влияет на то что внутри и наоборот".

Evgeniy
25.06.2017
12:57:07
нельзя в определение терминов употреблять другие термины объяснение которых ты не дал
а ну ясно с таким объяснением
тогда имутабельность это неизменность объекта, а мутабельнсоть изменяемость объект, конец

Sergey
25.06.2017
12:57:53
фактически это уже не относится к имутабельности так что пофиг
мне просто не нравится когда объекты объясняют при помощи "классов". Это просто кейворд в языке программирования и не более

Evgeniy
25.06.2017
12:58:31
объект это состояние и методы по работе с этим состоянием
а то что оно в пхп или java сделано через классы

Sergey
25.06.2017
12:59:06

Evgeniy
25.06.2017
12:59:23
да методы = поведение в целом одно и тоже
в этом примере

Sergey
25.06.2017
13:00:04
есть объект "дверь", у нее есть состояние - открыта или закрыта. Есть поведение - ее можно открыть и закрыть. А теперь сделай мне имутабельную дверь

Evgeniy
25.06.2017
13:00:54
если раньше было setState ($newState) то теперь open(), close()
поведения

Sergey
25.06.2017
13:01:09
и возможно даже возвращало бы сама себя

Google

Darkling
25.06.2017
13:02:11

Sergey
25.06.2017
13:02:20
ты про java-ский final?

Evgeniy
25.06.2017
13:02:48
сергей существует огромное количество доказательств что ооп не особо пригоден для реального мира, потому что все попытки загнать реальный мир в ооп жестоко разваливались

Darkling
25.06.2017
13:02:50

Evgeniy
25.06.2017
13:03:23
но реальный мир хорош с точки зрения демонстрации ооп

Sergey
25.06.2017
13:03:31

Evgeniy
25.06.2017
13:03:57
при том что если если ты сделаешь дверь имутабельной
кто то расширит твой класс
и сделает setState

Sergey
25.06.2017
13:04:15

Aleh
25.06.2017
13:04:17
ну поэтому не юзайте protected

Evgeniy
25.06.2017
13:04:18
и новый класс станет не имутабельным

Sergey
25.06.2017
13:04:48
наследование НИКАКОГО отношения не имеет к мутабельности. Просто делаешь весь стэйт protected

Evgeniy
25.06.2017
13:04:48

Aleh
25.06.2017
13:04:58

Evgeniy
25.06.2017
13:04:59
вполне возможно что и нет

Sergey
25.06.2017
13:05:02
да почему же
офигеть, у тебя поведение двери раньше не меняло стэйт а теперь меняет

Google

Sergey
25.06.2017
13:05:17
как по мне - это нифигенское такое изменение в поведении

Evgeniy
25.06.2017
13:05:19
я серег этот пример покажу на видео

Sergey
25.06.2017
13:05:27

Evgeniy
25.06.2017
13:05:58
там еще приколы есть языка как можно по тролить

Aleh
25.06.2017
13:06:00
если раньше возвращался новый объект с новой ссылкой, а теперь старый, то вы вероятно много где все поломали

Sergey
25.06.2017
13:06:12
ну то есть я к чему - ты говоришь что "не хочешь уходить в глубь", но при этом тащищ наследование
то мне кажется получится каша

Evgeniy
25.06.2017
13:06:36
возможно(
давай обсудим после того что я расскажу как я считаю

Sergey
25.06.2017
13:06:56
оке

Admin
ERROR: S client not available

Evgeniy
25.06.2017
13:07:07
я действительно рад был бы обсудить)
я пример с дверью покажу

Sergey
25.06.2017
13:07:44
можешь любой другой пример. Просто интересно было бы показать два примера - один где имутабельность более чем логична, и пример где работа со стэйтом может казаться проще

Evgeniy
25.06.2017
13:08:03
вот это очень хотел
но ничего простого придумать не смог

Sergey
25.06.2017
13:08:20
а кто говорил что будет легко?)

Evgeniy
25.06.2017
13:08:33
чтобы не было такова что имутабельность это супер мутабельнсоть это фи

Darkling
25.06.2017
13:08:41
final class Door {
private $state;
public function __construct($state) {
$this->state = $state;
}
public function getState() {
return $this->state;
}
}
Я это имел в виду. И да, это пыха. Вполне себе иммутабельно. Если не долбануть сюда сеттер, конечно.

Sergey
25.06.2017
13:09:13
вот я не могу придумать кейс когда имутабельность на вид сложнее но по факту намного проще.

Google

Evgeniy
25.06.2017
13:09:30
да она всегда упрощает

Sergey
25.06.2017
13:09:39

Evgeniy
25.06.2017
13:09:39
кстате надо ли пример с имутабельной дверью все еще
я кажется понял что ты хотел от меня увидеть)

Sergey
25.06.2017
13:10:11
попробуй запилить проект с использованием event sourcing. Я сильно сомневаюсь что ты будешь делать имутабельными вещи вроде "записей в блоге"

Aleh
25.06.2017
13:10:23

Evgeniy
25.06.2017
13:10:35
нее
там есть фишка определенная)
я это в конце покажу

Sergey
25.06.2017
13:11:04
нее
что не? тащишь наследование - тогда изволь рассказать про контракты, прекондишены, инварианты и посткондишены, а так же про LSP

Evgeniy
25.06.2017
13:11:09
там еще можно Multiply call constructor сделать)
будет принимать и новый объект
с точки зрения кода он не будет юзать новые методы
поэтому изменения состояния он делать не будет

Aleh
25.06.2017
13:12:09
это нарушение lsp

Evgeniy
25.06.2017
13:12:18
а в новом объекте могут быть новые методы которые могут сменить состояние

Sergey
25.06.2017
13:12:52
$openedDoor = Door::open();
$closedDoor = $openedDoor->close();
$openedAgainDoor = $closedDoor->open();
assert($closedDoor !== $openedAgainDoor);
попробуй переопределить так что бы дверь стала снова мутабельной и при этом ассерт отработал
если ты сломал посткондишены - то это явно говорит о нарушении LSP

Aleh
25.06.2017
13:14:34

Sergey
25.06.2017
13:14:42
да

Evgeniy
25.06.2017
13:15:15