ISP
#программирование

SOLID. Что значит I

I в аббревиатуре SOLID расшифровывается как Interface Segregation Principle, он же Принцип Разделения Интерфейсов. На мой взгляд, это самый простой из принципов SOLID, и сегодня мы о нем поговорим. Как обычно, разберем ISP на примере и посмотрим, что случится, если этим принципом пренебречь.

I – Interface Segregation Principle, он же ISP

Роберт Мартин в свое время провозгласил: «Программные сущности не должны зависеть от методов, которые они не используют».

Все программные сущности тех времен:

Краткое и поверхностное описание принципа разделения интерфейсов можно найти на википедии.

Суть проблемы

Проблема заключалась в том, что в былые времена еще не было большого количества хороших практик, и каждый программист (или команда программистов) писал код так, как умеет. Если результат работал – все были рады.

А затем умные дядьки вроде Мартина, Фаулера, и Макконнелла начали задумываться над тем, как сделать результат не просто рабочим, но и эффективным. И, следовательно, необходимо было научиться писать удобный и легкий в сопровождении код.

Но я немного отвлекся. Проблема «толстых» интерфейсов заключалась в том, что они содержали множество методов на все случаи жизни. А классы, которые эти интерфейсы реализовывали, нуждались лишь в некоторых методах, в то время как в остальных не было никакой нужды.

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

И тогда Роберта Мартина осенило: «А что, если делать интерфейсы маленькими?»

Роберт Мартин, когда придумал принцип разделения интерфейсов
ISP на примере

На мой взгляд, принцип разделения интерфейсов очень сильно коррелирует с принципом единой ответственности. Поэтому давайте возьмем пример из поста про SRP и рассмотрим его в контексте ISP.

Итак, представьте, что есть некий интерфейс, который описывает сотрудника компании:

interface Employee {}

Чем может заниматься сотрудник? Это зависит от профиля, но в общем случае сотрудник может заниматься чем угодно: вести бухгалтерию, писать программный код или мыть полы. Если мы добавим эти три метода в наш интерфейс, мы получим фуллстек-разработчика:

interface Employee {
  void account(); // вести бухгалтерию
  void writeCode(); // писать код
  void cleanUp();  // прибраться
}

Допустим, мы хотим создать класс SoftwareEngineer, который определит реализацию метода writeCode:

public class SoftwareEngineer implements Employee {
  @Override
  public void writeCode() {
    // Реализация метода
  }
}

Вроде бы все нормально – наш класс разработчика реализует интерфейс Employee и определяет реализацию метода writeCode. Но ведь интерфейс содержит еще два метода, которым тоже необходимо задать реализацию, верно? И, так как разработчик понятия не имеет, как вести бухгалтерию, а полы мыть не может, потому что у него лапки, то класс SoftwareEngineer в конечном итоге будет выглядеть как-то так:

public class SoftwareEngineer implements Employee {
  @Override
  public void writeCode() {
    // Реализация метода
  }

  @Override
  public void account() {
    throw new UnsupportedOperationException("Разработчик не умеет вести бухгалтерию");
  }

  @Override
  public void cleanUp() {
    throw new UnsupportedOperationException("У разработчика лапки");
  }
}

Возникает вполне логичный вопрос – а можно ли как-то избавиться от двух лишних методов в классе SoftwareEngineer и оставить только единственно необходимый?

И Роберт Мартин говорит, что да, черт возьми, можно!

ISP в деле

Мы хотим, чтобы наш класс SoftwareEngineer определял только один метод и не содержал ничего лишнего, как в примере выше:

public class SoftwareEngineer implements Employee {
  @Override
  public void writeCode() {
    // Реализация метода
  }
}

Для этого нам нужно определить интерфейс SoftwareEngineer с единственным методом:

interface SoftwareEngineer {
  void writeCode();
}

Теперь мы можем создать три разных класса (джуниор, миддл и сениор разработчики), которые реализуют writeCode по-разному:

public class JuniorSoftwareEngineer implements SoftwareEngineer {
  @Override
  public void writeCode() {
    // долго думать над задачей
    // задавать много вопросов
    // написать корявый код с багами
  }
}

public class MiddleSoftwareEngineer implements SoftwareEngineer {
  @Override
  public void writeCode() {
    // задать пару вопросов
    // понять как и зачем делать задачу
    // написать рабочий код
    // покрыть код тестами
  }
}

public class SeniorSoftwareEngineer implements SoftwareEngineer {
  @Override
  public void writeCode() {
    // подумать, зачем это делать
    // сказать, что тут не надо ничего менять, а заказчик дурак
  }
}

Аналогично с бухгалтерией и уборкой. Пусть у нас будет базовый интерфейс Cleaner и две реализации – молодая уборщица и опытная уборщица:

interface Cleaner {
  void cleanUp();
}

public class YoungCleaner implements Cleaner {
  @Override
  public void cleanUp() {
    // строить глазки
    // смахнуть пыль
  }
}

public class ExperiencedCleaner implements Cleaner {
  @Override
  public void cleanUp() {
    // ворчать
    // тщательно прибраться
  }
}
Что в итоге

С помощью ISP мы получим правильно и логично разделенные интерфейсы. Если мы хотим объявить, что интерфейс нужен для написания кода, то мы добавим в него только метод написания кода. Мы не станем туда добавлять ничего связанного с уборкой помещения. И наоборот – если мы создаем интерфейс для уборки помещения, мы не добавляем в него методы, связанные с кодом или бухгалтерией.

Все это поможет нашим классам быть максимально компактными и эффективно решать поставленные задачи.

Заключение

Когда вы описываете интерфейс, тщательно продумайте, какие операции он должен декларировать. Относятся ли все операции к одной области? Или же интерфейс необходимо разделить?

Конечно, вовсе необязательно делить интерфейсы настолько, чтобы они содержали по одному методу. Например, наш SoftwareEngineer мог бы иметь еще пару методов: refactor(), writeUnitTest(), makeReview(). Все эти методы описывают работу разработчика. Но если вы захотите добавить в интерфейс SoftwareEngineer метод cleanOffice(), то остановитесь и спросите себя, относится ли этот метод к работе разработчика? Стоит ли вынести его в отдельный интерфейс?

Не огорчайте Дядюшку Боба, создавайте проработанные и конкретные интерфейсы!

Предыдущие статьи из цикла SOLID:
S: https://baddev.ru/solid-srp/
O: https://baddev.ru/solid-ocp/
L: https://baddev.ru/solid-lsp/

Понравилось? Подписывайтесь на меня в соцсетях!

 
Twitter
VK
guest
64 Комментариев
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback
4 месяцев назад

MasumINTL

[…]usually posts some quite intriguing stuff like this. If you’re new to this site[…]

trackback
URL
4 месяцев назад

… [Trackback]

[…] Read More: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] Read More Info here on that Topic: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] Read More here on that Topic: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] Find More here on that Topic: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] There you can find 82625 more Information to that Topic: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] Information to that Topic: baddev.ru/solid-isp/ […]

trackback
4 месяцев назад

… [Trackback]

[…] Read More here on that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Find More Info here to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Info to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Find More to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Here you can find 58831 more Info on that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Find More Information here on that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Info on that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Find More Info here to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Read More to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Find More to that Topic: baddev.ru/solid-isp/ […]

trackback
3 месяцев назад

… [Trackback]

[…] Read More to that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] There you can find 95346 more Info to that Topic: baddev.ru/solid-isp/ […]

trackback

… [Trackback]

[…] Read More Information here on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Here you can find 72351 more Info on that Topic: baddev.ru/solid-isp/ […]

trackback

… [Trackback]

[…] Info on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Information on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Info on that Topic: baddev.ru/solid-isp/ […]

trackback

… [Trackback]

[…] Information on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More Info here on that Topic: baddev.ru/solid-isp/ […]

trackback

… [Trackback]

[…] Information to that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More to that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More on to that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Read More Information here on that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More on to that Topic: baddev.ru/solid-isp/ […]

trackback
2 месяцев назад

… [Trackback]

[…] Find More to that Topic: baddev.ru/solid-isp/ […]

GenIPTV Provider
2 месяцев назад

The Best Premium IPTV Service WorldWide!

trackback
1 месяц назад

… [Trackback]

[…] There you will find 14443 additional Info on that Topic: baddev.ru/solid-isp/ […]

Jamison Mckay
1 месяц назад

Very interesting subject , regards for posting . «Education a debt due from present to future generations.» by George Peabody.

trackback

… [Trackback]

[…] Here you can find 80614 more Information on that Topic: baddev.ru/solid-isp/ […]

우리카지노
1 месяц назад

Keep up the good piece of work, I read few blog posts on this web site and I believe that your website is really interesting and contains circles of great info .

자세히 보기
1 месяц назад

I loved as much as you’ll receive carried out right here. The sketch is tasteful, your authored material stylish. nonetheless, you command get bought an nervousness over that you wish be delivering the following. unwell unquestionably come more formerly again as exactly the same nearly very often inside case you shield this increase.

trackback
1 месяц назад

… [Trackback]

[…] Find More Information here to that Topic: baddev.ru/solid-isp/ […]

Eldon Tucker
1 месяц назад

Whats up very cool web site!! Guy .. Beautiful .. Wonderful .. I’ll bookmark your site and take the feeds additionally…I’m satisfied to find numerous useful information right here within the put up, we want work out more techniques in this regard, thank you for sharing.

Garth Ibarra
1 месяц назад

My brother recommended I might like this web site. He was totally right. This post actually made my day. You cann’t imagine just how much time I had spent for this info! Thanks!

nondescript
1 месяц назад

oMbIZ6E8a68

nominativally
1 месяц назад

LJEPXS1zoF0

pearwoods
1 месяц назад

nDlNCh5haHG

trackback
7 дней назад

esports domains

[…]that could be the end of this article. Right here you’ll obtain some internet sites that we assume you’ll enjoy, just click the hyperlinks over[…]

trackback
5 дней назад

french bulldog texas

[…]we came across a cool internet site that you just could take pleasure in. Take a appear in the event you want[…]

trackback
5 дней назад

designer dogs

[…]we came across a cool web-site that you simply could enjoy. Take a search in the event you want[…]

trackback
5 дней назад

isla mujeres golf cart rental

[…]always a massive fan of linking to bloggers that I enjoy but do not get a lot of link adore from[…]

trackback
5 дней назад

floodle puppies for sale

[…]the time to read or take a look at the content material or web sites we have linked to below the[…]

Social media & sharing icons powered by UltimatelySocial
64
0
Нравится? Оставьте комментарий!x
()
x