Принцип єдиної відповідальності (англ. Single Responsibility Principle, SRP) — важливий принцип об'єктно-орієнтованого програмування, який означає, що клас має бути створений для виконання лише однієї задачі, яку він повинен повністю інкапсулювати. Отже, всі сервіси цього класу мають бути повністю підпорядковані її виконанню.
Роберт Мартін, засновник терміну, висловлює принцип так: «Клас повинен мати лише одну причину для змін», хоча через плутанину навколо слова «причина» він також заявив: «Цей принцип стосується людей». У деяких своїх виступах він також стверджує, що принцип стосується, зокрема, ролей чи акторів. Наприклад, хоча вони можуть бути однією людиною, роль бухгалтера відрізняється від адміністратора бази даних. Отже, кожен модуль повинен відповідати за кожну роль.
Історія
Термін був запроваджений Робертом Мартіном в однойменній статті як частина його принципів об'єктно-орієнтованого програмування, що поширився завдяки його книзі «Швидка розробка програм. Принципи, приклади, практика». Мартін описав її як засновану на принципі зв'язності, сформульованого Томом ДеМарко в його книзі «Structured Analysis and Systems Specification».
Приклад порушення SRP
Нехай в системі є клас, що представляє в ній робітника:
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).
Див. також
Примітки
- Мартін, Роберт (2019). Розділ 13. Зв'язність компонентів: Принцип узгодженої зміни. Чиста архітектура: Мистецтво розроблення програмного забезпечення. «Ранок», Фабула. с. 125—126. ISBN .
- Мартін, Роберт (2021). Чистий Agile. «Ранок», Фабула. с. 224. ISBN .
- Martin, Robert C. (2014). The Single Responsibility Principle. The Clean Code Blog. оригіналу за 8 жовтня 2018. Процитовано 6 листопада 2021.
- DeMarco, Tom. (1979). Structured Analysis and System Specification. Prentice Hall. ISBN .
Посилання
- (рос.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Princip yedinoyi vidpovidalnosti angl Single Responsibility Principle SRP vazhlivij princip ob yektno oriyentovanogo programuvannya yakij oznachaye sho klas maye buti stvorenij dlya vikonannya lishe odniyeyi zadachi yaku vin povinen povnistyu inkapsulyuvati Otzhe vsi servisi cogo klasu mayut buti povnistyu pidporyadkovani yiyi vikonannyu Robert Martin zasnovnik terminu vislovlyuye princip tak Klas povinen mati lishe odnu prichinu dlya zmin hocha cherez plutaninu navkolo slova prichina vin takozh zayaviv Cej princip stosuyetsya lyudej U deyakih svoyih vistupah vin takozh stverdzhuye sho princip stosuyetsya zokrema rolej chi aktoriv Napriklad hocha voni mozhut buti odniyeyu lyudinoyu rol buhgaltera vidriznyayetsya vid administratora bazi danih Otzhe kozhen modul povinen vidpovidati za kozhnu rol IstoriyaTermin buv zaprovadzhenij Robertom Martinom v odnojmennij statti yak chastina jogo principiv ob yektno oriyentovanogo programuvannya sho poshirivsya zavdyaki jogo knizi Shvidka rozrobka program Principi prikladi praktika Martin opisav yiyi yak zasnovanu na principi zv yaznosti sformulovanogo Tomom DeMarko v jogo knizi Structured Analysis and Systems Specification Priklad porushennya SRPNehaj v sistemi ye klas sho predstavlyaye v nij robitnika public class Employee private String name inshi polya public String getName return name inshi metodi public void printReport kod dlya drukuvannya zvitu Krim cogo isnuye mozhlivist drukuvati zvit pro robitnika za dopomogoyu metodu printReport Ce i ye porushennya SRP Dlya prikladu rozglyanemo vipadok zmini formatu zvitu Ce zmusit programistiv redaguvati printReport sho mozhlivo prizvede do zmini robochogo kodu sho vidpovidaye za predstavlennya robitnika Ta navpaki yaksho u klas bude dodano bud yaka nova funkcionalnist napriklad pole telNumber to ci zmini budut vplivati na vmist zvitu A redaguyuchi vmist mozhna zachepiti format zvitu Ochevidno sho problema polyagaye v bagatocilovomu Employee Tomu yiyi rishennya bude nastupnim rozdiliti jogo funkcionalnist napriklad tak public class Employee private String name inshi polya public String getName return name inshi metodi public class Reporter public void printReport Employee worker kod dlya drukuvannya zvitu Perevagi ta nedolikiSered plyusiv varto vidmititi taki protidiye dublyuvannyu kodu adzhe yaksho funkcionalnist roztashovana v nepravilnomu misci to dovedetsya kopiyuvati yiyi v potribne zmenshuye mozhlivist zmini vzhe viprobuvanogo kodu zabezpechuye vidpovidnist nazv klasiv ta yih funkcionalnosti sho polegshuye zhittya tim hto obslugovuvatime cej kod v majbutnomu Minus vikoristannya polyagaye v zrostanni kilkosti klasiv sho privodit do zrostannya skladnosti sistemi VikoristannyaSOLID bukva S oznachaye princip yedinogo obov yazku angl Single Responsibility Principle Div takozhLancyuzhok vidpovidalnostej GRASPPrimitkiMartin Robert 2019 Rozdil 13 Zv yaznist komponentiv Princip uzgodzhenoyi zmini Chista arhitektura Mistectvo rozroblennya programnogo zabezpechennya Ranok Fabula s 125 126 ISBN 978 617 09 5286 8 Martin Robert 2021 Chistij Agile Ranok Fabula s 224 ISBN 978 617 09 6760 2 Martin Robert C 2014 The Single Responsibility Principle The Clean Code Blog originalu za 8 zhovtnya 2018 Procitovano 6 listopada 2021 DeMarco Tom 1979 Structured Analysis and System Specification Prentice Hall ISBN 0138543801 Posilannya ros