@oop_ru

Страница 127 из 785
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
если я не могу подменить реализацию, то зачем мне какая-то абстракция между мной и реализацией?)
что тебе мешает подменить List на DoubleList? код скомпилируется, работать будет

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
окей, нам теперь надо выделить контракт
интерфейс выступает в роли контракта и явно не описывает то как связаны get/set

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
if (!list.has(item)) list.add(item);
Вот только абстракция дырявая

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

Aleh
28.02.2017
08:12:39
Чуть усложним: пусть тут не список, а множество. Какие требования к item предъявишь?
Я редко занимаюсь проектированием абстрактных математических сущностей. Какие надо, такие и предъявлю. Там есть условие уникальности?

Тогда item должен обладать свойством сравнимости или типа того

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

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

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

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

Страница 127 из 785