
Sergey
27.07.2018
08:31:07
"расширять поведение системы не меняя код" - это как бы суть SOLID и в частности OCP. Дальше - если уж менять код то код должен меняться по одной и той же причине (SRP), взялся выстраивать полиморфизм - следи за контрактами (LSP), проектируй контракты под тех кто будет ими пользоваться, что бы удобно было (ISP), что бы уменьшить вероятность каскадных изменений инвертируй зависимости (DIP) ну и и.д.
ну и до всех этих SOLID была еще пачка принципов от дяди боба - это и принцип стабильных зависимостей, и принцип ацикличных зависимостей, принцип абстрактных зависимостей и еще парочка
если так смотреть на вещи значит что язык не должен позволять тебе нарушать LSP но он позволяет
а это не про LSP

Google

Sergey
27.07.2018
08:33:43
LSP о том могут ли твои Map и List входить в одну иерархию типов или нет

Denis
27.07.2018
08:33:53
OOP should really only have two keywords: "new" and "return":
Переизобретают фп

Sergey
27.07.2018
08:34:10
LSP это про проверку качества абстракций

Denis
27.07.2018
08:34:39
https://www.youtube.com/watch?v=US8QG9I1XW0

Sergey
27.07.2018
08:34:45
про контракты, ну там инварианты (если ты стэйт меняешь), прекондишены и пост кондишены...

Aleh
27.07.2018
09:03:45
Есть языки, которые имеют это свойство?

Sergei
27.07.2018
09:17:39
OOP should really only have two keywords: "new" and "return":
Переизобретают фп
Это точка зрения скорее не изобретение а дополнение, ооп как функциональное++, в фп функции first class citezens, их можно передавать куда то и вызывать, т.е. это своего рода обьект с одним методом. А ооп Егор предлагает рассматривать как обьекты, с которыми нужно обращатся как с функциями но у этих функций можно вызвать не один метод, а несколько.

Igor
27.07.2018
09:19:20

Aleh
27.07.2018
09:21:55
LSP

Sergei
27.07.2018
09:22:53
Вот только в его примерах всегда один метод ? (да и >=2 (где 2 там и 5) метода это путь к нарушению srp)
В примерах у него, разные утилитные классы которые делают что то одно, поэтому и один метод, а если брать что то посложнее то будет уже и 2 и 3 метода. Смотря из какого контекста исходить сколько слоев абстракции можно сделать, можно напилить и кучу мелких обьектов сделать несколько слоев, можно сделать слоев поменьше но тогда пространства для манёвра в случае изменений будет меньше, но для множества слоев тоже нужно время всё продумать... Нужно соблюдать какой то баланс но для этого нужно чутье

Aleh
27.07.2018
09:23:09
Да
Замена родителя подтипом не должна привести к неправильной работе
Можешь ли ты сделать подтип, который все сломает?

Google

Sergei
27.07.2018
09:24:55
правило is a

Aleh
27.07.2018
09:25:48
Так что значит "lsp это свойство языка"?
Лсп про то, что это должно быть всегда корректно
А не про возможность, ну
Можешь ли ты сделать подтип, который все сломает?

Sergei
27.07.2018
09:28:07
lsp это про контракты

Denis
27.07.2018
09:30:50
При этом контейнеры по своему роду формализованы

Sergei
27.07.2018
09:32:26

Denis
27.07.2018
09:34:03
Ну вот как раз формализации они определяют кто ты такой, а что ты можешь делать с данными это функции работающие с этими контейнерами, а не сами контейнеры

Aleh
27.07.2018
09:37:41
На Википедии все правильно
Ну конкретно в той фразе

Denis
27.07.2018
09:46:58
В фп языках по сути единственный способ писать бизнес код это DDD, интерфейсы твоих функций определяют что ты можешь делать с данными в контексте domain, а сами данные выражены полностью с помощью ADT т.е находятся в запакованном виде который отражает бизнес правила и если правильно смоделировано всё, то может принимать только валидные значения

Sergey
27.07.2018
09:47:08
просто в ООП любят стэйт (по привычке) и любят дата шеринг между модулями (потому что привычки) а в ФП головы не так забиты говном
ну или этот самый дата шэринг намного более явно выражен в коде
короч пофиг, для меня ООП это эктор модел а не классы. а эктор модел с ФП хорошо дружат

Denis
27.07.2018
09:49:52

Sergey
27.07.2018
09:50:32
а с учетом того что, как там кей говорил, "я просто принял для себя объект как наименьший интересующий меня субъект системы, как компьютер в сети или клетка" То есть что внутри объекта - фиалетово. Можно воспринимать как объект процесс, микротред, корутину, скоуп модуля... что хочешь

Google

Sergey
27.07.2018
09:53:54
внутри можно хоть ФП, хоть структуроное программирование юзать. Но людям проще классы.

Denis
27.07.2018
09:55:07
а с учетом того что, как там кей говорил, "я просто принял для себя объект как наименьший интересующий меня субъект системы, как компьютер в сети или клетка" То есть что внутри объекта - фиалетово. Можно воспринимать как объект процесс, микротред, корутину, скоуп модуля... что хочешь
Ага, зато как любят делать сравнения с собаками, типа вот смотри есть объект собака, она гавкает, тявкает, а ещё у неё есть глаза и рот, вот это да, все просто понятно
Только если так делать код, все быстро пойдёт не туда

Sergey
27.07.2018
09:55:57

Bohdan
27.07.2018
09:56:40
просто у него него есть такой метод

Sergey
27.07.2018
09:56:50
message passing как pub/sub а не как "дернуть процедуру"
собака гафкнула и ей плевать сколько других сабак услышат - ей важно месседж донести
ей даже не важно среагирует кто или нет, точнее как, может быть важно но это ее проблемы

Bohdan
27.07.2018
09:58:02
угу, гавк не означает, что кто - то ответит

Sergey
27.07.2018
09:58:11
хотя думаю пчелы или муравьи намного лучше подходят для этой аналогии
(потому что я не шарю в малекулярной биологии что бы оттуда примеры приводить)))
как там это умное слово - эмердженс или эмергентность (подсмотрел в вики перевод)

Denis
27.07.2018
10:00:47
По сути ты можешь написать такой код:
bark(){
this.barked += 1;
this.dogsCrew.dispatch(“barked”)
}
Вот они все начинают лаять и тебе надо отследить как они лаят, ты пишешь дополнительный код чтобы следить за состоянием. Когда если бы у тебя не было внутренного стейта собаки, ты бы переиспользовал какой-нибудь единожды написанный hof withLog

Sergey
27.07.2018
10:10:35

Denis
27.07.2018
10:10:58
И это как бы пример вообще высосанный из пальца, просто пытаюсь донести что не надо миксовать данные с методами для работы над этими данными. Из того же DDD есть Entity/Value и есть отдельная сущности для работы с ними

Sergey
27.07.2018
10:11:07
bark() {
broadcast("bark")
}
или о чем ты?
плохо понимаю твою мысль

Google

Denis
27.07.2018
10:16:35
Корень агрегата? Это по-английски как?
Я про Entity-Value-Repository подход в работе с данными, он же не от хорошей ООП жизни пошёл когда все делали один класс в котором и данные были и persist метод

Sergey
27.07.2018
10:22:23

Admin
ERROR: S client not available

Sergey
27.07.2018
10:22:52
у нее есть add
коллекция агрегатов. Работать с агрегатом можно только через ее корень (information hiding), в рамках одной бизнес транзакции могут быть задействованы несколько агегатов (в разных контекстах)

Denis
27.07.2018
10:25:11
Ну я не имел это ввиду, это уже дальше от темы

Sergey
27.07.2018
10:25:14
если ты привел репозиторий как "сущность для работы с ними" то ты не прав и репозиторий никак не взаимодействует с тем что он хранит - это коллекция.
что до "не смешивать данные и методы" - а в ФП ты как делаешь? у тебя разве не в рамках модуля описаны типы с которыми могут работать функции? или ты о том что бы удобно добавлять поведение сверху, аля декорация?

Denis
27.07.2018
10:27:49

Sergey
27.07.2018
10:28:08

Дмитрий
27.07.2018
10:28:25
define "module", кто что под ними понимает
А то в reason такие модули шо вы офигеете

Denis
27.07.2018
10:28:52

Sergei
27.07.2018
10:29:22
Ага, зато как любят делать сравнения с собаками, типа вот смотри есть объект собака, она гавкает, тявкает, а ещё у неё есть глаза и рот, вот это да, все просто понятно
Лучше делать сравнение не что собака делает, а из чего она состоит) Я вижу собаку как композицию органов которые взаимодействуют между собой, органы в свою очередь состоят из тканей, и так дальше до атомов. Но всё это в свою очередь не смешано в одной большой куче, а отделено друг от друга абстракциями. Когда собака ест, к примеру, она мысленно не перемещает кучки атомов, а делает это на высоком уровне абстракции

Google

Denis
27.07.2018
10:30:29

Дмитрий
27.07.2018
10:30:30
Это не абстрагирование, это просто изменение масштаба

Sergey
27.07.2018
10:30:39
ты про модификаторы доступа?)

Sergei
27.07.2018
10:31:34

Sergey
27.07.2018
10:31:34
даже information hiding тебе намекает что плевать из чего состоит собака. важно то как она взаимодействует с другими собаками и выполняет ли она какие-то функции

Denis
27.07.2018
10:31:44

Sergey
27.07.2018
10:32:14

Denis
27.07.2018
10:32:42
Это как с первым ангуляром, в итоге всё что первый ангуляр изначально давал по факту в проектах больше хеллоу ворлда использовать себе дороже

Sergey
27.07.2018
10:32:45
я к тому что ты сча свел разницу между фп и ооп к синтаксису

Denis
27.07.2018
10:32:55
Да
Ну я с тобой был согласен