Principi de responsabilitat única
El principi de responsabilitat única (SRP) és un principi de programació informàtica que estableix que "un mòdul ha de ser responsable davant d'un i només un actor".[1] El terme actor fa referència a un grup (format per una o més parts interessades o usuaris) que requereix un canvi al mòdul.
Robert C. Martin, l'originador del terme, expressa el principi com: "Una classe només hauria de tenir una raó per canviar".[2] A causa de la confusió al voltant de la paraula "raó", més tard va aclarir el seu significat en una entrada de blog titulada "El principi de responsabilitat única", en què esmentava la separació de preocupacions i afirmava que "Una altra redacció per al principi de responsabilitat única és: Reuneix les coses que canvien per les mateixes raons. Separa les coses que canvien per diferents raons".[3] En algunes de les seves xerrades, també argumenta que el principi tracta, en particular, sobre els rols o actors. Per exemple, tot i que poden ser la mateixa persona, el rol d'un comptable és diferent del d'un administrador de bases de dades. Per tant, cada mòdul hauria de ser responsable de cada rol.[4]
Història
[modifica]El terme va ser introduït per Robert C. Martin al seu article "The Principles of OOD" com a part dels seus Principles of Object Oriented Design (Principis de disseny orientat a objectes),[5] popularitzat pel seu llibre del 2003 Agile Software Development, Principles, Patterns, and Practices (Desenvolupament de programari àgil, principis, patrons i pràctiques). Martin el va descriure com basat en el principi de cohesió, tal com ho descriu Tom DeMarco al seu llibre Structured Analysis and System Specification (Anàlisi estructurada i especificació de sistemes),[6] i Meilir Page-Jones a The Practical Guide to Structured Systems Design (Guia pràctica per al disseny de sistemes estructurats).[7] El 2014, Martin va publicar una entrada de blog titulada "The Single Responsibility Principle" (El principi de responsabilitat única) amb l'objectiu d'aclarir què significava la frase "raó per al canvi".[8]
Exemple
[modifica]Martin defineix una responsabilitat com una raó per canviar, i conclou que una classe o mòdul hauria de tenir una, i només una, raó per ser canviat (per exemple, reescrit).
Com a exemple, considerem un mòdul que compila i imprimeix un informe. Imagineu que aquest mòdul es pot canviar per dos motius. Primer, el contingut de l'informe podria canviar. Segon, el format de l'informe podria canviar. Aquestes dues coses canvien per causes diferents. El principi de responsabilitat única diu que aquests dos aspectes del problema són realment dues responsabilitats separades i, per tant, haurien d'estar en classes o mòduls separats. Seria un mal disseny acoplar dues coses que canvien per motius diferents en moments diferents.
La raó per la qual és important mantenir una classe centrada en una sola preocupació és que fa que la classe sigui més robusta. Continuant amb l'exemple anterior, si hi ha un canvi en el procés de compilació d'informes, hi ha un perill més gran que el codi d'impressió es trenqui si forma part de la mateixa classe.
Referències
[modifica]- ↑ Martin, Robert C. Clean architecture : a craftsman's guide to software structure and design (en anglès), 2018. ISBN 978-0-13-449432-6. OCLC 1003645626.
- ↑ Martin, Robert C. Agile Software Development, Principles, Patterns, and Practices (en anglès). Prentice Hall, 2003, p. 95. ISBN 978-0135974445.
- ↑ Martin, Robert C. «The Single Responsibility Principle» (en anglès). The Clean Code Blog.
- ↑ Robert C. Martin. Clean Architecture: A Craftsman's Guide to Software Structure and Design (en anglès). Prentice Hall, 2018. ISBN 978-0-13-449416-6.
- ↑ Martin, Robert C. «The Principles of OOD» (en anglès). butunclebob.com.
- ↑ DeMarco, Tom. Structured Analysis and System Specification (en anglès). Prentice Hall, 1979. ISBN 0-13-854380-1.
- ↑ Page-Jones, Meilir. The Practical Guide to Structured Systems Design (en anglès). Yourdon Press Computing Series, 1988, p. 82. ISBN 978-8120314825.
- ↑ «Clean Coder Blog» (en anglès). blog.cleancoder.com.