@oop_ru

Страница 465 из 785
Alexey
22.01.2018
10:24:49
конечно есть примеры "наследование нужно", но это все как правило из серии "и так сойдет"

f4rt~
22.01.2018
10:25:55
многие популярные фреймворки завязанны на иерархии наследования

Adel
22.01.2018
10:27:54
я вот тоже думал что интерфейсы - это все что нужно. но абстрактные классы для многих вещей правильнее. Они в правильном направлении ограничивают пользователя. Чтобы не сделал class LoggerAndRepo111 implements Logger, UserRepository .

ну и еще пара плюсов.

Google
Adel
22.01.2018
10:28:32
это ограничивает и от более возможного сценария.

class SomeLogger extends SomeLegacyLogger implements LoggerInterface

чтобы не могли наследоваться так глупо

Maksim
22.01.2018
10:30:37
ну во всех языках нет мультинаследования, да) но это какая-то весьма убогая аргументация, если честно)

если пользователь захочет отстрелить себе ноги, он и с абстрактными классами это сделает.

Артур Евгеньевич
22.01.2018
10:31:36
но 111 это пиздец конечно, я такого не видел

Adel
22.01.2018
10:31:59
Sergey
22.01.2018
10:32:21
чтобы не могли наследоваться так глупо
ты всегда сможешь глупо наследоваться

Google
Артур Евгеньевич
22.01.2018
10:32:52
class SomeLogger extends SomeLegacyLogger implements LoggerInterface
мы все классы по умолчанию c final создаем(даже настройка в шторме есть такая) и если хочшеь создать без final то надо обосновывать на ревью зачем это тебе

Maksim
22.01.2018
10:33:16
ну формулировка в стиле "к классу нельзя прилепить несколько абстрактных, но можно несколько разных интерфейсов" - чушь, имхо. Такой себе повод устраивать замену.

Sergey
22.01.2018
10:33:26
если у тебя есть 2 интерфейса и один класс их реализующий, и всю работу этот класс делегирует другим, и клиентский код завязан либо на тот или другой интерфейс - не вижу проблемы

Артур Евгеньевич
22.01.2018
10:34:01
Да есть определённые плюсы. в тех же Exception классах. Когда именно важна зависимость от обобщения к частности.
вот да, экспшны удобно наследовать, но это чисто для группирвоки логической

Sergey
22.01.2018
10:34:03
а зачем такой класс вообще?
не я пример придумал)

короч по поводу "правильности" и т.д. всегда надо рассуждать в контексте использования класса.

во имя ISP и все такое

Артур Евгеньевич
22.01.2018
10:36:36
так все таки, будет ли кейс когда нужно наследование реально нужно, а копозиция не подходит?)

Кроме упорядовачивания экспшнов

Ilia
22.01.2018
10:37:56
так все таки, будет ли кейс когда нужно наследование реально нужно, а копозиция не подходит?)
А что, обычный случай, когда принцип Лисков должен соблюдаться, уже не подходит ? При наследовании он соблюдается (но не всегда). При его отсутствии — нет.

Артур Евгеньевич
22.01.2018
10:38:08
а как вы тесты пишете?
http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

то есть мокаются интерфейсы где они есть, а если их нет, то веротяно можно обойтись норм объектом

но да с этим бывают заморочки

А что, обычный случай, когда принцип Лисков должен соблюдаться, уже не подходит ? При наследовании он соблюдается (но не всегда). При его отсутствии — нет.
Почему не соблюдается? если у нас только реализации интерфейсов, то его ка краз сложно нарушить, чем когда у нас глубокие иерархии наследования

Ilia
22.01.2018
10:41:48
Потом, интерфейсы и ООП — это как-то ... немного разные вещи.

Google
Ilia
22.01.2018
10:43:57
Почему не соблюдается? если у нас только реализации интерфейсов, то его ка краз сложно нарушить, чем когда у нас глубокие иерархии наследования
Представь, что все объекты у тебя должны быть подъобъектами твоего класса MyObject ... Как тебе тут интерфейсы помогут?

Артур Евгеньевич
22.01.2018
10:44:43
сделать интерфейс-маркер My

Ilia
22.01.2018
10:45:09
Ну и ? Сделаешь, далеее?

У тебя есть скажем 200 случаев скажем методов (функций), которые принимают MyObject. Тебе надо добавить в иерархию этих классов ещё 10 классов. Как тебе интерфейс My поможет?

Sergey
22.01.2018
10:50:17
ну то есть ты и с интерфейсами тот же LSP обязан соблюдать

Артур Евгеньевич
22.01.2018
10:50:42
Sergey
22.01.2018
10:50:47
ну мол подтипы не только через наследование можно мутить же)

У тебя есть скажем 200 случаев скажем методов (функций), которые принимают MyObject. Тебе надо добавить в иерархию этих классов ещё 10 классов. Как тебе интерфейс My поможет?
если у тебя 200 случаев когда на вход MyObject приходит - есть мысль что что-то пошло не так и эти методы должны быть прямо в MyObject а дальше скорее всего его надо будет дробить)

Ilia
22.01.2018
10:52:25
Я вот сходу так не помню.

Sergey
22.01.2018
10:53:16
Ну, расскажи, как ещё.
имплементация интерфейсов - подтипы, протоколы - те же контракты (ну то есть например у тебя есть 2 сервиса которые общаются по http и есть разные имплементации этог осервиса). То есть интерфейсы/протоколы могут быть менее явными

Ilia
22.01.2018
10:53:35
Sergey
22.01.2018
10:54:38
короч мне не нравится обсуждать абстрактный коней тем более когда они пахнут как факап с декомпозицией

Ilia
22.01.2018
10:56:03
имплементация интерфейсов - подтипы, протоколы - те же контракты (ну то есть например у тебя есть 2 сервиса которые общаются по http и есть разные имплементации этог осервиса). То есть интерфейсы/протоколы могут быть менее явными
Ну да, но реализация интерфейса —частный случай наследования (более специфическая форма), Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс My. Положим, код так написан, и используемый язык этого требует.

Sergey
22.01.2018
10:57:01
у меня ООП вполне конкретный) message passing и late binding)

> код так написан, и используемый язык этого требует. понятия не имею что мы в таком случае обсуждаем

Google
Sergey
22.01.2018
10:58:43
> но реализация интерфейса —частный случай наследования следует различать наследование включающее в себя наследование стэйта и варианты где оно отсутствует.

когда мы поведение наследуем - то да, разницы между extend/implements нет

Артур Евгеньевич
22.01.2018
10:59:49
Ну да, но реализация интерфейса —частный случай наследования (более специфическая форма), Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс My. Положим, код так написан, и используемый язык этого требует.
реализация интерфейса, это лишь обязательство реализовать набор методов с их сигнатурами. А наследование класса, это нарушение его инкапсуляции(для наследника) + плотная завязка на внутренности реализации родителя. По мне так разница колоссальна и нельзя говорить что реализация интерфейса частынй случай наследования

Артур Евгеньевич
22.01.2018
11:01:07
> Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс My. Что значит ссылка на объект? Ссылки ка краз и дает использование композиции, а в случае наследования ты получаешь кастомизированную вресию Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс MyObject

Sergey
22.01.2018
11:01:16
Admin
ERROR: S client not available

Ilia
22.01.2018
11:02:11
может это у тебя?)
не, у меня нормально

Артур Евгеньевич
22.01.2018
11:02:17
если выкинуть protected то инкапсуляция не рушится
могут еще быть public методы котоыре исползуютя внутри класса) но эт уже я за уши приятнул

Sergey
22.01.2018
11:02:20
я пока понял что у тебя есть система где все объекты являются подтипами MyObject

Ilia
22.01.2018
11:02:27
можешь еще раз с начала что именно мы обсуждаем?
По истории погляди, там всё видно.

Sergey
22.01.2018
11:02:41
могут еще быть public методы котоыре исползуютя внутри класса) но эт уже я за уши приятнул
ммм тут больше вопрос связанности а не инкапсуляции (ну то есть information hiding все плохо, а с инкапсуляцией все хорошо)

я не понимаю что именно ты хочешь описать

Ilia
22.01.2018
11:03:04
Ну, значит не судьба

Sergey
22.01.2018
11:03:08
ну... ладно)

Google
Артур Евгеньевич
22.01.2018
11:03:08
можешь еще раз с начала что именно мы обсуждаем?
я сказал что наследование не нужно, а Илья не согласен

Sergey
22.01.2018
11:03:35
я сказал что наследование не нужно, а Илья не согласен
ну вот тут опять же что подразумевается под наследованием. шаринг стэйта и protected не нужны

а само по себе наследование как вариант лепить подтипы - это и есть штука с которой можно добиться late binding по сути

но то как это реализовано в конкретном языке это уже детали

Артур Евгеньевич
22.01.2018
11:04:20
ммм тут больше вопрос связанности а не инкапсуляции (ну то есть information hiding все плохо, а с инкапсуляцией все хорошо)
так information hiding одна из двух состовляющих инкапсуляции. information hiding + объединение данных и методов для работы с ними

я так понимаю инкапсуляцию

Sergey
22.01.2018
11:04:52
Как вы думаете, есть ли ситуации, в которых наследование предпочтилтельнее композиции? Прост на медиуме часто статьи в духе "Наследование не нужно", а в комментах чуваки пишут что автор просто не умеет им пользовать, но примеров не приводят как правило
Есть Liskov substitution principle. S - подтип T тогда, когда для всякого модуля P использующего S можно безопасно заменить S на T и ничего не регрессировать при этом. Держа в уме этот принцип, можно делать что угодно, но практика показывает, что через наследование этот принцип нарушить в разы проще чем через композицию.

Ilia
22.01.2018
11:04:54
я сказал что наследование не нужно, а Илья не согласен
Нет. Ты просил пример, когда наследование нужно

Sergey
22.01.2018
11:05:31
Нет. Ты просил пример, когда наследование нужно
но этот пример только показывает что наследование не нужно, нет?

Maksim
22.01.2018
11:05:47
а началось всё с наркоманской идеи о превосходстве абстрактных классов над интерфейсами...)

Sergey
22.01.2018
11:05:53
Sergey
22.01.2018
11:07:06
Ничего не перепутал?
все корректно

Так это ж почти одно и то же...
если мы говорим о плюсах - то да

Sergey
22.01.2018
11:07:30
Sergey
22.01.2018
11:07:34
абстрактный класс без стэйта ~= интерфейс

Ilia
22.01.2018
11:07:57
Поясни
Так ты написал, ты и поясняй... По-моему так всё ровно наоборот...

Sergey
22.01.2018
11:08:11
Так ты написал, ты и поясняй... По-моему так всё ровно наоборот...
то есть с композицией проще нарушить LSP чем с наследованием?

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