@oop_ru

Страница 418 из 785
Sergey
08.12.2017
09:53:22
хотя не

нифига

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

Bohdan
08.12.2017
09:53:49
в пыхе ведь инты от строк не наследуются

Google
Sergey
08.12.2017
09:53:54
так что не, тут ты нарушил предусловия и нарушил контракт

f4rt~
08.12.2017
09:54:01
abstract public function addPayment( int $payment_id, Item $item ) : Payment а в стратегии $payment_id строка(

Sergey
08.12.2017
09:54:12
в пыхе ведь инты от строк не наследуются
они приводятся к строкам спокойно. Но вот обратно уже не так прикольно

f4rt~
08.12.2017
09:54:17
так возвращает payment api gateway

Maksim
08.12.2017
09:54:27
payment_id по логике вещей не может быть интом уже очень-очень давно)

Bohdan
08.12.2017
09:54:35
ну понятно, что приводятся, но мы все же говорим о некотором полиморфизме

Sergey
08.12.2017
09:54:38
f4rt~
08.12.2017
09:54:48
ну вот так и пришлось сделать

Sergey
08.12.2017
09:54:51
Bohdan
08.12.2017
09:54:59
и пускай твоя реализация уже сама решает, как передавать

Sergey
08.12.2017
09:55:01
ну вот так и пришлось сделать
ну так 7.2 тебе тут не поможет

f4rt~
08.12.2017
09:55:11
если у меня в родителе int

Google
f4rt~
08.12.2017
09:55:23
а в потомке string)

Sergey
08.12.2017
09:55:26
почему же?)
потому что тебе не надо "убирать" предусловия. Тебе надо для всех реализаций на строки переделать

f4rt~
08.12.2017
09:55:27
было)

ну да, ты прав

Sergey
08.12.2017
09:55:36
было)
то ты сломал LSP

если у тебя разные ограничения на ID для разных платежных сервисов - ты уже по сути прогррал немного)

и тебе надо реально заводить VO который будет заниматься валидацией

ну короч... сложно все

тут надо уже смотреть какой контракт нужен клиентскому коду

f4rt~
08.12.2017
09:58:15
а вот еще, вопрос в именовании. есть тупая вендорская либа, для платежки работает она так new Client(new Config()) и в конфиге охринеть кол-во параметров строками передаются я обычно в таком случае брал их и собирал в класс конфига, а тут он уже существует ? пол дня думать как назвать по сути тупую структуру данных которые можно скормить конфигу

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

Sergey
08.12.2017
09:59:36
вендорская либа... сделать ей фабрику или в контейнере описать и не делать руками

Bohdan
08.12.2017
10:13:47
нужно ли пользоваться интерфейсами репозиториев? если да - в каком слое их хранить? сейчас они у меня в доменном слое (хоть и некошер)

Sergey
08.12.2017
10:14:51
нужно ли пользоваться интерфейсами репозиториев? если да - в каком слое их хранить? сейчас они у меня в доменном слое (хоть и некошер)
интерфейсы репозиториев в доменных слоях это кошерно. Не кошерно это реализацию туда ложить

ну и еще неплохо разделять интерфейсы для домена и для выборок на чтение для UI например

Bohdan
08.12.2017
10:15:45
окей, в таком случае реализация в слое приложения? или в слое фреймворка? (не вижу смысла отдельно заводить слой инфраструктуры под доктрину)

Sergey
08.12.2017
10:17:53
реализация репы это инфраструктура. То есть в твоем случае да, можно назвать это фреймворк

p.s. я ленивый и не выделяю интерфейс у репозитория и ложу его там же где и домен... и мне стыдно

Bohdan
08.12.2017
10:18:55
окей, и третий вопрос насколько гуд/не гуд реализовать (это уже под симфони) репы не через наследование, а через композицию? (недавно статейка проскакивала)

Google
Bohdan
08.12.2017
10:19:12
у меня так было сделано изначально) если бы делал я - тоже клал бы рядом)

Sergey
08.12.2017
10:19:14
EntityRepository - это общий интерфейс, его надо "спрятать" под специализированный

адаптер эдакий

Bohdan
08.12.2017
10:20:02
все равно доменные модели - это и есть сущности доктрины, в любом случае происходит смешивание инфраструктуры и домена в симфони

другая инфраструктура - ее слишком мало, чтобы выносить в слой)

Sergey
08.12.2017
10:26:55
это полностью твои классы и все такое. А doctrine/collection - представь что это тебе язык предоставляет)

Антон
08.12.2017
10:32:02
Что такое ioc? И чем отличается от di и dip? Смотрел хабр, кто в лес, кто по дрова

Alexey
08.12.2017
10:33:06
ioc - это принцип. DI - это реализация принципа

https://ru.wikipedia.org/wiki/Внедрение_зависимости

Sergey
08.12.2017
10:35:10
пример ioc - у тебя есть фреймворк который дергает твой код. Например - пришел http запрос и твой фреймворк дернет твой обработчик а не обработчик попросит фреймворк чего-то сделать. То есть происходит инверсия направления потока управления (кто кого вызывает). пример di - это вариант ioc при котором тебе сделают зависимость а не ты будешь это делать. Пример dip - это когда у тебя есть 2 модуля, один зависит от второго. Но ты не хочешь что бы он зависел от него, и делаешь интерфейс, дабы модуль начал зависеть от интерфейса и таким образом мы изменим направление зависимости.

Sergey
08.12.2017
10:35:24
dip больше про то что бы модули зависили от более стабильных модулей

ioc - про инверсию управления (кто кого вызывает) а dip про инверсию зависимостей (кто от кого зависит)

ну то есть ioc и dip это разные штуки, и ioc это не только про то как сервисы сделать, а di только про это

Антон
08.12.2017
10:37:48
Понятно, а вот в русской wiki про методы реализации есть пункт: Контекстный поиск (англ. contextualized lookup) Что это за зверь такой? О.о

Sergey
08.12.2017
10:37:57
ну почитай)

вариантов сделать ioc в разных контекстах много)

Антон
08.12.2017
10:40:26
Понятно, спасибо:)

Sergey
08.12.2017
10:41:54
главное понять суть - зачем.

Google
Sergey
08.12.2017
10:42:05
и будет проще

Mykola
08.12.2017
11:45:58
а есть принцип ООП, который звучит как "не делай лишних движений"?

illiatshurotshka❄️
08.12.2017
11:47:02
ооп и программирование это разные понятия

Mykola
08.12.2017
11:47:22
ок, подловил

принцип программирования

Admin
ERROR: S client not available

Mykola
08.12.2017
11:47:52
но так ты не продашь

kana
08.12.2017
11:48:23
kiss какой-нибудь

Mykola
08.12.2017
11:50:34
ну это то да... но его тоже не продашь :(

Bohdan
08.12.2017
11:50:52
а кому ты его хочешь продать?

Mykola
08.12.2017
11:51:37
ну типа обосновать рефакторинг для начальства

типа мол почему я выпилил нахрен эту константу

Bohdan
08.12.2017
11:52:03
техническим долгом обосновать можно + сложностью входа для новых разработчиков

+ сложность реализации новых фич

Mykola
08.12.2017
11:52:16
во! технический долг я продам

Bohdan
08.12.2017
11:52:50
я продал под соусом сложности реализации + того, что все равно скоро на спа переходить

Mykola
08.12.2017
11:53:45
жестоко
я просто не свой код рефакторю, и они могут сопротивляться

эх.... на самом деле все плохо... главная причина, по которой я ничего не докажу - это пхп

на этом днище просто ничего нельзя сделать нормально

Google
Mykola
08.12.2017
12:04:47
да, хорош

а накидайте еще каких-то принципов, которые не входят с солид, но важны (ваше мнение)

Alexey
08.12.2017
12:14:56
https://www.slideshare.net/khokhlova1991/ss-19053261

25 слайд и дальше

запись доклада гуглится, рекомендую к просмотру

Mykola
08.12.2017
13:10:08
Чо лол? Это не смешно ни разу. Уж поверь поему 10 летнему опыту в пхп

illiatshurotshka❄️
08.12.2017
13:11:38
со стороны

Mykola
08.12.2017
14:59:37
ну это все не ооп, это как-бы как RTFM

а я хотел может чего-то "ноучного"

Sergey
08.12.2017
15:01:41
а накидайте еще каких-то принципов, которые не входят с солид, но важны (ваше мнение)
- GRASP (кокберн, ларман и другие) - LoD - IoC (не помню кто...) - Information Hiding (Дэвид Парнас) - Single Chose Principle (Мэйерс) - Stable Dependencies Principle (дяди боба) - Abstract Dependencies Principle (дядя Боб) - Acyclic dependencies principle (дядя Боб)

- CQS мэйерса

Bohdan
08.12.2017
22:47:12
опа, кот с гексагональной архитектурой

Страница 418 из 785