
Aleh
22.12.2016
17:24:23

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

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

Sergey
23.12.2016
10:31:24
иначе смысл теряется
вообще я все думаю засеть таки написать цикл статей свой... у меня сейчас куча идей уже записаны

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:29:12

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

Aleh
23.12.2016
13:30:34
ага)

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

Rodion
23.12.2016
15:13:39

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:00:54

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

Sergey
23.12.2016
21:01:58

guga
23.12.2016
21:02:22

Aleh
23.12.2016
21:02:22

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

guga
23.12.2016
21:02:42

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:05

Sergey
23.12.2016
21:04:47

guga
23.12.2016
21:05:29