
Sergey
23.12.2016
21:37:56
You can't have code coverage серьезно?
I can't use a data provider
:O

Sergey
23.12.2016
21:38:16
из коробки - не сможешь, но можно поставить экстеншен

Google

Sergey
23.12.2016
21:38:21
дата провайдеров тоже нет

Sergey
23.12.2016
21:38:27
I can't mock abstract methods - а интерфейсы можешь?

Sergey
23.12.2016
21:38:28
НО
вопервых возможно что-то такое сейчас должно появиться в новых релизах ну и опять же есть экстеншены

Sergey
23.12.2016
21:38:47
а несколько интерфейсов одновременно?)

Sergey
23.12.2016
21:38:53

Sergey
23.12.2016
21:39:15
да, были такие кейсы

Sergey
23.12.2016
21:39:15
на одной зависимости

Sergey
23.12.2016
21:39:44
а почему нет?)

Sergey
23.12.2016
21:40:01
ну как тебе сказать... как минимум звучит странно
быть может это должен быть не 2 интерфейса а один?

Google

Sergey
23.12.2016
21:40:19
может ты не так разделил интерфейсы?
может твой класс делает что-то слишком много?

Sergey
23.12.2016
21:40:54
не, именно 2 надо было, один как маркер вроде был
щас по коду поищу где это было

Sergey
23.12.2016
21:41:23
иначе что-то не так с сегрегацией интерфейсов

Sergey
23.12.2016
21:43:58
а да вот нашел. там коллекция, в нее добавляются элементы интерфейса Filter, но у некоторых элементов может быть еще интерфейс StatefulFilter
и вот надо было проверить метод который делает getStatefulFilters

Sergey
23.12.2016
21:44:19

Sergey
23.12.2016
21:44:27
да

Sergey
23.12.2016
21:44:36
ну... чувствуешь запашек легкий?

Sergey
23.12.2016
21:44:56
та не, норм

Sergey
23.12.2016
21:45:14
ну это не вонь, это так... как если ты открываешь холодильник и тебе не комфортно

Sergey
23.12.2016
21:45:25
ок, твой вариант)

Sergey
23.12.2016
21:45:42
я ж задачу не знаю)
чем отличается поведение StetefulFilter от Filter и что ты делаешь внутри коллекции?


Sergey
23.12.2016
21:46:10
class Filters
{
/**
* @var FilterInterface[]
*/
private $filters = [];
/**
* @return FilterInterface[]
*/
public function getFilters()
{
return $this->filters;
}
/**
* @param FilterInterface $filter
*/
public function addFilter(FilterInterface $filter)
{
$this->filters[get_class($filter)] = $filter;
}
/**
* @param string[] $names
* @return FilterInterface[]
*/
public function getFiltersExcept(...$names)
{
$filters = $this->filters;
foreach ($names as $name) {
if (!isset($filters[$name])) {
continue;
}
unset($filters[$name]);
}
return $filters;
}
/**
* @param $name
* @return FilterInterface
*/
public function getFilter($name)
{
return $this->filters[$name];
}
/**
* @return StatefulFilterInterface[]
*/
public function getStatefulFilters()
{
$filters = [];
foreach ($this->filters as $key => $filter) {
if ($filter instanceof StatefulFilterInterface) {
$filters[$key] = $filter;
}
}
return $filters;
}
}
вообще можно было сделать расширение интерфейса, но это слишком просто


Sergey
23.12.2016
21:47:03
getStatefulFilters
только там вижу inscenceof
и не понимаю зачем этот метод

Google

Sergey
23.12.2016
21:47:29
ну вот надо)

Sergey
23.12.2016
21:47:36
ну вот запах
короч... пишка ограничений спека в том что отговорки в духе "ну вот надо" там не сработают. Ты тупо не сможешь это протестить и тебе придется подумать получше
а поскольку мы со спеком должны работать в контексте tdd
то проблемы быстрее находятся

Sergey
23.12.2016
21:49:05
вот где он юзается
public function createSearchRequest($searchParams)
{
$searchRequest = new SearchRequest();
$searchRequest->setSearchParams($searchParams);
foreach ($this->filtersProvider->getStatefulFilters() as $filter) {
$searchRequest->addFilterContext(get_class($filter), $filter->createContext($searchRequest));
}
return $searchRequest;
}

Sergey
23.12.2016
21:49:25
так почему бы тебе для stateful фильтров не завести тупо отдельную коллекцию?

Sergey
23.12.2016
21:49:31
зачем?)

Sergey
23.12.2016
21:49:37
избавился бы от ифов
ну это ж разные интерфейсы
и разные штуки
если бы у тебя были дженерики
то тебе нужно было бы что-то в духе
Filters<Filter|StatefulFilter>

Sergey
23.12.2016
21:50:55
не. просто StatefulFilter не может сам существовать
только как маркер для Filter
поэтому List<Filter>

Sergey
23.12.2016
21:51:16
...хз стремная хрень
короч я хз... сча попробую переписать свои тест кейсы под phpunit и посмотреть насколько тошнотворно

Sergey
23.12.2016
21:51:55
если это стремная хрень, зачем ее добавляют в core lib котлина?

Google

Sergey
23.12.2016
21:51:55
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-is-instance.html
filters.filterIsInstance<StatefulFilter>() вот так бы этот метод выглядел

Sergey
23.12.2016
21:52:59
нуууу... хз)
компромисы?)

Sergey
23.12.2016
21:53:39
? да нет, у меня подобные кейсы есть еще в других местах
когда есть пачка провайдеров, но все умеют разное. мне нужно выбрать по маркеру их
точнее там не маркеры, а полноценные интерфейсы

guga
23.12.2016
21:55:07
Про котлин был кстати годный доклад, о том, что любой язык — сполшные компромисы, ну и примеры компромисов, которые они приняли.

Sergey
23.12.2016
21:55:18
на спринге это проще... захуярил себе List<OloloInterface> services и не ебешь себе мозг

guga
23.12.2016
21:55:18
Все, кроме хаскеля, он прекрасен.

Sergey
23.12.2016
21:55:41
котлин практичен)

Sergey
23.12.2016
21:55:50
практичность = компромисы
это как инженеры vs ученые

Sergey
23.12.2016
21:56:09
ну экстеншены мало кто назовет здравой идеей

Sergey
23.12.2016
21:56:12
инженеры используют допущения, неточности, рандом

Sergey
23.12.2016
21:56:51
ну как рандом.. скорее реальные условия
а не лабораторные или какие-то теории

guga
23.12.2016
21:57:10

Sergey
23.12.2016
21:57:14
да

guga
23.12.2016
21:57:21
я считаю что это прекрасно

Google

Sergey
23.12.2016
21:57:29
если не злоупотреблять
а то код быстро превращается в непонятные вещи)

guga
23.12.2016
21:57:47
нодоело писать StringUtils, BlaBlaUtils
а выглядят они лучше, чем теже имлиситы в скале

Sergey
23.12.2016
21:58:42
я вот сегодня запилил себе
fun Document.createElement(name: String, value: String = "", attributes: Map<String, String> = emptyMap()): Node {
val element = this.createElement(name)
element.textContent = value
for ((attrName, attrValue) in attributes) {
element.setAttribute(attrName, attrValue)
}
return element
}
и теперь можно хреначить appendChild(createElement("RelCode", attributes = mapOf("value" to "Regular")))
вместо унылых записей в 3 строки
val relCode = doc.createElement("RelCode")
relCode.setAttribute("value", "Regular")
requestItem.appendChild(relCode)

guga
23.12.2016
22:01:38
а вот на оборот хочу как-то производную spec попробовать

Sergey
23.12.2016
22:01:51
зачем?)
spock какой-то?

guga
23.12.2016
22:02:07
не знаю, spoсk выглядит довольно вкусно

Sergey
23.12.2016
22:02:59
его ж вроде с груви только юзают?

guga
23.12.2016
22:03:32
Нет, судя по тому что я видел, вполне удачно тестируют java код

Sergey
23.12.2016
22:03:49
https://github.com/JetBrains/spek/blob/master/spek-samples/src/test/kotlin/org/jetbrains/spek/samples/CalculatorSpec.kt
можно spek взять еще)

Sergey
23.12.2016
23:52:01
https://www.youtube.com/watch?v=ZsHMHukIlJY
оч годный видос
можно собрать список видосов которые говорят "не юзайте геттеры и сеттеры")

da horsie
24.12.2016
00:03:55
массивы в php в качестве DTO - это ок?

Sergey
24.12.2016
00:04:15