LINUX.ORG.RU

Что дает принцип Лисков?

 


0

1

Лисков утверждает [сами знаете что]. Хочется спросить. А зачем это вообще? Допустим, «клиентский» код не может рассчитывать на эти контракты, и для типа и подтипа нужно делать разных клиентов. Ну и что с того? Как это осложняет проектирование? Какая нафиг, вообще разница?

Пошел сам знаешь куда, друх!

anonymous
()
Ответ на: комментарий от i-rinat

Я в названии темы написал, что я имею в виду. Вы очень инертный человек, когда нет авторитета, в один прекрасный момент высер онанимуса становится для Вас истиной в последней инстанции.

callbackhell
() автор топика
Ответ на: комментарий от callbackhell

Я в названии темы написал, что я имею в виду.

Нет. Ты попытался вбросить невнятную фразу. Как известно, чем проще и чем невнятнее тема, тем больше обсуждений она вызывает.

Давай про рефакторинг поговорим, что ли.

Вот у меня есть код программы, которая работу выполняет внутри кода диалога, запуская нить в operator(). А потом, захватывая лок, испускает сигналы, чтобы в главной нити (а может и не в главной) вызвать что-то из GTK+. Это жесть. Как и то, что диалог сам себя delete this'ает. И после этого ещё может код исполнять. Это просто жесть. Мне интересно, как это всё во внятный вид приводить? Руками муторно очень.

i-rinat ★★★★★
()
Ответ на: комментарий от A1

там говорится о проблеме прямоугольник/квадрат, нарушающей принцип, это вообще параллельно, я не об этом спрашиваю, откуда вы такие досужие только беретесь.

callbackhell
() автор топика
Ответ на: комментарий от i-rinat

Если тебе что то не понятно — это твои проблемы. А принцип Лисков знаком любому, кто имеет представление об ООП. Чтобы в следующий раз не позорится, просто воздержитесь от комментариев

callbackhell
() автор топика

Как это осложняет проектирование?

Необходимость проверять реализацию каждого класса в иерархии конечно никак не «осложняет» проектирование. Но это только в твоей вселенной, к сожалению.

A1
()
Ответ на: комментарий от i-rinat

Возможно, вы имели в виду: гидралиск

В голос!

Stil ★★★★★
()
Ответ на: комментарий от callbackhell

Если тебе что то не понятно — это твои проблемы.

Конечно. А если что-то непонятно тебе — это проблемы LOR'а. Мы уже поняли.

i-rinat ★★★★★
()
Ответ на: комментарий от A1

Хватит пороть чушь. Тебе в классы заглядывать все равно придется, ты должен знать реализацию хоть с соблюдением хоть без него. Если нечего сказать, просто ничего не говори, неужели это так трудно?

callbackhell
() автор топика

Заигнорил блаженного, сразу пол темы отвалилось. Полегчало:)

callbackhell
() автор топика
Ответ на: комментарий от callbackhell

Тебе в классы заглядывать все равно придется

Очень редко заглядываю, когда документации совсем-совсем нет и из сигнатур вообще не понятно как пользоваться. Продолжай дальше бухать с радугой.

A1
()
Ответ на: комментарий от A1

когда документации совсем-совсем нет

Ну так, какая разница, в документацию или в код. Описание класса смотришь. Вот и прочитаешь об изменениях.

Короче ладно, я твое мнение услышал, спорить не буду, послушаю других. Спасибо.

callbackhell
() автор топика

То есть у меня класс осуществляет обработку пакетов, у которого сто разновидностей, но сделано так, чтобы в каких-то подпакетах, вызывая функцию, например, decode(AbstractPkgDecoder apd), пакет не декодировался, а декодировался с помощью каких-то методов подтипа костыльным образом?

JN
()
Ответ на: комментарий от JN

Или, например

abstract class AbstractEncoder {

public void encode(String path_in, String path_out) {
Path path = Paths.get(path_in);
byte[] data = Files.readAllBytes(path);
byte[] res = encode(data);
FileUtils.writeByteArrayToFile(new File(path_out), res);
}

protected abstract byte[] encode(byte[] data);

}

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

JN
()
Последнее исправление: JN (всего исправлений: 1)

так в два раза больше клиентов приходится писать (если только тип и подтип). А если инваринаты работают, один клиент для всех работает правильно. В итоге работы значительно меньше выходит.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

так в два раза больше клиентов приходится писать

Там нужно больше писать, но не в два раза больше. Код-то можно повторно использовать. Трейты, миксины, приватное наследование в конце-концов.

JANB
()
Ответ на: комментарий от AndreyKl

На самом деле, не будет этого. Про наследование и прочее написали выше, абсолютно справедливо. Кроме того, из за этого ограничения, часть подтипов просто не получится пеализовать как подтипы, и придется городить новые типы. Там не факт, что меньше кода будет, возможно и больше.

callbackhell
() автор топика

А зачем это вообще?

для твоей наколенной поделки оно не зачем, но оно становится критически важным когда у тебя в подчинении 5к студентов/интернов/джуниоров/индусов и надо получить продукт определённого качества за определённые сроки

mm3 ★★★
()

Когда у меня вопросы возникают стараюсь всё обыскать и найти ответы. Такие ответы хорошо запоминаются. К тому что нехрен юзать лор как гугл. Да, на замысловатые вопросы там ответа не найти, но и здесь тоже.

Задавай такие вопросы, чтобы было интересно поговорить. А то вот уже с десяток твоих тем посмотрел, вроде бы интересно, но постить и сраться вообще не хочется. Отбиваешь желание своим то ли тупняком, то ли эгоизмом.

В общем думай и о других тоже, а не только о себе, надоел! Мне вот тоже дохрена вопросов интересно, но я отдась себе отчёт в том, что другим то эти вопросы не интересы чуть более чем полностью.

ixrws ★★★
()

В вопросе излечения шизофрении - очевидно, ничего.

thesis ★★★★★
()

Лисков утверждает [сами знаете что]

ну так и пойди [сам знаешь куда]

Dark_SavanT ★★★★★
()
Ответ на: комментарий от callbackhell

Вообще-то должная быть разница, ты на форуме, это не твой блог. Одно дело изредка спрашивать то, что не нашёл сам. Совсем другое намеренно погружать других в свою трясину.

ixrws ★★★
()

Допустим, «клиентский» код не может рассчитывать на эти контракты, и для типа и подтипа нужно делать разных клиентов. Ну и что с того?

А зачем тогда вообще они тип и подтип?

anonymous
()
Ответ на: комментарий от ixrws

Это что закон такой чтоли? Вот конкретно ты в данный момент нарушаешь правила флудом, а я нет. И, кстати, был о тебе лучшего мнения. Ты скатился до банального нытья.

И да, кстати, я внятного ответа на данный вопрос не нашел в гугле. Везде пишут что *так надо* *это хорошо*, но почему надо, и почему хорошо, примеров в стиле «вот было плохо, но привязали лисков и стало хорошо», или хотя бы «Алан Кей одобряе» — ничего такого нет.

callbackhell
() автор топика
Ответ на: комментарий от callbackhell

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

Ну вот ты решаешь вообще не использовать принцип Лисков, как ты эти типы-подтипы будешь использовать без него, покажи плз. Только давай код попроще, я в этот твой эзотерический js не понимаю.

anonymous
()
Ответ на: комментарий от anonymous

Ну как обычно используют? Реализовали логику в классе, наследуем ее в подклассе, меняя часть реализации, либо расширяя, чтобы не дублировать код, что не понятного то?

callbackhell
() автор топика
Ответ на: комментарий от callbackhell

Да это понятно, а теперь где профит, если использовать это в одном клиенте нельзя, а надо разные писать?

anonymous
()
Ответ на: комментарий от anonymous

Профит в том, в данном случае, что ты не пишешь лишней писанины. Для динамики профит также в использовании метаобъектов. Есть и другие профиты. ООП затевалось не ради Лисков, ИЧСХ, задолго до нее, если чо. Тут еще большой вопрос, имеет ли она вообще к этому отношение.

callbackhell
() автор топика

Хочется спросить. А зачем это вообще?

Не нужен. Лично тебе разрешаю не использовать. Вообще. Могу и справку дать. Типа «анонимус разрешил анонiмусу не пользоваться принципом Лисков в своих хеловордах. Подпись, дата, ЛОР, печать».

anonymous
()
Ответ на: комментарий от callbackhell

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

тот же классический пример с прямоугольником и квадратом: любой адекватный программист получив класс ректангл будет ожидать что ему можно сделать setWidth и setHeight. ну и ясное дело сделает setWidth и setHeight. Однако если к нему пришёл квадрат, то при вычислении площади получится ошибка. Хотя всё ведёт себя так как будто должно работать. В этом и проблема. Лучше в таком случае лучше иметь возможность проверки компилятором (в смысле не делать квадрат подтипом прямоугольника), поскольку в таком случае ошибка не будет допущена.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от i-rinat

А потом, захватывая лок, испускает сигналы, чтобы в главной нити (а может и не в главной) вызвать что-то из GTK+. Это жесть.

А что такого?

loz ★★★★★
()
Ответ на: комментарий от loz

А что такого?

Соответствующие функции в GTK+ 3 объявлены устаревшими. Приложения должны работать с UI только из главной нити. Да и в GTK+ 2 работа с несколькими потоками была невнятно описана. Поэтому многие использовали эти фичи неправильно. И даже в моём конкретном случае я в одном месте нашёл лок, который захватывался совершенно зря.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Приложения должны работать с UI только из главной нити.

ого! Серьезно чтоль? вообще все иксовые, или только гтк? я в гуе ваще никак, но писал проектик с Qt и там сигналы как-то криво работали из другого потока.

anonymous
()
Ответ на: комментарий от i-rinat

Ну так все правильно, сделай из главной нити актор/стейт машину, с мейлбоксом и сообщениями. Должно упростить все по-идее.

loz ★★★★★
()
Ответ на: комментарий от anonymous

ого! Серьезно чтоль? вообще все иксовые, или только гтк?

В GTK+ очень рекомендуется работать из основной нити, хотя если озаботиться блокировками (gdk_threads_init/gdk_threads_enter/gdk_threads_leave), то всё ещё возможно. В Xlib надо явно вызывать в начале программы XInitThreads(), а потом все вызовы оборачивать в XLockDisplay/XUnlockDisplay, иначе будет «ой». (Я так и не понял, какой смысл в этих функциях, если то же самое можно сделать в самой программе). Но можно открывать по новому соединению к X серверу для каждой нити и работать так. В XCB с нитями получше, там почти все вызовы асинхронные и проблем как в Xlib быть не должно.

проектик с Qt и там сигналы как-то криво работали из другого потока.

Вот это гуглится: http://doc.qt.io/qt-4.8/threads-qobject.html Суть довольно проста — при отсылке из другого потока надо вбрасывать сообщение в цикл целевого потока, тогда гонок не будет.

i-rinat ★★★★★
()
Ответ на: комментарий от loz

сделай из главной нити актор/стейт машину, с мейлбоксом и сообщениями.

Да есть она уже там, главный цикл GLib называется. И есть уже встроенные средства для того чтобы делать сигнал-слот в разных потоках. Самое забавное в том, что автор знал об этом, но всё равно наворотил ещё и прямые вызовы.

В принципе, понятно, что делать, только занятие муторное.

i-rinat ★★★★★
()
Ответ на: комментарий от dave

Самое смешное, что это ничего не меняет в смысле склонений. Или о чем ты?

callbackhell
() автор топика
Ответ на: комментарий от callbackhell

Ты говоришь о наследовании реализации! А принцип Лисков касается наследования подтипов. Выполнение принципа подстановки Лисков, как следует из его определения и здравого смысла, является следствием правильного наследования подтипов.

«Правильного» в смысле согласованности контрактов типа и подтипов. Отсутствие такой согласованности (т.е. нарушение принципа Лисков) говорит о том, что мы имеем дело не с наследованием подтипов, а с чем-то другим, и наследования в нашем случае быть не должно!

Другими словами:

Если ( Думаем_Что_Имеет_Место_Наследование_Подтипов ) То ( Должен_Выполняться_Принцип_Лисков ).

Или

Если ( Принцип_Лисков_Не_Выполняется ) То ( Наследования_Подтипов_Нет_И_Наследование_Скорее_Всего_Применять_Нельзя ).

anonymous
()
Ответ на: комментарий от callbackhell

Тот же пример с квадратом и прямоугольником.

Казалось бы, если готов тип Rectangle есть соблазн применить наследование реализации, и реализовать Square как подтип Rectangle. Да, это обойдется почти без крови и без кода, наследование реализации все же...

Но вот поскольку Square это ну никаким местом не подтип Rectangle (да, именно из-за несогласованности контрактов), то от такого решения мы получим больше проблем у клиентов при повторном использовании, нежели пользы от экономии кода.

А ведь принцип Лисков в данном случае не выполняется, - не всегда Square можно подставить вместо Rectangle в клиентский код. Если бы мы пользовались этим принципом в том смысле, что описал выше, то не наступили бы на грабли и не экономили бы строчки кода с помощью наследования.

anonymous
()
Ответ на: комментарий от anonymous

А ведь принцип Лисков в данном случае не выполняется, - не всегда Square можно подставить вместо Rectangle в клиентский код. Если бы мы пользовались этим принципом в том смысле, что описал выше, то не наступили бы на грабли и не экономили бы строчки кода с помощью наследования.

ИМХО, это как раз и означает абсурдность принципа Лисков. Вместо этого нелепого ограничения, надо просто иметь в виду, что клиент должен по разному обрабатывать квадрат и прямоугольник, либо для их обработки используется 2 клиента, и никаких проблем не будет.

callbackhell
() автор топика
Ответ на: комментарий от anonymous

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.