
Sergey
30.08.2018
09:19:59

Dmitry
30.08.2018
09:20:11

F01134H
30.08.2018
09:20:13
но ведь это уже про другое
как это не является?

Google

Артур Евгеньевич
30.08.2018
09:20:32
почему?
потмоу что мы вообще можем быть разными микросервисами, и соседняя команда может быть дебилами которые накосячут, и если у меня не будет валидации оплученных от них данных то все сломается

F01134H
30.08.2018
09:20:47
(программы)

Sergey
30.08.2018
09:20:51

F01134H
30.08.2018
09:21:10
И ты валидируешь не DTO в таком случае, а просто данные, которые передаются в сети

Sergey
30.08.2018
09:21:22

Артур Евгеньевич
30.08.2018
09:22:10
Микросервисы это независимые юниты
То есть ты считаешь, что принципилаьная разница между двумя независимо запущенными сервисами на разных серверах и двумя Bounded Context работающий в рамках одного приложения?

F01134H
30.08.2018
09:22:21
Да

Артур Евгеньевич
30.08.2018
09:22:29
Я с точки зрения архитектуры рахницы не вижу

Dmitry
30.08.2018
09:22:44
как это не является?
У "объекта" в ООП есть состояние и поведение. У DTO поведения нет. Значит это просто структура, а не объект.

Артур Евгеньевич
30.08.2018
09:23:01
Да в первом случае мы кидаем http запрос, а во втором дергаем метод фасада условно говоря

F01134H
30.08.2018
09:23:15
С точки зрения архитектуры редкий кейс, когда у тебя упал только кусок программы. А вот когда упал один из сервисов - другое дело
В том плане, что обычно весь монолит грохается с ошибкой

Google

Igor
30.08.2018
09:24:02

Артур Евгеньевич
30.08.2018
09:24:12
если мы задрачиваемся на лоу каплинг мы должны понимать что наш сервис/модуль/контекст/компонент может иметь много портов для вызова http запрос, вызов внутри программы, сообщение из рэбита и т.д

F01134H
30.08.2018
09:24:32

Артур Евгеньевич
30.08.2018
09:25:01

F01134H
30.08.2018
09:25:46
но это не точно ☝️

Sergey
30.08.2018
09:26:25
А почему анемичность убирается имутабельность?
как правило убирается, у тебя может быть анемичная модель которая используется внутри модуля (а не на границе для коммуникации между модулями) которую юзают на чтение только, но в 95% ситуаций в нее еще и пишут. И проблема тут как раз в контроле за инвариантами

Артур Евгеньевич
30.08.2018
09:26:52

F01134H
30.08.2018
09:27:30

Артур Евгеньевич
30.08.2018
09:27:33
но эта куча валидации помогает предотвратить ошибки, которые могли бы вылзети в ее отстутсвие

F01134H
30.08.2018
09:27:40
в этом вроде даже одна из основных задумок этой архитектуры

Артур Евгеньевич
30.08.2018
09:27:56
я вообще для себя определил микросервисы не как архитектру ПО

Dmitry
30.08.2018
09:28:20

Sergey
30.08.2018
09:28:26
А почему анемичность убирается имутабельность?
с имутабельными структурами есть только проблема связанности по данным. Нам этой связанности нужно стараться избегать, но между модулями если у тебя есть необходимость расшарить данные то у тебя нет особо вариантов. Проблема в том что часто модулям не нужно шарить данные друг с другом - разве что айдишки. И в очень редких случаях надо что-то большое прокидывать. Чаще жирные DTO можно увидеть там где слои и в языках где нет возможности юзать динамические структуры (Java)

Артур Евгеньевич
30.08.2018
09:28:30
а как подход к деплой и управлению командами разработкой

F01134H
30.08.2018
09:28:33

Артур Евгеньевич
30.08.2018
09:29:09
т.е не важно монолит у вас или много разных программ, в любом случае можно написать как слабосвязанную модульную систему, так и ком с гавна

Google

Sergey
30.08.2018
09:29:17
но отсутствие методов явно отсутствие поведения)

Dmitry
30.08.2018
09:30:30

Artem
30.08.2018
09:31:50

Sergey
30.08.2018
09:32:09

Dmitry
30.08.2018
09:32:12

Sergey
30.08.2018
09:32:19

ivan
30.08.2018
09:32:47

Sergey
30.08.2018
09:33:16
опять же, все можно с точки зрения связанности объяснить. Связанность по данными тяжелее поддерживать нежели связанность сообщениями (когда ты просто завязан на методы у которых нет аргументов)

F01134H
30.08.2018
09:34:17
Геттеры может есть, а реальных методов нет.
все, что изменяет состояние класса - является его поведением. Даже конструктор класса, который задает полям какое-либо значение - поведение. Но всё поведение - это не только изменение состояния

Sergey
30.08.2018
09:34:25
если у тебя есть некая структура данных с которой на запись работают более одной штуки, для того что бы поддерживать консистентность состояния логику проверки прекондишенов/инвариантов должен содержать тот объект, у которого стэйт

Aleh
30.08.2018
09:35:31

Sergey
30.08.2018
09:36:20
раньше был такой принцип как Information hiding, сегодня его всецело заменили на low coupling

F01134H
30.08.2018
09:36:26

Артур Евгеньевич
30.08.2018
09:37:36
так там даже чисто логически они не нужны
вот сервис сделал какую то работу
надо куда то передать ее результаты, сформировали дто и выбросили

Google

Артур Евгеньевич
30.08.2018
09:38:08
куда в этот ворфлоу впихнуть сеттеры я хз

Sergey
30.08.2018
09:38:29
поэтому предпочитаю в DTO избегать сеттеров
DTO имутабельны должны быть вообще. Ну мол чисто теоритически они нужны только для доставки. То есть ты выплюнул структурку из одного модуля и словил в другом. Вопервых запашек будет идти уже от желания запихнуть эту же структурку кому-то другому. Если ты решил отправить ее тому кто ее тебе прислал - то это будет говорить о том что эта логика должна быть в том модуле который изначально DTO сформировал и тогда можно будет от него просто отказаться. И если надо кому-то еще сообщить чего - это будет уже DTO второго модуля, которую мы кому-то отправим. Новый объект (инстанс класса а не как у Кея)

ivan
30.08.2018
09:38:35
Посоветуйте хорошую статью про анемическую модель.

Dmitry
30.08.2018
09:38:44
ну с этим соглашусь
Поэтому DTObject это не Object с точки зрения терминологии, так как полноценным объектом не является. Поэтому он и антиппатерн.

Sergey
30.08.2018
09:38:54

Артур Евгеньевич
30.08.2018
09:39:08

Sergey
30.08.2018
09:39:34

F01134H
30.08.2018
09:39:35

Admin
ERROR: S client not available

Артур Евгеньевич
30.08.2018
09:39:36

F01134H
30.08.2018
09:40:03
дык есть поведение у DTO.

Sergey
30.08.2018
09:40:07
нету

Артур Евгеньевич
30.08.2018
09:40:12
нет
дто это просто коробка
переменная
массив на максималках
массив маминой подруги

Sergey
30.08.2018
09:41:08
дык есть поведение у DTO.
представь себе модули (это могут быть слои, микросервисы, просто разные контексты приложения, подсистемы) как компьютеры в сети. В этом случае DTO будут выполнять роль пакетов с данными которые по сети ходят между разными компами.

Artem
30.08.2018
09:41:16

F01134H
30.08.2018
09:42:05
нету
но ведь изменяется состояние объекта. Насколько я знаю, сначала у объекта инициализируются пустые поля. Затем в конструкторе происходит операция присваивания

Google

Artem
30.08.2018
09:42:36
а, я понял, ты же говорил, что считаешь конструктор поведением

Sergey
30.08.2018
09:44:48

Dmitry
30.08.2018
09:45:08

Sergey
30.08.2018
09:45:26
class SomeDTO {
constructor(
val userId: string
val something: int
)
}

Aleh
30.08.2018
09:45:28

Артур Евгеньевич
30.08.2018
09:46:08

F01134H
30.08.2018
09:46:24

Dmitry
30.08.2018
09:47:01

Sergey
30.08.2018
09:47:16

F01134H
30.08.2018
09:47:22

Sergey
30.08.2018
09:48:28

Артур Евгеньевич
30.08.2018
09:49:01

Sergey
30.08.2018
09:49:22

Артур Евгеньевич
30.08.2018
09:49:41
а в делфи было все void функции эт процедуры)

Dmitry
30.08.2018
09:50:13

Sergey
30.08.2018
09:51:56
а не, EAV еще антипаттерн с точки зрения нормализации данных и поддержвания консистентности
ладно
но DTO НЕ! антипаттерн.
а если dto юзается на запись, если dto юзается не на границе между модулями - то это не dto
Это к слову основная причина по которой я не люблю когда люди начинают добавлять суффиксы в названия что бы отличать штуки друг от друга, сущности и dto например. Потому что это говорит о том что суть различий люди не понимают, а потому вынуждены себя убеждать что "вот это DTO" только за счет суффикса