
Aleh
27.02.2017
13:33:53
или заимплементил интерфейс?
с точки зрения пользователя кода
который потом тайпхинты ставит
он ожидает определенного поведения от интерфейса

Google

Sergey
27.02.2017
13:34:25
интерфейс декларирует тебе только то что у тебя есть метод. а то какая реализация может быть для него - это уже не его проблемы
вон пример выше с кешем. для void кеша ты можешь дого ожидать что тебе после set что-то вернет get

Aleh
27.02.2017
13:35:00
это проблемы пользователя
ему это важно

Sergey
27.02.2017
13:35:21
ну так и doublelist тоже проблемы пользователя. семантика ведь не нарушена

Aleh
27.02.2017
13:35:30
да, но lsp нарушен

Sergey
27.02.2017
13:35:57
почему? класс просто расширен
он не меняет поведение базового
я про double

Aleh
27.02.2017
13:36:24
потому что пользователи интерфейса не могут безболезненно переключиться с одной реализации на другую
сломан контракт
и весь интерфейс потерял смысл
если я не могу подменить реализацию, то зачем мне какая-то абстракция между мной и реализацией?)

Google

Sergey
27.02.2017
13:37:11
возвращаемся к кешу с самыми разными подтипами

Aleh
27.02.2017
13:37:33
давай

Sergey
27.02.2017
13:38:19
я подсовываю любую реализацию и код не ломается. могут сломаться только ожидания юзера
но это уже его проблемы что он там ожидает
интерфейс соблюден же

Aleh
27.02.2017
13:38:51
вот сейчас ничего не понял
покажи мне интерфейс и контракт

Sergey
27.02.2017
13:39:28

Aleh
27.02.2017
13:40:47

Aleksandr
27.02.2017
13:41:06
покажи мне интерфейс и контракт
видимо он имеет в виду, что реализация соответствует интерфейсу, но результат из кэша необзятаельно может вернуться сразу (в зависимости от реализации). ну это очевидный момент

Sergey
27.02.2017
13:41:19
покажи мне интерфейс и контракт
<?php
interface Cache
{
public function set($name, $value);
public function get($name);
}
class ArrayCache implements Cache
{
private $state = [];
public function set($name, $value)
{
$this->state[$name] = $value;
}
public function get($name)
{
return $this->state[$name] ?? null;
}
}
class VoidCache implements Cache
{
public function set($name, $value)
{
}
public function get($name)
{
return null;
}
}

Aleh
27.02.2017
13:41:51
ну окей

Aleksandr
27.02.2017
13:41:59
банальный nullobject

Sergey
27.02.2017
13:42:12
и ты везде опираешься на интерфейс и можешь заменить реализацию на любой его подтип

Aleh
27.02.2017
13:42:39
окей, нам теперь надо выделить контракт
грубо говоря как связаны set и get?
если никак, то отлично, обе реализации соответствуют этому
и пользователь кода этого ожидает от поступающих реализаций
а если он будет думать, что после set обязательно должно это значение отдаться по get, то такой код сломается

Sergey
27.02.2017
13:44:26

Google

Aleh
27.02.2017
13:44:34
это не всегда так
в интерфейсе мы не можем описать связи, мы их описываем где-то еще
тесты\просто по использованию интерфейса

Sergey
27.02.2017
13:45:22
у тебя тесты будут на конкретные реализации

Aleh
27.02.2017
13:45:31
нет
тесты будут на взаимодействие моего кода с интерфейсом

Paul
27.02.2017
13:45:45

Aleh
27.02.2017
13:46:08
интерфейсом владеет пользователь, а не реализация
поэтому интерфейс в первую очередь это его ожидания

Sergey
27.02.2017
13:46:51

Aleh
27.02.2017
13:47:06
ну вот про это LSP и говорит
что мы можем вроде бы все методы заимплементить

Aleh
27.02.2017
13:47:28
но как-то не так
вот remove у нас будет добавлять
а add искать
а has добавлять
и вот что-то потом пойдет не так)
при этом код конечно же скомпилируется

Sergey
27.02.2017
13:48:27
семантически все будет верно)

Admin
ERROR: S client not available

Google

Aleh
27.02.2017
13:48:51
if (!list.has(item))
list.add(item);
)
это особенно хорошо понятно, когда проектируешь сверху вниз
начинаешь писать код и думаешь, чтобы мне здесь понадобилось
ага, какой-нибудь Notificator, пускай с методом notify
ага, Catalog с методами... И т.д. А если там ничего нет, то должен быть такой-то Exception
и только потом ты идешь реализовывать эти интерфейсы, но ты реализуешь их оглядываясь на то, чего ты ждал, когда делал предыдущий модуль
т.е. там, где они нужны

Denis
27.02.2017
15:24:56
недосып) либо к паренту либо переделывать

Алексей
27.02.2017
17:12:47
Всем привет. Собрал в одном месте все чаты для программистов - @Chats_Developers, пользуйтесь на здоровье. Ваш чат у нас тоже есть, не удаляйте это сообщение.

Paul
28.02.2017
07:58:43
Чуть усложним: пусть тут не список, а множество. Какие требования к item предъявишь?

Aleh
28.02.2017
08:12:39
Тогда item должен обладать свойством сравнимости или типа того

Paul
28.02.2017
08:15:26
Разумеется, если множество на деревьях, то достаточно, чтобы был частичный порядок на множестве item, а если на хешмапах, то должно быть определена эквивалентности и хешируемость. А если на массиве, то просто эквивалентность

Aleh
28.02.2017
08:16:09
Так, ну окей

Paul
28.02.2017
08:16:31
При этом абстрактный тип остается один --- множество

Aleh
28.02.2017
08:16:57

Google

Aleh
28.02.2017
08:17:25
Мы не можем один Set другим подменить
Точнее только более частный более общим
Про это lsp и говорит
Ну либо я тебя не понял

Paul
28.02.2017
08:18:53
Почему?
Потому что множество не завязано на реализацию, в математике никакой хешируемости и порядка не надо

Aleh
28.02.2017
08:19:06
А причем здесь математика?

Paul
28.02.2017
08:19:37
Про это lsp и говорит
LSP тут не причем, речь о дырявости абстракции и непригодности исключительно метода сверху вниз