--- 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]] **Автор**:: ### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - ### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ