
da horsie
24.12.2016
06:35:43
https://gist.github.com/f3ath/686fcb4162ffa47fb6823cd316e13428
получилась вот такая херня
как ее разбить на части?
метод в 30 строк

Google

da horsie
24.12.2016
06:37:29
это собственно моя основная логика приложения
центральный if смущает
$url и $revisions всегда ходят парой
выделить их в объект?
RevisionRange

Sergei
24.12.2016
06:42:21
Смотрю

da horsie
24.12.2016
06:42:46
GitGateway получается херовый
добавил его в гист для понимания

Sergei
24.12.2016
06:44:05
ReleaseNotes получает имя тага и печатает комментарии к коммиту?
(или вообще ко всем таженым коммитам, если не указали)
?

da horsie
24.12.2016
06:44:55
печатает все новые коммиты в теге
по сравнению с прошлым тегом

Google

da horsie
24.12.2016
06:45:17
http://keepachangelog.com/en/0.3.0/
элемент changelog'а печатает
а
можно адааптер замутить
враппер вернее
к GitGateway
который будет создавать сложную херню типа RevisionRange
тогда и URL и набор коммитов получаются свойствами RevisionRange
и вроде как логично все выглядит
а бывает фасад к одному классу?

Sergei
24.12.2016
06:52:35
Почему бы и нет.
Класс который преобразует низкоуровневый интерфейс во что-то более высокоуровневое. Не вижу греха.

da horsie
24.12.2016
06:53:46
тогда это фасад наверно
фасад над GitGateway
понимашь, что я имею в виду?
о
я начинаю сходить с ума )

Sergei
24.12.2016
07:55:17
почитал http://keepachangelog.com/en/0.3.0/ и картина как-то проясняется вроде
итого
ты хочешь тулзу, которая читает логи git репо и каким-то способом их парсит и куда-то красиво (?) печатает

Google

da horsie
24.12.2016
07:56:15
да
в консоль

Sergei
24.12.2016
07:56:28
ок
теперь я понимаю почему ReleaseNotes на самом деле один из главных действующих лиц здесь
мои мелкие капризы - getCommit муня сбило слегка с толку, т к я почему-то подумал что оно реально выкачает заданную ревизию из git

da horsie
24.12.2016
07:59:41
это getCommitDetails скорее

Sergei
24.12.2016
07:59:47
readCommitDetails() мне бы помогло
да, так я бы меньше плутал
объект GitGateway настраивается на конкретное репо и потом все данные берет из него (типа "переклчиться ну другое репо" - так не планируется / не работает)
мне кажется GitGateway выглядит весьма разумно

da horsie
24.12.2016
08:01:50
именно так

Sergei
24.12.2016
08:03:54
ReleaseNotes решает понятную (мне теперь) задачу - ему дают указатель на интерфейс Gitgateway, из которого он хитро парсит commit descriptons - вроде все вполне рукопожатно в этом на мой взгляд.
мммм единственное смущение - ReleaseNotes имеет внутренние данные ($git) которые используются ровно в одной функции.
то есть технически оно выглядит так что класс можно вообще заменить вызовом одной функции, и передать ей на вход тот $git

da horsie
24.12.2016
08:05:10
и она большая

Sergei
24.12.2016
08:05:12
планируется больще поведения?

da horsie
24.12.2016
08:05:26
нууу....
можно вообще все приложение заменить баш-скриптом

Sergei
24.12.2016
08:05:49
:)
с этим не поспорить, конечно.

Google

Sergei
24.12.2016
08:08:18
на большом проекте класс с одним методом и почти stateless у меня пожалуй вызва бы вопросы. на обсуждаемой задаче мы делаем некоторые допущения, так что мой этот вопрос снимается.

da horsie
24.12.2016
08:08:45
ну да
я ж в ООП играюсь тут
прототип у меня работает - один файл из 40 строчек

Sergei
24.12.2016
08:11:45
в общем я перечитал код еще раз - мне сложно к чему-то всерьез придарться.
даже сложно поддержать твоё замечание про то что метод слишком длинный - по моим ощущениям 30 строк делающих более-менее монолитную активность это вполне еще Ок.
одноко

da horsie
24.12.2016
08:12:10
if меня бесит
я щас превратил его вот во что
https://gist.github.com/f3ath/13592b4368c50ba63a0e315accde22e6

Sergei
24.12.2016
08:13:30
если предположить, что описание каждого коммита имеет сложную структуру, то есть хороший смысл замутить patter interpretator

da horsie
24.12.2016
08:14:05
но классы Release и SubsequentRelease весьма уродливы

Sergei
24.12.2016
08:14:22
мммммм
это кажется ход как раз в ту сторону о которой я вот выше писал

da horsie
24.12.2016
08:15:08
ну типа полиморфизм вместо ифа
ТИПА
и теперь $git путешествует по всем внутренним классам

Sergei
24.12.2016
08:16:59
как я понимаю ты планируешь преобразовать некий в общем plain text в красивую стуркутру типа
какой-то_комментарий_к_коммиту_с_разметкой => логический_блок_описания1, логический_блок_описания2, логический_блок_описания3 ...
?

da horsie
24.12.2016
08:17:03
и тстировать все равно сложно
мне нужно в точности то, что описано по ссылке
changelog

Google

da horsie
24.12.2016
08:17:48
и его буду совать в описание моих релизов
у меня щас ООП ради ООП

Sergei
24.12.2016
08:36:47
то что $git пополз по городам и весям - может быть не сильно хорошо.
альтернативой могло бы быть
$revisionsToIncludeInReport = $this->$git->GetCommits(rev_begin, rev_end);
$release = new ReleaseDescription($revisionsToIncludeInReport);
$release->printHeader($printer);
$release->printChanges($printer);
то есть я имею тут ввиду что ReleaseNotes решает, какие ревизии(коммиты) должны быть включены в собственно release notes (что само по себе кажется даже разумным), получает их описания из $git (который уже никому другому не дает), и потом создает объект ReleaseDescription который строится получая на вход уже не $git а набор обектов-описаний диапазона ревизий.

da horsie
24.12.2016
08:40:18
ReleaseDescription тогда становится довольно тупым

Sergei
24.12.2016
08:40:25
таким образом мы попрятали $git внутри одного класса и тем самым даже соблюли single responsibility

da horsie
24.12.2016
08:41:32
я шас по-другому их попробую разделить
ReleaseNotes херовое название
оно вводит в заблужение

Sergei
24.12.2016
08:42:20
его ответсвенность - уметь по запросу извне (по тэгу) выбрать нужные коммиты из git.
при это другая система уже будет из этих запростов делать какой-то красивый текст.

da horsie
24.12.2016
08:42:29
мне нужна фабрика релизов, которые будут уметь печататься
либо я заноняюсь уже
но попробую)

Sergei
24.12.2016
08:43:19
Ж)
я спать - у меня завтра поездка в сторону Sierra Nevada с утра.