
Sergey
06.12.2016
20:42:06
достаточно прототипного наследования как в JS

Ilya
06.12.2016
20:42:24
Массивы фигачь

Aleh
06.12.2016
20:42:35

Google

Aleh
06.12.2016
20:42:55
но в пхп методы особо не подменишь

Sergey
06.12.2016
20:43:09
Массивы фигачь
just give it a 5 minutes. Попробуй мыслить категорией "наследование не нужно". Представь себе ситуацию где ты бы применил наследование и подумай "а можно ли без него"
ну так
шутки ради

Aleh
06.12.2016
20:43:29
* с помощью композиции например

Sergey
06.12.2016
20:43:36
не только композиции
просто представь что у тебя нет extends, есть только implements для организации иерархии типов

Ilya
06.12.2016
20:43:55
Наследую модели постов и комментариев от эктиврекорда

Sergey
06.12.2016
20:44:04
а.... ну ты проиграл)

Aleh
06.12.2016
20:44:07
и прекрасно себя чувствую
а ты от DDD такой нервный

Sergey
06.12.2016
20:44:24
наверное...
5 лет с доктриной дают о себе знать

Google

Sergey
06.12.2016
20:44:49
привык я что инструменты не заставляют от себя наследоваться

Aleh
06.12.2016
20:44:55
красивенький кстати в opuelence orm

Sergey
06.12.2016
20:45:05
да, мило
да и в целом для "поделки" ооочень качественно

Ilya
06.12.2016
20:45:29

Sergey
06.12.2016
20:45:29
единственное что бесит - венгерская нотация для интерфейсов
Я б повесился
а теперь представь что у тебя нет базы данных, active record, фреймворков и т.д.
мы же сейчас про "правильное ООП" а не про "реалии"

Aleh
06.12.2016
20:45:59

Ilya
06.12.2016
20:46:05
Ничего нет
И код не надо писать

Aleh
06.12.2016
20:46:18
ну тебе ж надо вначале задачу бизнеса решить

Ilya
06.12.2016
20:46:22
Идеально

Sergey
06.12.2016
20:46:22
Я б повесился
ну и опять же, если мы говорим о ActiveRecord - то это, как ты говоришь - классы, тупые структуры, это не ООП"

Aleh
06.12.2016
20:46:25
а не фреймворк выбрать)

Sergey
06.12.2016
20:46:58
так что давай представим себе просто такой код

Aleh
06.12.2016
20:47:05
или всем, кто идет, ты кричишь с порога: "делаю только на laravel/RoR, все остальное нахер, потому что вот так вот"

Sergey
06.12.2016
20:48:00
final class User
{
/**
* @var UserDataModel - Eloqent model
*/
private $attributes;
public function __construct(string $email, sting $password)
{
$this->attributes->email = $email;
$this->attributes->password = $password;
}
}
вот я тебе сделал "модель" юзера без наследования от элоквента. В ней будет только бизнес логика, а элоквент отвечает только за модель данных

Google

Sergey
06.12.2016
20:48:27
все счастливы
SOLID соблюдается почти

Aleh
06.12.2016
20:48:37
ага, ты только забыл сказать, как она туда сетится))

Sergey
06.12.2016
20:48:58

Aleh
06.12.2016
20:49:07
$this->attributes = new UserRowDataGateway();

Sergey
06.12.2016
20:49:10
при фетче - через рефлексию разумеется

Aleh
06.12.2016
20:49:13
че нить такое

Sergey
06.12.2016
20:49:17
ну тип того да

Aleh
06.12.2016
20:49:47
а еще можно в UoW мапить)

Sergey
06.12.2016
20:49:53
угу)

Ilya
06.12.2016
20:49:55
Больше классов богу классов

Aleh
06.12.2016
20:50:04
data mapper для бедных

Sergey
06.12.2016
20:50:14
да нет, старый добрый row data gateway
таким как его задумывали
до этих всяких active record рубистов

Aleh
06.12.2016
20:50:31
если в UoW, то получится таки для бедных

Sergey
06.12.2016
20:50:46
почему? ты можешь спокойно делать data mapper без UoW
UoW тебе нужен тупо что бы persistance ignorance делать

Aleh
06.12.2016
20:51:12
хммм
ну с последним я согласен

Google

Aleh
06.12.2016
20:51:25
а с первым

Sergey
06.12.2016
20:51:48
сегодня на собесе чувак рассказывал как он на zend2 делал через table gateway дата мэппер но без uow

Aleh
06.12.2016
20:52:19
ого
в смысле он случайно так сделал или намеренно?)

Sergey
06.12.2016
20:52:31
ну точнее не он лично... команда
ну они так решили
им мол gateway лучше было
просто у тебя в "репозиториях появляется метод update/save`

Aleh
06.12.2016
20:53:16
ну необязательно в репозиториях так-то

Sergey
06.12.2016
20:53:26
ну в гейтвее
короч не суть

Aleh
06.12.2016
20:53:31
ну да

Sergey
06.12.2016
20:53:36
он
был же ORM
passive record
там дата мэппер но без UoW
Atlas ORM или как-то так

Ilya
06.12.2016
20:54:01
Унаследоваться проще и удобнее чем использовать отдельные объекты для каждой мелочи. Принцип единственной обязанности можно так вообще до абсурда довести, давайте отдельный объект для сохранения каждого поля юзера, отдельный для получения каждого поля юзера и отдельный для обновления каждого поля юзера

Sergey
06.12.2016
20:54:33
ты когда-нибудь суппортил легаси проект, где все расширение функционала происходило через наследование?

Google

Ilya
06.12.2016
20:55:17
Постоянно

Sergey
06.12.2016
20:55:26
и неужели ты не чувствуешь боли?

Ilya
06.12.2016
20:55:33
Нет

Aleh
06.12.2016
20:55:39
важно, чтобы требования менялись

Sergey
06.12.2016
20:55:45
а ты работал с проектами где было подругому?
да

Ilya
06.12.2016
20:55:56

Sergey
06.12.2016
20:56:11
требования менялись? было такое что прилетали изменения в требованиях которые все порят и приходится лепить кастыли или трейты?

Ilya
06.12.2016
20:56:22
Ну да

Sergey
06.12.2016
20:56:32
тесты я так понимаю ты не пишешь, потому забудем о них

Ilya
06.12.2016
20:56:41
Почему же

Sergey
06.12.2016
20:56:57
были ли у тебя регрессии, связанные с тем, что ты изменил что-то в цепочке наследования, и где-то что-то отвалилось?

Ilya
06.12.2016
20:57:20
Нет, слежу за этим

Sergey
06.12.2016
20:57:20
Ну да
то есть, боль таки есть?

Aleh
06.12.2016
20:57:24
вообще, надо понимать зачем все. Вопрос в простом внесении изменений. Если в вашу бизнес-логику идет много изменений, то ее надо хорошо покрывать спеками, если хорошо покрывать спеками, то их много, если их много, то они медленно гоняются из-за количества. Если ваша бл еще трубует какую-то лишнюю инфраструктуру(базу, http, fs), то еще в тестах идут задержки и на эту ерунду

Sergey
06.12.2016
20:57:30
или ты во всем винишь "авторов изменений"?

Ilya
06.12.2016
20:57:56
Никого не виню, принимаю как естественный процесс мироздания

Aleh
06.12.2016
20:58:44
Нет, слежу за этим
а сколько SLOC в проекте? Именно вашего кода, который поддерживаете, а не 3rd

Ilya
06.12.2016
20:58:52
Баги и костыли всегда были и будут независимо от модели разработки

Sergey
06.12.2016
20:59:02
в целом да - главное уяснить что если требования меняются часто (у меня например недавно был проект где требования менялись несколько раз в неделю причем клиент скрывал от нас часть своих планов, либо просто не знал что ему нужно)