Перейти к основному содержимому

Принцип разделения интерфейсов

Interface Segregation Principle; ISP

к сведению

Клиенты не должны зависеть от методов (или интерфейсов), которые они не используют.

Пример плохого кода

interface IShape {
drawCircle()
drawSquare()
drawRectangle()
}

class Circle implements IShape {
drawCircle() {}
drawSquare() {}
drawRectangle() {}
}
class Square implements IShape {
drawCircle() {}
drawSquare() {}
drawRectangle() {}
}
class Rectangle implements IShape {
drawCircle() {}
drawSquare() {}
drawRectangle() {}
}

Решение

interface ICircle {
drawCircle();
}
interface ISquare {
drawSquare();
}
interface IRectangle {
drawRectangle();
}
class Circle implements ICircle {
drawCircle() {}
}
class Square implements ISquare {
drawSquare() {}
}
class Rectangle implements IRectangle {
drawRectangle() {}
}

Размышления

По всей видимости этот принцип связан с принципом инверсии зависимостей и вот как. Если в модуле нужен какой-то конкретный класс и будет использоваться только его часть, то нужно создать интерфейс, в котором следует описать часть этого класса. И модуль должен требовать на входе объект этого интерфейса.

Ссылки

Принцип Разделения Интерфейса от Сергея Немчинского