
Sergey
17.07.2017
20:57:49
> Сейчас есть базовый сервис, от которого все наследуется
тут уже чувствуется проигрыш

Артур Евгеньевич
17.07.2017
20:58:02
это старый код 11 года
я это и хочу убрать

Google

Sergey
17.07.2017
20:58:41
> И в этом сервисе есть метод massDelete который удаляет сущности с указанными id и логирует их
ну то есть тебе надо просто каскадный софт делит, так?

Артур Евгеньевич
17.07.2017
20:58:53

Sergey
17.07.2017
20:59:02
это инфраструктурная логика

Артур Евгеньевич
17.07.2017
20:59:18
еще логирование и проверка прав

Sergey
17.07.2017
20:59:32
проверка прав на уровне точки входа в бизнес транзакцию
просто выносишь ее повыше

Артур Евгеньевич
17.07.2017
20:59:56

Sergey
17.07.2017
20:59:57
для вдохновения - воутеры из спринга или симфони в зависимости на чем ты кодишь
типа
public function remove()
{
$this->removed = true;
foreach ($this->someRelatedItems as $item) {
$item->remove();
}
}
а тот ходит по своим детям
и тд.

Google

Sergey
17.07.2017
21:01:28
и каждый метод может быть реализован по своему в зависимости от своих бизнес правил
а логирование можно делать через доменные ивенты
в любом случае я плохо понимаю причем тут AOP

Alexander
17.07.2017
21:04:51
Как расшифровывается АОП

Артур Евгеньевич
17.07.2017
21:05:08
аспектно оринтированное программирование

Sergey
17.07.2017
21:57:23

Sergey
17.07.2017
21:57:37
ну то есть у тебя есть граф объектов и вершина с которой ты работаешь, и оно само по своим детям пройдет. Я не вижу тут "дублирования"

Sergey
17.07.2017
22:16:12

Anton
18.07.2017
10:29:10
всем привет!
очень хочу научиться ремеслу тестирования. пишу на yii. такое впечатление у меня что я просто сути не улавливаю когда надо тесты, а когда нет.
подскажите, пожалуйста, как правильно организовать свое обучение

Andrey
18.07.2017
11:13:20

f4rt~
18.07.2017
11:14:33
кроме случаев, когда ты решил сделать откровенно плохо.

Anton
18.07.2017
11:15:05
от у меня есть доки по yii. я использую компоненты оттуда. их работа, как я понимаю, уже протестирована и на этом заострять внимание не надо?

f4rt~
18.07.2017
11:15:55
нуу ты должен тестировать не компоненты, а поведение

Anton
18.07.2017
11:19:11
я не так выразился. лучше на примере.
надо мне сделать форму. создаю модель, загружаю туда запрос, и запрашиваю валидацию(правила валадации тоже указаны) потом сохраняю в базу.
вот на этом примере что нужно тестить?
чего-то как-то вообще мне сложно с этим

f4rt~
18.07.2017
11:22:15
что угодно от unity тестов или интеграционные, до property based testing, ты смотришь в угол угла, почитай литературу сам поймешь, что тебе необходимо.
Growing object oriented software guided by tests.
Practical php testing
Кент Бек XP

Anton
18.07.2017
11:24:35
а то я еще и параноик) и мне самому себя надо страховать) вот тесты спецом для меня придумали, я точно знаю

Артур Евгеньевич
18.07.2017
14:22:47

Google

Sergey
18.07.2017
16:49:14
по литературе добавлю еще - Working efficently with legacy code
ну тут доктрина не причем - это простая работа с коллекциями и т.д.

Aleh
18.07.2017
16:50:09
Ну у доктрины есть каскадное удаление

Sergey
18.07.2017
16:50:18
есть каскадное удаление, но ему не это надо
точнее не совсем это

Aleh
18.07.2017
16:50:39
Я думаю у Артура ваще проблема с управлением корнями агрегатов
Самая главная - их нет

Артур Евгеньевич
18.07.2017
16:52:35
Мы еще раз обговорили и пришли к тому что надо делать каскадный soft delete
то есть я тоже самое что каскадное удаление в доктрине
только soft

Артур Евгеньевич
18.07.2017
16:53:32
https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwj359vVpZPVAhXJE5oKHSKfAicQFggiMAA&url=https%3A%2F%2Fgithub.com%2FAtlantic18%2FDoctrineExtensions%2Fissues%2F505&usg=AFQjCNF239j0ehd_W8QLQzBGjjVye0hTqQ

Sergey
18.07.2017
16:53:41
я бы не придумывал магии и просто явно дергал бы hide() у сущностей
это проще, быстрее, явно, и времени на имплементацию у тебя уйдет меньше чем любая волшебная шляпа
а еще это можно тестить юнит тестами
обычное каскадное удаление вполне явное потому что ссылка теряется

Артур Евгеньевич
18.07.2017
16:55:17
То есть сейчас два варианта или искать доктриновскую нативную реализацию(которой нет похоже) или определить интрефейс с методом getChildren() и вызывать его при удаалении сущности с этим интерфейсом, ну и соответсвенно для всего что вернет gettChildren

Sergey
18.07.2017
16:55:36
что за getChildren?

Google

Sergey
18.07.2017
16:55:46
ошибка новичка

Артур Евгеньевич
18.07.2017
16:56:15
что за getChildren?
хочу чтобы этот метод возвращал все сущности, которые являются подчиненными для данной

Sergey
18.07.2017
16:56:18
почему ты не хочешь просто в сущности это делать?

Артур Евгеньевич
18.07.2017
16:56:54
unit имею ввиду

Admin
ERROR: S client not available

Артур Евгеньевич
18.07.2017
16:57:10

Sergey
18.07.2017
16:57:36
так это и будет в сущности
ну так и зачем тебе там getChildren если у тебя ты и так знаешь какие релейшены и доступ к стэйту самой сущности у нее же есть
public function hide()
{
$this->hiddern = true;
foreach ($this->someRelatedEntities as $entity) {
$entity->hide(); // внутри тоже самое
}
}
никаких новых интерфейсов, никаких лишних геттеров

Артур Евгеньевич
18.07.2017
16:58:34
someRelatedEntities
так из получить надо же сначала
они необязаательно одного типа

Sergey
18.07.2017
16:58:45
....
в сущности
у тебя в ОДНОЙ сущности есть поле КОНКРЕТНОГо типа
я тебе привел метод "сущности"

Google

Sergey
18.07.2017
16:59:20
какой-то, которая является вершиной графа сущностей в контексте твоей операции
она сама разберется кого еще попросить спрятаться
код верхнего уровня просто вызывает $entity->hide()
и не лезет в ее нутро
ООП и все такое
могу на gist накидать

Артур Евгеньевич
18.07.2017
17:00:45
и что мне в методе hide собирать всех детей?
давай я лучше накидаю как я вижу

Sergey
18.07.2017
17:01:11
сущность ДОЛЖНА знать о своих детях, и она прекрасно знает кого надо скрывать а кого нет
https://gist.github.com/fesor/67ed7ca31d2b51aa7f9e17a11a23e81c

Артур Евгеньевич
18.07.2017
17:10:49
а чем плох мой вариант
https://gist.github.com/arturpanteleev/240e8bbea8c7adcc80c2400e4e3b653b
мы здесь сможем вообще мтеод удаления в трейт вынести

Sergey
18.07.2017
17:15:59
вынос логики в трейты это плохо
венгерская нотация тоже плохо
чувствуется запах c# 5-ти летней давности
по сути то точ ты сделал - это добавил ненужный геттер
$this->firstTypeSubEntity + $this->secondTypeSubEntity - так в php лучше не делать
да и потом, чем тебе не нравится вариант "сделать все максимально явно"