{"id":248,"date":"2025-10-13T20:50:42","date_gmt":"2025-10-13T18:50:42","guid":{"rendered":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=248"},"modified":"2025-10-14T13:27:31","modified_gmt":"2025-10-14T11:27:31","slug":"open-close-principle","status":"publish","type":"post","link":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/?p=248","title":{"rendered":"Open Close Principle"},"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 otwarte\/zamkni\u0119te (ang. <em>Open\/Closed Principle<\/em>, OCP) m\u00f3wi, \u017ce <strong>klasy, modu\u0142y i funkcje powinny by\u0107 otwarte na rozszerzenia, ale zamkni\u0119te na modyfikacje<\/strong>.<br>Oznacza to, \u017ce je\u015bli chcemy doda\u0107 now\u0105 funkcjonalno\u015b\u0107, powinni\u015bmy m\u00f3c to zrobi\u0107 <strong>bez zmieniania istniej\u0105cego kodu<\/strong>, tylko poprzez jego <strong>rozszerzenie<\/strong> \u2013 np. przez dziedziczenie lub implementacj\u0119 interfejsu.<\/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=1112686758  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:640\/q:mauto\/ig:avif\/http:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859.jpg\" alt=\"\" class=\"wp-image-213 size-full\" srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:1024\/h:640\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859-scaled.jpg 1024w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:300\/h:188\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859-scaled.jpg 300w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:768\/h:480\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1536\/h:960\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859-scaled.jpg 1536w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:1728\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/9859-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 <\/strong>W fabryce prefabrykat\u00f3w istnieje linia produkcyjna, kt\u00f3ra mo\u017ce wytwarza\u0107 r\u00f3\u017cne elementy: belki, p\u0142yty i s\u0142upy.<br>Na pocz\u0105tku proces sterowania maszyn\u0105 by\u0142 przygotowany tylko dla <strong>belek<\/strong>. Gdy pojawi\u0142a si\u0119 potrzeba produkcji p\u0142yt, trzeba by\u0142o <strong>zmienia\u0107 oryginalny kod programu steruj\u0105cego<\/strong>, co grozi\u0142o wprowadzeniem b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p class=\"has-extra-small-font-size\">Lepszym rozwi\u0105zaniem jest stworzenie systemu, kt\u00f3ry mo\u017cna <strong>rozszerzy\u0107 o nowe typy prefabrykat\u00f3w<\/strong>, bez ingerowania w ju\u017c dzia\u0142aj\u0105cy kod. Ka\u017cdy nowy typ elementu ma wtedy w\u0142asny modu\u0142 produkcyjny, kt\u00f3ry wpasowuje si\u0119 w istniej\u0105c\u0105 struktur\u0119.<\/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\">Poni\u017cszy przyk\u0142ad \u0142amie zasad\u0119 OCP \u2014 ka\u017cdorazowe dodanie nowego typu prefabrykatu wymaga modyfikacji klasy <code>ProductionController<\/code>.<\/p>\n\n\n\n<p style=\"font-size:18px\">Aby doda\u0107 np. <strong>s\u0142up prefabrykowany<\/strong>, trzeba otworzy\u0107 klas\u0119 i <strong>doda\u0107 kolejny warunek<\/strong> <code>elif element_type == \"column\": ...<\/code>.<br>Z czasem taka klasa staje si\u0119 trudna w utrzymaniu i podatna na b\u0142\u0119dy.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class ProductionController {\n\n    public void produce(String elementType) {\n        if (elementType.equals(&quot;beam&quot;)) {\n            System.out.println(&quot;Producing reinforced concrete beam...&quot;);\n        } else if (elementType.equals(&quot;slab&quot;)) {\n            System.out.println(&quot;Producing reinforced concrete slab...&quot;);\n        } else {\n            System.out.println(&quot;Unknown element type!&quot;);\n        }\n    }\n\n    public static void main(String&#x5B;] args) {\n        ProductionController controller = new ProductionController();\n        controller.produce(&quot;beam&quot;);\n        controller.produce(&quot;slab&quot;);\n        controller.produce(&quot;column&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-opt-id=1288992575  data-opt-src=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:681\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2.jpg\"  decoding=\"async\" width=\"681\" height=\"1024\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20681%201024%22%20width%3D%22681%22%20height%3D%221024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22681%22%20height%3D%221024%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" class=\"wp-image-302\" old-srcset=\"https:\/\/mlb55nihrfbl.i.optimole.com\/w:681\/h:1024\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 681w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:200\/h:300\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 200w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:718\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 768w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:718\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 1022w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:718\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 1363w, https:\/\/mlb55nihrfbl.i.optimole.com\/w:718\/h:1080\/q:mauto\/ig:avif\/https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/wp-content\/uploads\/2025\/10\/brutalist-inspiration-architecture-background2-scaled.jpg 1704w\" \/><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 zastosowaniu zasady OCP rozdzielamy odpowiedzialno\u015bci i umo\u017cliwiamy <strong>rozszerzanie funkcjonalno\u015bci bez modyfikacji istniej\u0105cego kodu<\/strong>.<\/p>\n\n\n\n<p>Teraz je\u015bli chcemy doda\u0107 nowy element, np. <strong>s\u0142up<\/strong>, wystarczy utworzy\u0107 now\u0105 klas\u0119. I mo\u017cna j\u0105 natychmiast u\u017cy\u0107 \u2014 bez modyfikowania <code>ProductionController<\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ Klasa bazowa (abstrakcyjna)\nabstract class PrefabElement {\n    public abstract void produce();\n}\n\n\/\/ Klasa reprezentuj\u0105ca belk\u0119 prefabrykowan\u0105\nclass Beam extends PrefabElement {\n    @Override\n    public void produce() {\n        System.out.println(&quot;Producing reinforced concrete beam...&quot;);\n    }\n}\n\n\/\/ Klasa reprezentuj\u0105ca p\u0142yt\u0119 prefabrykowan\u0105\nclass Slab extends PrefabElement {\n    @Override\n    public void produce() {\n        System.out.println(&quot;Producing reinforced concrete slab...&quot;);\n    }\n}\n\n\/\/ Kontroler produkcji \u2013 dzia\u0142a z dowolnym prefabrykatem\nclass ProductionController {\n    private PrefabElement element;\n\n    public ProductionController(PrefabElement element) {\n        this.element = element;\n    }\n\n    public void runProduction() {\n        element.produce();\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 Beam();\n        PrefabElement slab = new Slab();\n\n        ProductionController controller1 = new ProductionController(beam);\n        controller1.runProduction();\n\n        ProductionController controller2 = new ProductionController(slab);\n        controller2.runProduction();\n    }\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:38px;line-height:1.4\"><\/h2>\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-028cd913ca84dd2fe609db1130aa0e68 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<p>Zasada otwarte\/zamkni\u0119te jest kluczowa, gdy system ma <strong>rosn\u0105\u0107<\/strong> lub <strong>obs\u0142ugiwa\u0107 r\u00f3\u017cne warianty element\u00f3w prefabrykowanych<\/strong> (np. r\u00f3\u017cne typy zbroje\u0144, form, betonu).<br>Dzi\u0119ki niej mo\u017cemy \u0142atwo dodawa\u0107 nowe typy operacji lub produkt\u00f3w, nie ryzykuj\u0105c zepsucia dzia\u0142aj\u0105cego kodu.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-5ef65f1dace9a746da1d4414a6ace952 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>Aby kod by\u0142 \u0142atwy do rozszerzenia przez dziedziczenie lub interfejsy,<\/li>\n\n\n\n<li>Aby unika\u0107 rozbudowanych instrukcji <code>if<\/code> i <code>switch<\/code>, kt\u00f3re \u0142ami\u0105 zasad\u0119 OCP.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-d41747f93df5ada78bff3b21001990d7 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 \u201enadmiernie abstrakcyjnie\u201d projektuj\u0105 kod, co utrudnia jego zrozumienie,<\/li>\n\n\n\n<li>Nale\u017cy znale\u017a\u0107 balans mi\u0119dzy elastyczno\u015bci\u0105 a prostot\u0105 \u2013 OCP nie oznacza, \u017ce ka\u017cda funkcja wymaga osobnej klasy.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Przyk\u0142ady przed i po zastosowaniu zasady PRZED Poni\u017cszy przyk\u0142ad \u0142amie zasad\u0119 OCP \u2014 ka\u017cdorazowe dodanie nowego typu prefabrykatu wymaga modyfikacji klasy ProductionController. Aby doda\u0107 np. s\u0142up prefabrykowany, trzeba otworzy\u0107 klas\u0119 i doda\u0107 kolejny warunek elif element_type == &#8222;column&#8221;: &#8230;.Z czasem taka klasa staje si\u0119 trudna w utrzymaniu i podatna na b\u0142\u0119dy. PO Po zastosowaniu zasady [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":249,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-248","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\/248","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=248"}],"version-history":[{"count":9,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/248\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/248\/revisions\/303"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/media\/249"}],"wp:attachment":[{"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ewelina-beben.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}