Разница между принципом замещения Лискова и принципом сегрегации интерфейса - PullRequest
0 голосов
/ 01 февраля 2019

Есть ли принципиальная разница между принципом замены Лискова (LSP) и принципом разделения интерфейса (ISP)?В конечном счете, оба ручаются за разработку интерфейса с общими функциями и вводят новый интерфейс, когда у вас есть специальное назначение функций.

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

LSP (подстановка Лискова): проблема: у вас есть переопределенный неиспользуемый / пустой метод в дочернем элементе, другими словами, ваш дочерний элемент расширяет поведение и ему это не нужно: например:

/// LSP против ISP

class Animal {
    func fly() {
        // TODO: flying logic
    }

    func eat() {
        // TODO: eating logic
    }
}

class Cat: Animal {
    override func fly() {
        //Hi I'm a cat I cant fly,
        ///here is the Breaking of LSP, I have a different behavior
    }
}

ISP (разделение интерфейса): у вас уже есть интерфейс со многими обязанностями, и разработчику не нужны все эти вещи, поэтому вам нужно разбить эти методы и перегруппировать ихв реляционное поведение

//this is bad, why, cause it have two different responsibilities
protocol Animal {
    func fly()
    func eat()
}
//to it write
protocol Flyable {
    func fly()
}
protocol Feedable {
    func eat()
}
0 голосов
/ 03 февраля 2019

LSP: получатель должен выполнить обещанные им контракты.

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

Где он подходит: если вы подаете заявкупровайдер, вы используете только часть полного интерфейса получателя.Но согласно LSP, получатель все еще должен соблюдать этот фрагмент.

Если вы не можете применить ISP, может возникнуть искушение нарушить LSP.Потому что «этот метод не имеет значения, он на самом деле не будет вызван».

...