{"id":749,"date":"2023-12-27T21:37:34","date_gmt":"2023-12-27T20:37:34","guid":{"rendered":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=749"},"modified":"2024-01-16T11:23:20","modified_gmt":"2024-01-16T10:23:20","slug":"solid-zasada-odwrocenia-zaleznosci","status":"publish","type":"post","link":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=749","title":{"rendered":"SOLID &#8211; Zasada odwr\u00f3cenia zale\u017cno\u015bci"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"749\" class=\"elementor elementor-749\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c08b1d5 elementor-section-stretched elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"c08b1d5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-37dedc5\" data-id=\"37dedc5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-dd57936 elementor-widget__width-initial elementor-widget elementor-widget-qi_addons_for_elementor_section_title\" data-id=\"dd57936\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"qi_addons_for_elementor_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-qi-section-title  qodef-decoration--italic  qodef-link--underline-draw qodef-subtitle-icon--left\">\n\t\t\t\t\t\t<h2 class=\"qodef-m-title\">\n\t\tSOLID - Zasada odwracania zale\u017cno\u015bci\t<\/h2>\n\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4dd58a5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4dd58a5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0320584\" data-id=\"0320584\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8874aab elementor-widget elementor-widget-text-editor\" data-id=\"8874aab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Ostatnia zasada akronimu SOLID, r\u00f3wnie wa\u017cna jak pozosta\u0142e. Zmniejsza zale\u017cno\u015b\u0107 mi\u0119dzy modu\u0142ami, czym znacznie u\u0142atwia rozszerzanie i modyfikowanie kodu.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48a350c elementor-widget elementor-widget-text-editor\" data-id=\"48a350c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=695\"><strong>S\u00a0 <\/strong>&#8211; Zasada pojedynczej odpowiedzialno\u015bci (Single Responsibility Principle &#8211; SRP)<\/a><\/p><p><a href=\"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=704\"><strong>O<\/strong>\u00a0 &#8211; Zasada otwarte-zamkni\u0119te (Open-Close Principle &#8211; OCP)<\/a><\/p><p><a href=\"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=724\"><strong>L<\/strong> &#8211; Zasada podstawiania Liskov (Liskov Substitution Principle &#8211; LSP)<\/a><\/p><p><a href=\"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=735\"><strong>I<\/strong> &#8211; Zasada Segregacji interfejsu (Interface Segregation Principle &#8211; ISP)<\/a><\/p><p><strong>D &#8211; Zasada odwracania zale\u017cno\u015bci (Dependency Inversion Principle &#8211; DIP)<\/strong><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b267b1d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b267b1d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-aaada21\" data-id=\"aaada21\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c2eb44f elementor-widget elementor-widget-heading\" data-id=\"c2eb44f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Definicja<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c24b0c elementor-widget elementor-widget-text-editor\" data-id=\"0c24b0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Kod z warstw z wy\u017cszego poziomu nie powinien zale\u017ce\u0107 od tego z ni\u017cszego poziomu. Za to obie wartstwy powinny zale\u017ce\u0107 od abstrakcji.<\/p><p>Z drugiej strony abstrakcje nie powinny zale\u017ce\u0107 od konkretnej implementacji, czyli szczeg\u00f3\u0142\u00f3w zawartych w obu warstwach.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2b602f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2b602f5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-972f325\" data-id=\"972f325\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-67bf703 elementor-widget elementor-widget-heading\" data-id=\"67bf703\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9f26e36 elementor-widget elementor-widget-text-editor\" data-id=\"9f26e36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Stworzymy klas\u0119\/modu\u0142 wysokiego poziomu, kt\u00f3ra b\u0119dzie odpowiedzialna za obs\u0142ug\u0119 zam\u00f3wienia i zapisywanie ich do bazy danych.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c0717c elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"6c0717c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>class OrderService {\n  private Database database;\n\n  public OrderService() {\n    this.database = new Database();\n  }\n\n  public void saveOrder(Order order) {\n    database.insert(order);\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5eb7269 elementor-widget elementor-widget-text-editor\" data-id=\"5eb7269\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nast\u0119pnie stworzymy klas\u0119, reprezentuj\u0105c\u0105 modu\u0142 niskiego poziomu odpowiedzialn\u0105 za dost\u0119p do danych, kt\u00f3ra b\u0119dzie wykonywa\u0107 operacje wstawiania zam\u00f3wien do bazy danych.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d932604 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"d932604\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>class Database {\n  public void insert(Object object) {\n    \/\/ logika dost\u0119pu do bazy danych\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e2a9db9 elementor-widget elementor-widget-text-editor\" data-id=\"e2a9db9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W powy\u017cszym przyk\u0142adzie klasa OrderService narusza zasad\u0119 odr\u00f3cenia zale\u017cno\u015bci, poniewa\u017c jest silnie zwi\u0105zana z klas\u0105 Database. Je\u017celi by\u0142aby potrzeba zmiany sposobu dost\u0119pu do bazy danych trzeba by by\u0142o zmodyfikowa\u0107 klas\u0119 OrderService i wszystkie inne klasy, kt\u00f3re u\u017cywaj\u0105 klasy Database.<\/p>\n<p>W celu naprawienia powy\u017cszego kodu wystarczy doda\u0107 dodatkow\u0105 warstw\u0119 abstrakcji pomi\u0119dzy modu\u0142ami wysokiego i niskiego poziomu. <br><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1ab9c12 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"1ab9c12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>interface DataRepository {\n  void save(Object object);\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-472d815 elementor-widget elementor-widget-text-editor\" data-id=\"472d815\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nast\u0119pnie w klasie reprezentuj\u0105cej modu\u0142 wysokiego poziomu stworzymy pole, kt\u00f3re b\u0119dzie przechowywa\u0107 zale\u017cno\u015b\u0107 od abstrakcji i b\u0119dziemy jej wymaga\u0107 w konstruktorze tej klasy.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2cea3f1 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"2cea3f1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>class OrderService {\n  private DataRepository dataRepository;\n\n  public OrderService(DataRepository dataRepository) {\n    this.dataRepository = dataRepository;\n  }\n\n  public void saveOrder(Order order) {\n    dataRepository.save(order);\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-046c1b3 elementor-widget elementor-widget-text-editor\" data-id=\"046c1b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Klasa odpowiadaj\u0105ca modu\u0142owi niskiego poziomu implementuje stworzony wcze\u015bniej interfejs.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f53f4b9 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f53f4b9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>class Database implements DataRepository {\n  public void save(Object object) {\n    \/\/ logika dost\u0119pu do bazy danych\n  }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-190420e elementor-widget elementor-widget-text-editor\" data-id=\"190420e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dzi\u0119ki temu zabiegowi klasa OrderService nie zale\u017cy bezpo\u015brednio od klasy Database, lecz od interfejsu DataRepository (kt\u00f3ry Database implementuje). Mo\u017cliwe jest r\u00f3wnie\u017c \u0142atwe podmienienie \u017ar\u00f3d\u0142a danych, np. na plik. Wystarczy stworzy\u0107 now\u0105 klas\u0119 implementuj\u0105c\u0105 interfejs DataRepository i przekaza\u0107 j\u0105 do konstruktora klasy OrderService. <\/p><p>Zale\u017cno\u015bci mo\u017cna r\u00f3wnie\u017c wstrzykiwa\u0107 przez w\u0142a\u015bciwo\u015bci lub parametry metod, nie tylko przez kontruktor.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e53bd29 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e53bd29\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-40096cc\" data-id=\"40096cc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ae765e3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ae765e3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-16f1bce\" data-id=\"16f1bce\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-c71bc14\" data-id=\"c71bc14\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Ostatnia zasada akronimu SOLID promuj\u0105ca lu\u017ane sprz\u0119\u017cenie mi\u0119dzy modu\u0142ami w kodzie.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,33],"tags":[34,41,35,36],"class_list":["post-749","post","type-post","status-publish","format-standard","hentry","category-artykuly","category-czysty-kod","tag-czysty-kod","tag-dip","tag-java","tag-solid"],"_links":{"self":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=749"}],"version-history":[{"count":16,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/749\/revisions"}],"predecessor-version":[{"id":896,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/749\/revisions\/896"}],"wp:attachment":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}