---
aliases:
  - ISP
tags:
  - maturity/🌱
date: 2024-09-27
---
ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйсов (Interface Segregation Principle, ISP) гласит: ==Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько спСциализированных интСрфСйсов, Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ,== ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставляСт классы Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½Π΅ относящиСся ΠΊ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.  ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ интСрфСйс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ связанности ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠ΄Π°.

**Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ISP слСдуСт:**
- Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ узкоспСциализированныС интСрфСйсы, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Π·Π°Π΄Π°Ρ‡Π°ΠΌ.
- Π˜Π·Π±Π΅Π³Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… интСрфСйсов с мноТСством ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.
- Π”Π΅Π»ΠΈΡ‚ΡŒ интСрфСйсы Π½Π° логичСски связанныС Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

**ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° соблюдСния ISP**
1. **Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ связанности:** Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ зависят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚.
2. **ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Π°Ρ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ:** Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π±Π΅Π· влияния Π½Π° классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ эти измСнСния Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.
3. **Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ тСстирования:** Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΡƒΠ·ΠΊΠΈΡ… интСрфСйсов ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».
4. **Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ:** ЛогичСски Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ интСрфСйсы Π΄Π΅Π»Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ понятным ΠΈ структурированным.
## ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ISP
Рассмотрим интСрфСйс `Worker`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΏΠΈΡ‰ΠΈ:

```java
public interface Worker {
    void work();
    void eat();
}

public class RobotWorker implements Worker {
    @Override
    public void work() {
        // Π ΠΎΠ±ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
    }

    @Override
    public void eat() {
        // Π ΠΎΠ±ΠΎΡ‚ Π½Π΅ Сст β€” Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ISP
        throw new UnsupportedOperationException("Robots do not eat");
    }
}

```

Класс `RobotWorker` Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ `eat`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. Π­Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ISP, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ интСрфСйс содСрТит лишниС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ ΠΊΠΎ всСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ.

Π Π°Π·Π΄Π΅Π»ΠΈΠΌ интСрфСйс Π½Π° Π΄Π²Π° Π±ΠΎΠ»Π΅Π΅ спСциализированных:

```java
public interface Worker {
    void work();
}

public interface Eater {
    void eat();
}

```

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹:

```java
public class HumanWorker implements Worker, Eater {
    @Override
    public void work() {
        // Π§Π΅Π»ΠΎΠ²Π΅ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
    }

    @Override
    public void eat() {
        // Π§Π΅Π»ΠΎΠ²Π΅ΠΊ Сст
    }
}

public class RobotWorker implements Worker {
    @Override
    public void work() {
        // Π ΠΎΠ±ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
    }
}

```
***
## ΠœΠ΅Ρ‚Π° информация
**ΠžΠ±Π»Π°ΡΡ‚ΡŒ**:: [[../../meta/zero/00 АрхитСктура ПО|00 АрхитСктура ПО]]
**Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ**:: [[SOLID]]
**Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ**:: 
**Π‘ΠΎΠ·Π΄Π°Π½Π°**:: [[2024-09-27]]
**Автор**:: 
### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹
- 

### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ, this.file.link) or contains(parents, this.file.link) -->