Remove ads
З Вікіпедії, вільної енциклопедії
Принцип єдиної відповідальності[1] (англ. Single Responsibility Principle, SRP) — важливий принцип об'єктно-орієнтованого програмування, який означає, що клас має бути створений для виконання лише однієї задачі, яку він повинен повністю інкапсулювати. Отже, всі сервіси цього класу мають бути повністю підпорядковані її виконанню.
Роберт Мартін, засновник терміну, висловлює принцип так: «Клас повинен мати лише одну причину для змін»[2], хоча через плутанину навколо слова «причина» він також заявив: «Цей принцип стосується людей»[3]. У деяких своїх виступах він також стверджує, що принцип стосується, зокрема, ролей чи акторів. Наприклад, хоча вони можуть бути однією людиною, роль бухгалтера відрізняється від адміністратора бази даних. Отже, кожен модуль повинен відповідати за кожну роль[1].
Термін був запроваджений Робертом Мартіном в однойменній статті як частина його принципів об'єктно-орієнтованого програмування, що поширився завдяки його книзі «Швидка розробка програм. Принципи, приклади, практика». Мартін описав її як засновану на принципі зв'язності, сформульованого Томом ДеМарко в його книзі «Structured Analysis and Systems Specification»[4].
Нехай в системі є клас, що представляє в ній робітника:
public class Employee {
private String name;
// інші поля
public String getName() {
return name;
}
// інші методи
public void printReport() {
// код для друкування звіту
}
}
Крім цього, існує можливість друкувати звіт про робітника за допомогою методу printReport()
. Це і є порушення SRP.
Для прикладу, розглянемо випадок зміни формату звіту. Це змусить програмістів редагувати printReport()
, що, можливо, призведе до зміни робочого коду, що відповідає за представлення робітника. Та навпаки, якщо у клас буде додано будь-яка нова функціональність, наприклад поле telNumber
, то ці зміни будуть впливати на вміст звіту. А редагуючи вміст, можна зачепити формат звіту.
Очевидно, що проблема полягає в багатоцільовому Employee
. Тому її рішення буде наступним — розділити його функціональність, наприклад так:
public class Employee {
private String name;
// інші поля
public String getName() {
return name;
}
// інші методи
}
public class Reporter {
public void printReport(Employee worker) {
// код для друкування звіту
}
}
Серед плюсів варто відмітити такі:
Мінус використання полягає в зростанні кількості класів, що приводить до зростання складності системи.
SOLID — буква «S» означає принцип єдиного обов'язку (англ. Single Responsibility Principle).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.