
Sergey
24.12.2016
01:22:27
$tag1 = new Tag('v1.0');
$tag2 = new Tag('v1.1');
$log->getBetween($tag1, $tag2)->shouldReturn([
new Commit(),
new Commit(),
]);
например
с другой стороны.... тебе проще будет написать сервис, который будет потом с этими коммитами что-то делать
и вместо моков передавать ему уже готовый список коммитов

Google

Sergey
24.12.2016
01:23:15
а сервис, который будет координировать действия - его покрывать интеграционным тестом
там нет логики, он тупо делигирует задачи другим штукам
по итогу у нас необходимости что-то мокать вообще не будет
не все вещи надо покрывать юнит тестами
например если у тебя есть класс Application
который делает дела и тупо задает последовательность вызова других маленьких сервисов
в нем нет логики, тупо последовательность вызовов
и у тебя в тестах будет... просто продублирована реализация тестируемого кода при помощи моков
в таких тестах нет смысла

da horsie
24.12.2016
01:25:37
протестировать последовательност вызовов, не?

Sergey
24.12.2016
01:26:26
что произойдет если ты захочешь поменять последовательность вызовов?
тебе придется поправить и в тестах
и в итоге твои тесты не будут ничего проверять

Google

da horsie
24.12.2016
01:27:26
ну например, я решу добавить логирование. и будут в приложение передавать логгер, значит затрону этот код
а теста нет
риск налицо

Sergey
24.12.2016
01:29:31
расширяй функционал не внося изменений в имеющийся код
и ты будешь спасен)
ладно... я спатенькать, а то заседелся

da horsie
24.12.2016
01:30:37
пока
спасибо за беседу
There is another thing I'm struggling with.
DTO clearly violate the Law of Demeter
by exposing their internal structure
Сергей

Sergei
24.12.2016
03:56:38
В моём понимании так оно и есть. Можно сказать, "по определению".
Опять же моё понимание философии примерно такое: классы помогают уменьшить бардак в коде.
Но даже в "идеальном" коде всегда присутствуют string, int, и т.д.
Чем больше в коде "умных" классов, тем в теории меньше бардака. Однако в то же время из int делать некую умную структуру тоже фигово (например ультра-неэффективно).

da horsie
24.12.2016
04:00:04
вот и я не понимаю
A data transfer object (DTO[1][2]) is an object that carries data between processes.
this is from Wikipedia

Google

da horsie
24.12.2016
04:00:45
the keyword is "processes" i guess
т.е. если у тебя это все в одном процессе живет, ДТО не нужны
The motivation for its use is that communication between processes is usually done resorting to remote interfaces (e.g. web services), where each call is an expensive operation.[2] Because the majority of the cost of each call is related to the round-trip time between the client and the server, one way of reducing the number of calls is to use an object (the DTO) that aggregates the data that would have been transferred by the several calls, but that is served by one call only.[2]
вощим понятно

Sergei
24.12.2016
04:02:25
Well, not really, I think. Let's say you use Memento pattern - at some point you're forced to serialize your "wise" object to some binary structure.

da horsie
24.12.2016
04:02:39
из одного класса в другой совать ДТО - это перегиб

Sergei
24.12.2016
04:02:45
Which, to my understaneing, is somehow close to DTO.
Именно. Моё понимание - DTO применимы когда "нас заставили".
Когда иначе - только хуже.

da horsie
24.12.2016
04:03:29
да
когда точно нет другого выхода

Sergei
24.12.2016
04:03:53
Передача данных по сети, например (like, protopuf lib - it's clearly DTO).

da horsie
24.12.2016
04:04:04
дада

Sergei
24.12.2016
04:04:11
Или передача между процессами.

da horsie
24.12.2016
04:04:19
да

Sergei
24.12.2016
04:04:30
Или когда у меня простигосподи ORM.

da horsie
24.12.2016
04:04:46
но явно не из одного класса в другой в пределах одного проекта
дадада
ну ОРМ это и есть передача данных между аппликухой и стораджем

Sergei
24.12.2016
04:05:23
Да, я бы не стал делать DTO где я могу нормально пользовать свой хороший "умный" объект.

Google

Sergei
24.12.2016
04:06:12
Сегодня там сильно выше говорили про подход к анализу системы для её проектирования.
Моё понимание этого дела - хорошо начинать с user stories, "как в итоге видит/понимает это всё конечный пользователь?". Задавать самому себе уточняющие вопросы - пока не будет казаться что "всё вроде ясно".
В итоге получается кучка требований.

da horsie
24.12.2016
04:08:46
ну вот как Сергей советует - строить сверху вниз

Sergei
24.12.2016
04:09:02
Вот существительные в этом списке - кандидаты на классы.
Глаголы - кандидаты на методы/API.
Мне оно так ничё помогает.
Можно сказать что это pull-проектирование (супротив push-проектирования). То есть мы проектируем лишь те функции/системы, которые дают полезный результат конечному пользователю.
И да, оно тоже "сверху-вниз".
@f3ath есть апдейты кода?
(вроде в репо нп git не видно?)

da horsie
24.12.2016
04:31:06
не, я не пушил
да и не коммитил
пытаюсь построить свехну вниз
мне удалось избавиться от предствления вообще
и заодно от DTO)
мне кажется получается пока неплохо
блин
по LoD получается, что вообще объекты возвращать неправильно
никогда

Google

da horsie
24.12.2016
05:50:18
как тогда LoD согласутеся с паттерном фабрика?
чето я не понимаю опять

Sergei
24.12.2016
06:03:46
Эээ кто в данном случае LoD?

da horsie
24.12.2016
06:04:29
law of demeter

Sergei
24.12.2016
06:07:30
Даётся мне, там говорится о том, что нехорошо лезть внутрь объекта, доставать его внутренние объекты, и что-то с ними делать.
Если мы так делаем - мы слишком дофига много знаем о внутреннем устройстве того несчастного объект.
Однако.
Логически та же фабрика не делится с нами внутренним состоянием - она генерирует внешние сущности для нас.

da horsie
24.12.2016
06:09:05
LoD это про то, что не должно быть такого object.foo().bar()

Sergei
24.12.2016
06:09:18
Ага.

da horsie
24.12.2016
06:09:49
аааа
я понял

Sergei
24.12.2016
06:10:00
Фабрика всякий раз генерирует _новый_ объект для нас, который не явлоется её внутренним состоянием.

da horsie
24.12.2016
06:10:05
дада
правильно
тогда ок
спасибо
чето я раньше был лучшего мнения о своих способностях к ООП
на деле как-то все грустно оказалось

Sergei
24.12.2016
06:11:51
Интересные темы поднимаешь. Я прямо хочу когда-то приехать в гости потрещать прямо на эту тему.