{"id":237,"date":"2025-10-12T17:22:26","date_gmt":"2025-10-12T15:22:26","guid":{"rendered":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=237"},"modified":"2025-10-14T08:58:30","modified_gmt":"2025-10-14T06:58:30","slug":"solid-zasada-pojedynczej-odpowiedzialnosci","status":"publish","type":"post","link":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=237","title":{"rendered":"Zasada Pojedynczej Odpowiedzialno\u015bci"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-css-opacity is-style-default\"\/>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-default\"\/>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#f1f5c7\"><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p style=\"font-size:36px;line-height:1.2\"><strong>Definicja<\/strong><\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Zasada pojedynczej odpowiedzialno\u015bci (ang. <em>Single Responsibility Principle<\/em>, SRP) m\u00f3wi, \u017ce <strong>ka\u017cda klasa, modu\u0142 lub funkcja powinna mie\u0107 tylko jeden pow\u00f3d do zmiany<\/strong>. Innymi s\u0142owy \u2013 ka\u017cda cz\u0119\u015b\u0107 kodu powinna zajmowa\u0107 si\u0119 tylko jednym, jasno okre\u015blonym zadaniem. Dzi\u0119ki temu kod staje si\u0119 prostszy, bardziej przejrzysty i \u0142atwiejszy w utrzymaniu.<\/p>\n<\/div>\n<\/div><figure class=\"wp-block-media-text__media\"><img data-opt-id=807734801  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/http:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark.jpg\" alt=\"\" class=\"wp-image-240 size-full\" srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:200\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:512\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1536\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1620\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/Businessmans-hand-holding-question-mark-scaled.jpg 2048w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#fffdea\"><figure class=\"wp-block-media-text__media\"><img data-opt-id=698063826  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"796\" src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:796\/q:mauto\/ig:avif\/http:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230.jpg\" alt=\"\" class=\"wp-image-241 size-full\" srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:796\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:233\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:597\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1388\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1388\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/18230-scaled.jpg 2048w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p style=\"font-size:36px;line-height:1.2\"><strong>Przyk\u0142ad z \u017cycia<\/strong><\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Wyobra\u017amy sobie <strong>fabryk\u0119 prefabrykat\u00f3w \u017celbetowych<\/strong>, kt\u00f3ra produkuje belki i p\u0142yty.<br>Pracownik linii produkcyjnej ma dwa zadania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kontrolowa\u0107 jako\u015b\u0107 element\u00f3w,<\/li>\n\n\n\n<li>oraz przygotowywa\u0107 raporty do dzia\u0142u sprzeda\u017cy.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-extra-small-font-size\">W praktyce to nieefektywne \u2014 je\u015bli pracownik zajmuje si\u0119 wszystkim, mo\u017ce pope\u0142ni\u0107 b\u0142\u0119dy lub spowolni\u0107 proces. Lepiej, aby jedna osoba odpowiada\u0142a <strong>za kontrol\u0119 jako\u015bci<\/strong>, a inna <strong>za raportowanie<\/strong>.<br>To samo dotyczy kodu \u2014 klasa powinna mie\u0107 <strong>jedn\u0105 odpowiedzialno\u015b\u0107<\/strong>, a nie pr\u00f3bowa\u0107 \u201erobi\u0107 wszystkiego naraz\u201d.<\/p>\n<\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:38px;line-height:1.4\"><strong>Przyk\u0142ady przed i po zastosowaniu zasady<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>PRZED<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\">Przyk\u0142ad poni\u017cej przedstawia klas\u0119, kt\u00f3ra <strong>narusza zasad\u0119 SRP<\/strong> \u2014 zajmuje si\u0119 zar\u00f3wno <strong>obliczaniem masy prefabrykatu<\/strong>, jak i <strong>generowaniem raportu<\/strong>.<\/p>\n\n\n\n<p style=\"font-size:18px\">Klasa <code>PrefabElement<\/code> odpowiada <strong>zar\u00f3wno za logik\u0119 obliczeniow\u0105<\/strong>, jak i <strong>za generowanie raportu<\/strong>.<br>Je\u015bli zmieni si\u0119 spos\u00f3b raportowania (np. raport ma by\u0107 zapisywany do pliku CSV zamiast drukowany), trzeba b\u0119dzie zmieni\u0107 klas\u0119, mimo \u017ce nie dotyczy to jej g\u0142\u00f3wnej funkcji (oblicze\u0144).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class PrefabElement {\n    private double length;\n    private double width;\n    private double height;\n    private double density;\n\n\n    public PrefabElement(double length, double width, double height, double density) {\n        this.length = length;\n        this.width = width;\n        this.height = height;\n        this.density = density;\n    }\n\n    public double calculateWeight() {\n\n        return length * width * height * density;\n    }\n\n\n\n    public void generateReport() {\n        double weight = calculateWeight();\n        String report = &quot;Prefab element: &quot; + length + &quot;x&quot; + width + &quot;x&quot; + height + &quot; m\\n&quot;\n                      + &quot;Weight: &quot; + weight + &quot; kg\\n&quot;\n                      + &quot;Report generated for production control.&quot;;\n        System.out.println(report);\n    }\n\n    public static void main(String&#x5B;] args) {\n        PrefabElement beam = new PrefabElement(6.0, 0.3, 0.5, 2500.0);\n        beam.generateReport();\n    }\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-opt-id=1595712512  data-opt-src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up.jpg\"  decoding=\"async\" width=\"1024\" height=\"683\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%201024%20683%22%20width%3D%221024%22%20height%3D%22683%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%221024%22%20height%3D%22683%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" class=\"wp-image-239\" old-srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:683\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:200\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:512\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1536\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1620\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/male-hand-holding-project-plan-statistics-screen-close-up-scaled.jpg 2048w\" \/><figcaption class=\"wp-element-caption\">Designed by Freepik<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p><strong>PO<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\">Po wprowadzeniu zasady SRP rozdzielamy obowi\u0105zki na dwie klasy:<\/p>\n\n\n\n<p>-PrefabElement \u2013 odpowiada tylko za dane i obliczenia,<br>-ReportGenerator \u2013 odpowiada za tworzenie raport\u00f3w.<\/p>\n\n\n\n<p>Teraz ka\u017cda klasa ma <strong>jedn\u0105, jasno okre\u015blon\u0105 odpowiedzialno\u015b\u0107<\/strong>:<\/p>\n\n\n\n<p>-PrefabElement \u2192 obliczenia techniczne,<br>-ReportGenerator \u2192 prezentacja i raportowanie.<\/p>\n\n\n\n<p style=\"font-size:18px\">Je\u015bli w przysz\u0142o\u015bci zmienimy spos\u00f3b generowania raport\u00f3w (np. eksport do PDF), wystarczy zmodyfikowa\u0107 tylko ReportGenerator, a nie dotyka\u0107 logiki oblicze\u0144.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ Klasa odpowiedzialna tylko za dane i obliczenia techniczne\npublic class PrefabElement {\n    private double length;\n    private double width;\n    private double height;\n    private double density;\n\n    public PrefabElement(double length, double width, double height, double density) {\n        this.length = length;\n        this.width = width;\n        this.height = height;\n        this.density = density;\n    }\n\n    public double calculateWeight() {\n        return length * width * height * density;\n    }\n    public double getLength() {\n        return length;\n    }\n    public double getWidth() {\n        return width;\n    }\n    public double getHeight() {\n        return height;\n    }\n}\n\n\/\/ Klasa odpowiedzialna tylko za generowanie raportu\npublic class ReportGenerator {\n    public void generate(PrefabElement element) {\n        double weight = element.calculateWeight();\n        String report = &quot;Prefab element: &quot; + element.getLength() + &quot;x&quot;\n                      + element.getWidth() + &quot;x&quot; + element.getHeight() + &quot; m\\n&quot;\n                      + &quot;Weight: &quot; + weight + &quot; kg\\n&quot;\n                      + &quot;Report generated for production control.&quot;;\n        System.out.println(report);\n    }\n}\n\n\/\/ Klasa g\u0142\u00f3wna \u2013 przyk\u0142ad u\u017cycia\npublic class Main {\n    public static void main(String&#x5B;] args) {\n        PrefabElement beam = new PrefabElement(6.0, 0.3, 0.5, 2500.0);\n        ReportGenerator reporter = new ReportGenerator();\n        reporter.generate(beam);\n    }\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-d2da2050 wp-block-columns-is-layout-flex\" style=\"margin-bottom:0\">\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-b46530bdbb5d9ad44ce9d18ec1dfd19e is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Kiedy zasada jest wa\u017cna?<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-css-opacity has-background is-style-wide\" style=\"background-color:#000000;color:#000000\"\/>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>projekt ro\u015bnie i wiele os\u00f3b pracuje nad kodem,<\/li>\n\n\n\n<li>wprowadzane s\u0105 cz\u0119ste zmiany w r\u00f3\u017cnych aspektach systemu (np. obliczenia, raportowanie, logowanie).<\/li>\n\n\n\n<li><strong>Nie zawsze<\/strong> jednak warto rozbija\u0107 wszystko na drobne klasy \u2014 czasem proste skrypty lub prototypy mog\u0105 by\u0107 bardziej praktyczne w formie jednej klasy.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-13d536f1154525457aa0b1cd5a318c31 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Na co zwraca\u0107 uwag\u0119:<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>Czy klasa ma wi\u0119cej ni\u017c jeden pow\u00f3d, by si\u0119 zmieni\u0107?<\/li>\n\n\n\n<li>Czy zmiana w jednym obszarze (np. raportowanie) nie wp\u0142ywa na inny (np. obliczenia)?<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-bc44444f19b66668fbe7a8af72d5ea56 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"has-normal-font-size\"><strong>Trudno\u015bci:<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>Pocz\u0105tkuj\u0105cy cz\u0119sto pr\u00f3buj\u0105 \u201enadmiernie rozdziela\u0107\u201d klasy, co prowadzi do zbyt du\u017cej liczby plik\u00f3w i komplikacji.<\/li>\n\n\n\n<li>Wa\u017cna jest r\u00f3wnowaga mi\u0119dzy czysto\u015bci\u0105 kodu a jego praktyczno\u015bci\u0105.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Przyk\u0142ady przed i po zastosowaniu zasady PRZED Przyk\u0142ad poni\u017cej przedstawia klas\u0119, kt\u00f3ra narusza zasad\u0119 SRP \u2014 zajmuje si\u0119 zar\u00f3wno obliczaniem masy prefabrykatu, jak i generowaniem raportu. Klasa PrefabElement odpowiada zar\u00f3wno za logik\u0119 obliczeniow\u0105, jak i za generowanie raportu.Je\u015bli zmieni si\u0119 spos\u00f3b raportowania (np. raport ma by\u0107 zapisywany do pliku CSV zamiast drukowany), trzeba b\u0119dzie zmieni\u0107 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":247,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-237","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-solid"],"_links":{"self":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=237"}],"version-history":[{"count":6,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":293,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions\/293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/media\/247"}],"wp:attachment":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}