{"id":848,"date":"2023-03-20T20:47:28","date_gmt":"2023-03-20T19:47:28","guid":{"rendered":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/?p=848"},"modified":"2023-03-20T20:47:28","modified_gmt":"2023-03-20T19:47:28","slug":"s-o-l-i-d-2-open-closed-principle-ocp","status":"publish","type":"post","link":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2023\/03\/20\/s-o-l-i-d-2-open-closed-principle-ocp\/","title":{"rendered":"S.O.L.I.D. 2 \u2013 Open\/Closed Principle (OCP)"},"content":{"rendered":"\n<p><span style=\"text-decoration: underline;\">Open\/Closed Principle (OCP) <\/span>\u2013 zasada otwarte-zamkni\u0119te m\u00f3wi o tym, \u017ce:<\/p>\n\n\n\n<p><strong>Klasy (encje) powinny by\u0107 otwarte na rozszerzenia i zamkni\u0119te na modyfikacje.<\/strong><\/p>\n\n\n\n<p>Co to dok\u0142adnie oznacza? W \u017cyciu zmiany s\u0105 pewne. Co za tym idzie, gdy musimy doda\u0107 do aplikacji np. now\u0105 funkcjonalno\u015b\u0107, nie powinno si\u0119 modyfikowa\u0107 kodu ju\u017c istniej\u0105cego. Zamiast tego powinno si\u0119 rozszerza\u0107 aplikacj\u0119, a nie j\u0105 modyfikowa\u0107 np. poprzez dodanie nowej klasy, kt\u00f3ra b\u0119dzie odpowiedzialna za nowy element. Do realizacji tej metody przydatne b\u0119dzie u\u017cywanie polimorfizmu i dziedziczenia.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Przyk\u0142ad:<\/span> Zegarek sportowy (klasa SportWatch) posiada r\u00f3\u017cne aktywno\u015bci do wyboru. Na pocz\u0105tku mamy trzy tryby do wyboru, kt\u00f3re zostaj\u0105 w\u0142\u0105czone w zale\u017cno\u015bci od podanej nazwy aktywno\u015bci.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class SportWatch {\n    public void switchOnMode(String sportMode){\n        switch (sportMode){\n            case \"running\":\n                System.out.println(\"Mode running is active\");\n                break;\n            case \"aerobic\":\n                System.out.println(\"Mode aerobic is active\");\n                break;\n            case \"swimming\":\n                System.out.println(\"Mode swimming is active\");\n                break;\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Co je\u017celi chcieliby\u015bmy doda\u0107 kolejn\u0105 aktywno\u015b\u0107? Trzeba by modyfikowa\u0107 istniej\u0105cy kod o kolejne przypadki. Zamiast tego lepiej u\u017cy\u0107 wsp\u00f3lnego interfejsu Mode z zadeklarowan\u0105 metod\u0105 switchOnMode(), a dla poszczeg\u00f3lnych tryb\u00f3w stworzy\u0107 oddzielne klasy, kt\u00f3re b\u0119d\u0105 implementowa\u0142y interfejs Mode i zast\u0119powa\u0142y metod\u0119 switchOnMode(). W klasie SportWatchOCP wywo\u0142ana zostanie metoda switchOnMode() na odpowiednim podanym trybie.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class SportWatchOCP {\n    private Mode mode;\n    public void switchOnMode(Mode mode){\n        mode.switchOnMode();\n    }\n}\npublic interface Mode {\n    void switchOnMode();\n}\npublic class RunningMode implements Mode{\n    @Override\n    public void switchOnMode() {\n        System.out.println(\"Mode running is active\");\n    }\n}\npublic class SwimmingMode implements Mode{\n    @Override\n    public void switchOnMode() {\n        System.out.println(\"Mode swimming is active\");\n    }\npublic class AerobicMode implements Mode{\n    @Override\n    public void switchOnMode() {\n        System.out.println(\"Mode aerobic is active\");\n    }\n}\npublic class HikingMode implements Mode{\n    @Override\n    public void switchOnMode() {\n        System.out.println(\"Mode hiking is active\");\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Open\/Closed Principle (OCP) \u2013 zasada otwarte-zamkni\u0119te m\u00f3wi o tym, \u017ce: Klasy (encje) powinny by\u0107 otwarte na rozszerzenia i zamkni\u0119te na modyfikacje. Co to dok\u0142adnie oznacza? W \u017cyciu zmiany s\u0105 pewne. Co za tym idzie, gdy musimy doda\u0107 do aplikacji np. now\u0105 funkcjonalno\u015b\u0107, nie powinno si\u0119 modyfikowa\u0107 kodu ju\u017c istniej\u0105cego. Zamiast tego powinno si\u0119 rozszerza\u0107 aplikacj\u0119, &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2023\/03\/20\/s-o-l-i-d-2-open-closed-principle-ocp\/\"> <span class=\"screen-reader-text\">S.O.L.I.D. 2 \u2013 Open\/Closed Principle (OCP)<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[14],"tags":[],"class_list":["post-848","post","type-post","status-publish","format-standard","hentry","category-solid"],"_links":{"self":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=848"}],"version-history":[{"count":1,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/848\/revisions"}],"predecessor-version":[{"id":849,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/848\/revisions\/849"}],"wp:attachment":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}