Принцип розділення інтерфейсу (англ. Interface Segregation Principle, ISP) — важливий принцип об'єктно-орієнтованого програмування, визначений Робертом Мартіном у такому вигляді:
Клієнти не повинні залежати від методів, які вони не використовують. Оригінальний текст (англ.) The interface-segregation principle (ISP) states that no client should be forced to depend on methods it does not use. |
Отже, даний принцип означає, що занадто «товсті» інтерфейси необхідно розділяти на менші та специфічні, щоб їх клієнти знали лише про ті методи, що необхідні для них у роботі. Як результат, при зміні певного функціоналу, незмінними мають лишитися ті класи, що не використовують його. Тобто виконання цього принципу допомагає системі залишатися гнучкою при внесенні до неї змін та лишатися простою для рефакторингу.
Приклад
Приклад порушення ISP
Для прикладу порушення уявімо собі таку систему:
public interface Animal { void eat(); void fly(); void bark(); }
public class Bird implements Animal { @Override public void eat() { // деяка реалізація } @Override public void fly() { // деяка реалізація } @Override public void bark() { throw new UnsupportedOperationException(); } }
public class Dog implements Animal { @Override public void eat() { // деяка реалізація } @Override public void fly() { throw new UnsupportedOperationException(); } @Override public void bark() { // деяка реалізація } }
Що буде, коли в систему доведеться додавати новий клас, наприклад Cat
? Легко здогадатися, якою буде його реалізація.
Застосування ISP
Виходом з цієї ситуації є використання розділення інтерфейсу. Так званий «товстий» Animal
варто розділити на наступні два інтерфейси: Flyable
та Barkable
.
public interface Animal { void eat(); }
public interface Flyable { void fly(); }
public interface Barkable { void bark(); }
public class Bird implements Animal, Flyable { @Override public void eat() { // деяка реалізація } @Override public void fly() { // деяка реалізація } }
public class Dog implements Animal, Barkable { @Override public void eat() { // деяка реалізація } @Override public void bark() { // деяка реалізація } }
Після застосування такого підходу класи стають «здоровими», з них зникають зайві методи.
ISP та шаблони проектування
Проте інколи складається ситуація, що не дозволяє зробити такий рефакторинг. Тоді варто застосовувати архітектурне рішення, що надає паттерн Адаптер. Система набуває такого вигляду:
public interface Animal { void eat(); void fly(); void bark(); }
public interface Eatable { void eat(); }
public interface Flyable { void fly(); }
public interface Barkable { void bark(); }
public class FlyingAdapter implements Eatable, Flyable { private Animal animal; public FlyingAdapter(Animal animal) { this.animal = animal; } @Override public void fly() { animal.fly(); } @Override public void eat() { animal.eat(); } }
public class BarkingAdapter implements Eatable, Barkable { private Animal animal; public BarkingAdapter(Animal animal) { this.animal = animal; } @Override public void bark() { animal.bark(); } @Override public void eat() { animal.eat(); } }
Наслідки використання цього підходу наступні:
- клієнтський код працює лише з тією функціональністю, яка йому потрібна;
- в той же час, робота відбувається за допомогою сутностей старої системи, що не вимагає в ній будь-яких змін;
- подібний підхід знижує очевидність архітектурних рішень, прочитність коду, і має використовуватись тільки якщо зміна старої системи неможлива з певних причин.
Переваги та недоліки
Серед плюсів варто відзначити наступні:
- при необхідності створення нової реалізації інтерфейсу немає потреби реалізовувати непотрібні методи;
- клієнтський код отримує лише те, що потрібне для його роботи.
Мінус використання полягає в зростанні кількості інтерфейсів, що приводить до зростання складності системи.
Використання
SOLID — буква «I» означає принцип розділення інтерфейсу (англ. Interface Segregation Principle).
Примітки
- Martin, Robert. The Interface Segregation Principle (PS). Архів (PDF) оригіналу за 31 серпня 2012. Процитовано 5 жовтня 2006.
Посилання
- OOP SOLID Rules : Interface Segregation Principle (ISP) [ 23 березня 2013 у Wayback Machine.] (англ.)
- SOLID conclusions with ISP and DIP [ 14 січня 2014 у Wayback Machine.] (англ.)
- Принцип разделения интерфейса [ 21 травня 2013 у Wayback Machine.] (рос.)
- (рос.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Skorochennya ISP takozh maye inshi znachennya Princip rozdilennya interfejsu angl Interface Segregation Principle ISP vazhlivij princip ob yektno oriyentovanogo programuvannya viznachenij Robertom Martinom u takomu viglyadi Kliyenti ne povinni zalezhati vid metodiv yaki voni ne vikoristovuyut Originalnij tekst angl The interface segregation principle ISP states that no client should be forced to depend on methods it does not use Otzhe danij princip oznachaye sho zanadto tovsti interfejsi neobhidno rozdilyati na menshi ta specifichni shob yih kliyenti znali lishe pro ti metodi sho neobhidni dlya nih u roboti Yak rezultat pri zmini pevnogo funkcionalu nezminnimi mayut lishitisya ti klasi sho ne vikoristovuyut jogo Tobto vikonannya cogo principu dopomagaye sistemi zalishatisya gnuchkoyu pri vnesenni do neyi zmin ta lishatisya prostoyu dlya refaktoringu PrikladPriklad porushennya ISP Dlya prikladu porushennya uyavimo sobi taku sistemu public interface Animal void eat void fly void bark public class Bird implements Animal Override public void eat deyaka realizaciya Override public void fly deyaka realizaciya Override public void bark throw new UnsupportedOperationException public class Dog implements Animal Override public void eat deyaka realizaciya Override public void fly throw new UnsupportedOperationException Override public void bark deyaka realizaciya Sho bude koli v sistemu dovedetsya dodavati novij klas napriklad Cat Legko zdogadatisya yakoyu bude jogo realizaciya Zastosuvannya ISP Vihodom z ciyeyi situaciyi ye vikoristannya rozdilennya interfejsu Tak zvanij tovstij Animal varto rozdiliti na nastupni dva interfejsi Flyable ta Barkable public interface Animal void eat public interface Flyable void fly public interface Barkable void bark public class Bird implements Animal Flyable Override public void eat deyaka realizaciya Override public void fly deyaka realizaciya public class Dog implements Animal Barkable Override public void eat deyaka realizaciya Override public void bark deyaka realizaciya Pislya zastosuvannya takogo pidhodu klasi stayut zdorovimi z nih znikayut zajvi metodi ISP ta shabloni proektuvannya Prote inkoli skladayetsya situaciya sho ne dozvolyaye zrobiti takij refaktoring Todi varto zastosovuvati arhitekturne rishennya sho nadaye pattern Adapter Sistema nabuvaye takogo viglyadu public interface Animal void eat void fly void bark public interface Eatable void eat public interface Flyable void fly public interface Barkable void bark public class FlyingAdapter implements Eatable Flyable private Animal animal public FlyingAdapter Animal animal this animal animal Override public void fly animal fly Override public void eat animal eat public class BarkingAdapter implements Eatable Barkable private Animal animal public BarkingAdapter Animal animal this animal animal Override public void bark animal bark Override public void eat animal eat Naslidki vikoristannya cogo pidhodu nastupni kliyentskij kod pracyuye lishe z tiyeyu funkcionalnistyu yaka jomu potribna v toj zhe chas robota vidbuvayetsya za dopomogoyu sutnostej staroyi sistemi sho ne vimagaye v nij bud yakih zmin podibnij pidhid znizhuye ochevidnist arhitekturnih rishen prochitnist kodu i maye vikoristovuvatis tilki yaksho zmina staroyi sistemi nemozhliva z pevnih prichin Perevagi ta nedolikiSered plyusiv varto vidznachiti nastupni pri neobhidnosti stvorennya novoyi realizaciyi interfejsu nemaye potrebi realizovuvati nepotribni metodi kliyentskij kod otrimuye lishe te sho potribne dlya jogo roboti Minus vikoristannya polyagaye v zrostanni kilkosti interfejsiv sho privodit do zrostannya skladnosti sistemi VikoristannyaSOLID bukva I oznachaye princip rozdilennya interfejsu angl Interface Segregation Principle PrimitkiMartin Robert The Interface Segregation Principle PS Arhiv PDF originalu za 31 serpnya 2012 Procitovano 5 zhovtnya 2006 PosilannyaOOP SOLID Rules Interface Segregation Principle ISP 23 bereznya 2013 u Wayback Machine angl SOLID conclusions with ISP and DIP 14 sichnya 2014 u Wayback Machine angl Princip razdeleniya interfejsa 21 travnya 2013 u Wayback Machine ros ros