@oop_ru

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

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

я это и хочу убрать

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

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:37
ну то есть у тебя есть граф объектов и вершина с которой ты работаешь, и оно само по своим детям пройдет. Я не вижу тут "дублирования"

Sergey
17.07.2017
22:16:12
ну то есть у тебя есть граф объектов и вершина с которой ты работаешь, и оно само по своим детям пройдет. Я не вижу тут "дублирования"
Просто и я не вижу :-) мне кажется простой и нормальный вариант, и можно не выдумывать всякие АОПы )

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

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
а то я еще и параноик) и мне самому себя надо страховать) вот тесты спецом для меня придумали, я точно знаю

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
и что мне в методе hide собирать всех детей?
зачем собирать, просто обходишь как я написал

сущность ДОЛЖНА знать о своих детях, и она прекрасно знает кого надо скрывать а кого нет

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
мы здесь сможем вообще мтеод удаления в трейт вынести
а потом добавлять туда if-ы по мере разрастания логики

вынос логики в трейты это плохо

венгерская нотация тоже плохо

чувствуется запах c# 5-ти летней давности

по сути то точ ты сделал - это добавил ненужный геттер

$this->firstTypeSubEntity + $this->secondTypeSubEntity - так в php лучше не делать

да и потом, чем тебе не нравится вариант "сделать все максимально явно"

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