Принцип єдиного обов'язку

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Принцип єдиного обов'язку (англ. Single Responsibility Principle, SRP) — важливий принцип об'єктно-орієнтованого програмування, який означає, що клас має бути створений для виконання лише однієї задачі, що має бути повністю інкапсульована. Отже, всі сервіси цього класу мають бути повністю підпорядковані її виконанню. Результатом слідування цій концепції є наявність лише однієї причини для зміни класу, що робить його значно «здоровішим».

Історія[ред.ред. код]

Термін був запроваджений Робертом Мартіном в однойменній статті як частина його принципів об'єктно-орієнтованого програмування, що завоювали популярність завдяки його книзі «Швидка розробка програм. Принципи, приклади, практика». Мартін описав її як засновану на принципі зв'язності, сформульованого Томом ДеМарко в його книзі «Structured Analysis and Systems Specification» [1].

Приклад порушення SRP[ред.ред. код]

Нехай в системі є клас, що представляє в ній робітника:

public class Employee {
   private String name;
   // another fields
 
  public String getName() {
      return name;
  }
  // another methods
 
  public void printReport() {
      // code for printing report
  }
}

Крім цього, існує можливість друкувати звіт про робітника за допомогою методу printReport(). Це і є порушення SRP.

Для прикладу, розглянемо випадок зміни формату звіту. Це змусить програмістів редагувати printReport(), що, можливо, призведе до зміни робочого коду, що відповідає за представлення робітника. Та навпаки, якщо у клас буде додано будь-яка нова функціональність, наприклад поле telNumber, то ці зміни будуть впливати на вміст звіту. А редагуючи вміст, можна зачепити формат звіту.

Очевидно, що проблема полягає в багатоцільовому Employee. Тому її рішення буде наступним — розділити його функціональність, наприклад так:

public class Employee {
   private String name;
   // another fields
 
  public String getName() {
      return name;
  }
  // another methods
}
public class Reporter {
  public void printReport(Employee worker) {
      // code for printing report
  } 
}

Переваги та недоліки[ред.ред. код]

Серед плюсів варто відмітити наступні:

  • протидіє дублюванню коду, адже якщо функціональність розташована в неправильному місці, то доведеться копіювати її в потрібне;
  • зменшує можливість зміни вже відтестованого коду;
  • забезпечує відповідність назв класів та їх функціональності, що полегшує життя тим, хто обслуговуватиме цей код в майбутньому.

Мінус використання полягає в зростанні кількості класів, що приводить до зростання складності системи.

Використання[ред.ред. код]

SOLID — буква «S» означає принцип єдиного обов'язку (англ. Single Responsibility Principle).

Примітки[ред.ред. код]

  1. DeMarco, Tom. (1979). Structured Analysis and System Specification. Prentice Hall. ISBN 0138543801. 

Посилання[ред.ред. код]