@oop_ru

Страница 36 из 785
da horsie
23.12.2016
03:56:25
Нормально ли использовать hashmap (в php - массивы) в качестве DTO?

Sergei
23.12.2016
04:00:28
Что fetchRemote(string $remote) делает? (я слаб в php)

da horsie
23.12.2016
04:01:10
Google
Sergei
23.12.2016
04:01:59
Мммм а результат куда-то возвращаестя, суть в том что оно менят состояние sandbox? (похоже на это)

da horsie
23.12.2016
04:02:02
ytn

меняет состояние внешней системы

результата нет

Sergei
23.12.2016
04:02:33
ясно тогда, спасибо

Читаю дальше

da horsie
23.12.2016
04:03:14
я так понимаю основных претензии к дизайну две - не тестируемо и нарушен SRP

попробую переделать

выделить интерфейс доступа ко внешней системе (гиту)

я так понимаю это будет Gateway PAttern

методы будут либо воздействовать на систему либо возвращать DTO

сука тяжело учиться

Sergei
23.12.2016
06:15:15
поделюсь и я своими соображениями

Google
Sergei
23.12.2016
06:16:09
"большой плюс", что я php понимаю почти что никак :)

1) мне было сложновато уловить логику взаимосвязей классов - например Commit можно сконструировать "из sandbox", а так же получить из RevisionRange

da horsie
23.12.2016
06:22:56
угу

Sergei
23.12.2016
06:28:32
2) мне так же было не совсем ясно, чем собственно мы управляем? мне была бы наверное понятнее логика типа "есть sandbox и мы управляем им", что-то такое: class GitSandbox{ UpdateSandbox(revision); List<ChangelistDescription> ListRevisionsInRange(date1, date2); UpdateToTag(Tag); } class Tag { .... } class ChangelistDescription{ .... }

da horsie
23.12.2016
06:30:13
понял

спасибо

Sergei
23.12.2016
06:30:55
3) это уже чистая вкусовщина и опять же в каждом монастыре свои уставы ('best practices"), однако моя уверенность в том, что в коде важна читаемость - потому пропагандирую публичные методы (которые по сути API класса) выносить в самый верх, как наиболее интресные для читателя, а всякое приватное - прятать куда-то в подвал файла.

da horsie
23.12.2016
06:31:13
а у меня разве не так?

я вроде тому же правилу следовал

Sergei
23.12.2016
06:31:32
final class RevisionRange { private $from; private $to;

da horsie
23.12.2016
06:31:41
ну

это же перменные

их тоже в подвал?

Sergei
23.12.2016
06:32:29
ну я как читатель в целом не сильно заинтересован как класс устроен внутри

da horsie
23.12.2016
06:32:31
получается, что она спользуется (например в конструкторе) выше, чем объявляется?

ок

я понял твою мысль

и в целом согласен

Sergei
23.12.2016
06:33:36
в С++ я настоятельно настаиваю всю реализацию (приватные методы и данные) в низ файла убирать, а публичной API - наверх

da horsie
23.12.2016
06:33:51
но "у нас тут своя атмосфера", общепринятые правила диктуют, что переменные должны быть вверху

Google
da horsie
23.12.2016
06:34:12
методы - да, публичные сверху

Sergei
23.12.2016
06:34:27
да, я не спорю, best practices они есть и им лучше следовать (ибо это то что читатель ожидает)

еще мне кажется что RevisionRange::__constructor и RevisionRange::between делают почти что одно и то же (или я упускаю опять же специфику)

da horsie
23.12.2016
06:43:15
так и есть

Sergei
23.12.2016
06:48:47
возможно, between избыточен здесь - мне симпатична сама идея хорошо именованного метода between, подчеркивающего поведение, одноко вместе с тем RevisionRange в моем представлении означает ровно то же.

da horsie
23.12.2016
07:12:30
блин как же тяжело

пока тесты напишешь, десять раз переделаешь все

зато YAGNI постигается на раз )

Sergei
23.12.2016
07:15:36
:)

где-то там же рядом концепция bit decay

da horsie
23.12.2016
07:23:59
Ща как применю TDD

Massimo
23.12.2016
09:18:25
Порекомендуйте книжки для джанго

Steven
23.12.2016
09:21:18
https://docs.djangoproject.com/en/1.10/ Эту?

Sergey
23.12.2016
09:22:34
я так понимаю основных претензии к дизайну две - не тестируемо и нарушен SRP
с SRP 90% что у тебя будет нарушено, просто потому что сложно этот принцип не нарушать.

слишком много надо думать, хотя если подагоняться какое-то время будет чуть проще

Aleh
23.12.2016
09:34:25
Вот srp наверное последний принцип про который надо думать ?

Sergey
23.12.2016
10:31:24
Вот srp наверное последний принцип про который надо думать ?
не совсем. Все 5 принципов должны быть в балансе

иначе смысл теряется

вообще я все думаю засеть таки написать цикл статей свой... у меня сейчас куча идей уже записаны

Aleh
23.12.2016
13:28:32
SRP - только про зоны ответственности объектов, декомпозицию и кохижен. Про "делайте интерфейсы" ни слова O/C - тут интерфейсы уже полезны, но это разного рода стратегии, акторы и прочее... LSP - в целом тупо правила как правильно интерфейсы делать что бы не грустить когда делаешь O/C или ISP ISP - тут да, используй интерфейсы для того что бы изолировать зоны ответственности объекта когда тебе с точки зрения SRP выгоднее все держать в одном классе. Способ снижения связанности и только. Соблюдение ISP + SRP выводит баланс между coheasion и coupling DIP - изоляция модулей, опциональное, позволяет тебе просто между несколькими модулями инвертировать направление зависимости тем самым снизив связанность

Google
Aleh
23.12.2016
13:28:32
а главное - все это опционально, не надо на этом зацикливться. Все это должно приносить пользу и в итоге ты просто где-то живешь с чуть большей связанность а где-то где все плохо можешь ее снизить используя эти принципы

Sergey
23.12.2016
13:30:18
мысли твои из симфони румы сюда направили)

Aleh
23.12.2016
13:30:34
ага)

Sergey
23.12.2016
13:39:00
ясно)

Sergey
23.12.2016
15:53:12
куда гуглить, какие книжки читать об этом?
к тому что "семь раз отмерь один отреж"?

что читать хз... тут подойдет любая штука на тему agile mindset, lean, user story и т.д. Например https://www.youtube.com/watch?v=6q5-cVeNjCE

годная штука по декомпозиции в виде юзер стори + acceptance criteria

по bdd конкретно есть следующие видосы: https://www.youtube.com/watch?v=2EM4itu7j7I

там 2 части, они вполне полезны

Aleh
23.12.2016
20:18:04
@Enleur кстати вот Грег Янг тут обмолвился про save в репозитории https://www.infoq.com/presentations/8-lines-code-refactoring

"его там не должно было быть"

guga
23.12.2016
21:00:19
кстати, а почему вы пришли к orm?

вам не кажется что это очень плохая идея

если она делает что-то больше чем мапинг

Sergey
23.12.2016
21:01:05
да

Aleh
23.12.2016
21:01:15
Google
Aleh
23.12.2016
21:01:25
Sergey
23.12.2016
21:01:34
guga
23.12.2016
21:01:35
и адский саппорт

у вас orm генерит sql запросы?

Sergey
23.12.2016
21:01:57
и адский саппорт
ни разу за 5 лет небыло жестких проблем с доктриной.

Sergey
23.12.2016
21:01:58
и адский саппорт
адский тюнинг перформанса

guga
23.12.2016
21:02:22
адский тюнинг перформанса
Могу немного про hibernate расказать.

Aleh
23.12.2016
21:02:22
Sergey
23.12.2016
21:02:31
и адский саппорт
если ты про SELECT запросы - да, львиную долю генерит ORM, он неплохо это делает для простых вещей. А для сложных набросать свой SQL просто проще

guga
23.12.2016
21:02:42
Могу немного про hibernate расказать.
И про то что, что мы в итоге скатились в нативные запросы.

Sergey
23.12.2016
21:02:47
со своей или в чужих проектах?)
ну в чужих проектах были проблемы с кривыми руками

И про то что, что мы в итоге скатились в нативные запросы.
тебе скинуть точку зрения авторов доктрины на то как надо юзать доктрину что бы все было ок?

если коротко - ORM нужны для обработки маленьких бизнес транзакций. Если тебе нужны репорты - юзай SQL

Sergey
23.12.2016
21:03:31
примерно вот так делаем запросы public function getInvoiceByHashAndUserId($hash, $userId) { return $this->createQueryBuilder('i') ->select('i, o, u') ->leftJoin('i.order', 'o') ->leftJoin('o.user', 'u') ->where('i.hash = :hash') ->andWhere('u.id = :userId') ->setParameter('userId', $userId) ->setParameter('hash', $hash) ->getQuery() ->getOneOrNullResult(); }

guga
23.12.2016
21:04:02
хм, в целом выглядит довольно неплохо

Sergey
23.12.2016
21:04:47
хм, в целом выглядит довольно неплохо
местами где надо забиваем вообще на ORM и юзаем только удобный querybuilder, по сути тот же jOOQ)

guga
23.12.2016
21:05:29
проблемы с ORM начинаются тогда, когда тебе надо что-то сделать из такого, для чего ORM юзать тупо глупо.
Ну у хибера есть очень много проблем, даже для того, что вроде бы его стихия

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