
Sergey
24.12.2016
00:04:27
я частенько так делаю)
но если у тебя большая система тебе ооочень легко потом заблудится где какая структура юзается
и рефакторить становится сложнова-то

da horsie
24.12.2016
00:05:15
если добавить контроль над типами, то чем они будут отличаться от анемичных моделей?

Google

Aleh
24.12.2016
00:06:00

da horsie
24.12.2016
00:06:24
т.е. твоим отношением к ним

Sergey
24.12.2016
00:06:34

Aleh
24.12.2016
00:06:49

Sergey
24.12.2016
00:07:06
class UserDTO
{
public $id;
public $name;
public $birthday;
}
вот пример DTO
если ты заметил - все проперти публичны
потому что это тупо структура данных
это не "объект" в привычном стиле

da horsie
24.12.2016
00:07:28
а где контроль над типами?

Sergey
24.12.2016
00:07:28
просто составной тип данных

da horsie
24.12.2016
00:08:05
ну ок

Google

da horsie
24.12.2016
00:08:08
логично вроде

Sergey
24.12.2016
00:08:08

Sergei
24.12.2016
00:08:31
Для тех кто в танке - что есть "анемичные модели" (объекты без поведения, что ли?)
и что есть "контроль над типами"?

Sergey
24.12.2016
00:08:33
потому что только статическая информация сильно помогает тебе при рефакторингах

da horsie
24.12.2016
00:08:51

Sergey
24.12.2016
00:08:53
function toDTO(): array;

da horsie
24.12.2016
00:09:34
контроль над типами это для языков со слабой типизацией

Sergey
24.12.2016
00:09:41
оно возвращает тупо массив... непонятно что внутри

da horsie
24.12.2016
00:09:42
или как оно проавильно называется

Sergey
24.12.2016
00:09:51
а если бы было toDTO(): UserDTO
то все уже намного лучше, и ты легко можешь в любимой IDE найти все места где юзается это DTO
сильно экономит время на чтение кода

Sergei
24.12.2016
00:11:19
@f3ath @fes0r спасибо, стало яснее.

Sergey
24.12.2016
00:11:29
а читаем код мы намного чаще чем пишем, а потому это то время которое надо экономить
ты потратишь на это DTO лишних 5 минут и возможно потом сэкономишь пол часа

da horsie
24.12.2016
00:11:50
такой вопрос тогда. есть слой A и слой B в приложении, которые обмениваются ДТОшками. A и B два разных модуля, к какому из них отнести ДТО?

Sergey
24.12.2016
00:12:05

Google

da horsie
24.12.2016
00:12:25
ну один их производит, другой потребляет

Sergey
24.12.2016
00:12:32
самый такой.... "правильный" что-ли пример это архитектура портов и адаптеров
или гексагональная архитектура
там четко прописано как слои отделены друг от друга, что где и какие направления зависимостей
если коротко - какой слой от какого ты хочешь изолировать при помощи DTO?
ну так... намекну что слой с UI не может не зависить от слоя с логикой... либо между этими слоями есть еще кто-то

da horsie
24.12.2016
00:18:12
у меня есть GitGatewayInterface, который из гита получает DTO с описанием разных сущностей (коммит, тег, итд). Есть Модели этих же сущностей, с логикой, которые используются в приложении. A - имплементация этого интерфейса, B - приложенме, которое зависит от интерфейса (получает его инстанс как зависимость). Они два разных модуля. К какому из них отнести ДТО?
ни к какому наверно?
к интерфейсу?

Sergey
24.12.2016
00:18:31
)))
давай по другому

da horsie
24.12.2016
00:18:41
поскольку они оба то интерфейса зависят

Sergey
24.12.2016
00:18:49
кто хочет получить DTO?

da horsie
24.12.2016
00:18:53
приложение

Sergey
24.12.2016
00:19:05
если коротко - что делает приложение напомни
приложение
ну то есть у тебя есть некий application layer

da horsie
24.12.2016
00:19:18
печатает ChangeLog

Sergey
24.12.2016
00:19:20
вот там и должен быть dto

da horsie
24.12.2016
00:19:50
приложение берет из гита последний тег и печатает, что в него вошло по сравнению с предыдущим

Sergei
24.12.2016
00:19:58
к интерфейсу?
Моё мнение - к интерфейсу. Который обещает эти сущности генерировать и выдавать по запросу.

Google

da horsie
24.12.2016
00:20:25
окей

Sergey
24.12.2016
00:20:43

Sergei
24.12.2016
00:20:52
Проясни

Sergey
24.12.2016
00:21:15
кто у тебя главный - интерфейс или приложение?

da horsie
24.12.2016
00:21:26
я вижу зависимости так [Приложение] -> [Интерфейс+ДТО] <- [Гит]

Sergey
24.12.2016
00:21:33
представь на секундочку что "интерфейс" не является частью приложения, это просто надстройка над ним

da horsie
24.12.2016
00:21:42
он и не является

Sergey
24.12.2016
00:22:10
зачем тогда тебе приложение в твоей схеме? что оно делает если у тебя интерфейс напрямую получает нужную информацию?

da horsie
24.12.2016
00:22:14
ну потому что они оба зависят от интерфейса (один принимает как депенденси, а другой имплементирует)

Sergey
24.12.2016
00:22:24

da horsie
24.12.2016
00:22:32
как не зависит?
оно его получает в конструктор

Sergey
24.12.2016
00:22:42
ну блин в этом смысл разделение
интерфейс зависит от приложения, а не приложение зависит от интерфейса
приложение ничего вообще не знает об интерфейсе
зачем в конструктор?
идем в википедию читать на тему Inversion of control

da horsie
24.12.2016
00:23:29
не понимаю если у тебя есть class A { __construct(B $b); }

Google

da horsie
24.12.2016
00:23:35
кто от кого зависит*
?
A от B, правлиьно?

Sergey
24.12.2016
00:23:46
повторюсь
то что ты передаешь UI в конструктор приложения - это уже ошибка
приложение надо передавать в конструктор UI
образно
Inversion of Control это называется

da horsie
24.12.2016
00:24:21
у меня нет UI в этой схеме

Sergey
24.12.2016
00:24:28
не приложение дергает фреймворк, а фреймворк дергает приложение

da horsie
24.12.2016
00:24:46
UI за скобками пока
я не понимаю

Sergei
24.12.2016
00:26:33

Sergey
24.12.2016
00:27:55
и почитай про inversion of control

da horsie
24.12.2016
00:28:27
A { __construct(B $b); } B - интерфейс
A - приложене
A зависит от B

Sergei
24.12.2016
00:28:41

da horsie
24.12.2016
00:28:43
что тут н етак?

Sergey
24.12.2016
00:29:04
а приложение НИЧЕГО не должно знать о UI