{"id":7140,"date":"2019-04-24T09:54:04","date_gmt":"2019-04-24T07:54:04","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7140"},"modified":"2023-09-25T16:26:23","modified_gmt":"2023-09-25T14:26:23","slug":"czystosc-kodu","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/czystosc-kodu\/","title":{"rendered":"Czysto\u015b\u0107 kodu"},"content":{"rendered":"\n<p>Nic nie wp\u0142ywa na prac\u0119 zespo\u0142u w projekcie tak bardzo jak z\u0142y, nieczytelny, niechlujny, pisany na szybko bez przemy\u015blenia kod. Dynamik\u0119 zespo\u0142u da si\u0119 poprawi\u0107, wymagania mo\u017cna przedefiniowa\u0107, a harmonogram mo\u017cna zmodyfikowa\u0107. Jednak z\u0142y kod psuje si\u0119, staj\u0105c si\u0119 coraz wi\u0119kszym ci\u0119\u017carem dla zespo\u0142u.<\/p>\n\n\n\n<p><strong>Jaki jest czysty kod?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>elegancki<\/li>\n\n\n\n<li>efektywny<\/li>\n\n\n\n<li>prosty<\/li>\n\n\n\n<li>\u0142atwy do zmian<\/li>\n\n\n\n<li>opisywalny<\/li>\n\n\n\n<li>minimalny<\/li>\n\n\n\n<li>taki jakiego si\u0119 spodziewali\u015bmy<\/li>\n\n\n\n<li>stworzy\u0142 go PROGRAMISTA \u2013 nie j\u0119zyk<\/li>\n<\/ul>\n\n\n\n<p>Pisz\u0105c ten artyku\u0142, przede wszystkim skupi\u0119 si\u0119 na kilku podstawowych kwestiach dotycz\u0105cych zmiennych oraz funkcji.<\/p>\n\n\n\n<p>Wymy\u015blaj\u0105c nazwy zmiennych stosujmy si\u0119 do kilku zasad, kt\u00f3re sprawi\u0105, \u017ce nasz kod b\u0119dzie bardziej czytelny \u2013 nie tylko dla nas ale i r\u00f3wnie\u017c dla os\u00f3b, kt\u00f3re b\u0119d\u0105 razem z nami tworzy\u0107 kod lub w przysz\u0142o\u015bci przejm\u0105 po nas projekt.<\/p>\n\n\n\n<p>Przede wszystkim nazwy zmiennych nie mog\u0105 by\u0107 jednoliterowe (dwuliterowe r\u00f3wnie\u017c nie \ud83d\ude09 ). Ile razy widzia\u0142e\u015b\/a\u015b zmienn\u0105 x, z, c, a, b, czy jak\u0105kolwiek inn\u0105 liter\u0119 alfabetu i zastanawia\u0142e\u015b\/a\u015b si\u0119 czy dana zmienna jest w og\u00f3le potrzebna? Do czego ona s\u0142u\u017cy? Jaki by\u0142 cel jej stworzenia? Aby odpowiedzie\u0107 sobie na te pytanie musia\u0142e\u015b\/a\u015b przejrze\u0107 kod w poszukiwaniu miejsc, gdzie dana zmienna mog\u0142a zosta\u0107 u\u017cyta. Mniejszy problem, je\u015bli by\u0142a to zmienna w obr\u0119bie jednej funkcji, a co je\u015bli by\u0142a to zmienne globalna? Oczywi\u015bcie wyj\u0105tkiem s\u0105 tutaj zmienne wykorzystywane w p\u0119tlach: i, j, k.<\/p>\n\n\n\n<p>Poszukuj\u0105c wykorzystania danej zmiennej sam\/a zada\u0142e\u015b\/a\u015b sobie pytanie: \u201eJaki by\u0142 cel jej stworzenia?\u201d. Jest to kolejna wa\u017cna kwestia, kt\u00f3r\u0105 powinni\u015bmy uwzgl\u0119dnia\u0107 podczas tworzenia nazw zmiennych. Powinny one przedstawia\u0107 intencj\u0119 osoby tworz\u0105cej kod. Dzi\u0119ki temu nie b\u0119dziesz si\u0119 ju\u017c zastanawia\u0107 czy zmienna odnosi\u0142a si\u0119 do tej funkcjonalno\u015bci, czy mo\u017ce do innej.<\/p>\n\n\n\n<p>Pami\u0119taj r\u00f3wnie\u017c, aby Twoje nazwy nie zawiera\u0142y drobnych r\u00f3\u017cnic. Wi\u0119kszo\u015b\u0107 z nas, jak nie wszyscy, pos\u0142uguj\u0105 si\u0119 wyborem np. metody z klasy, poprzez podpowiedzi naszego IDE. Zastan\u00f3w si\u0119 jak prosto pomyli\u0107 si\u0119 w wyborze odpowiedniej funkcji, kiedy jedyna r\u00f3\u017cnica w ich nazwach to pojedyncza litera na ko\u0144cu? Je\u015bli ju\u017c o tym mowa, to dobr\u0105 praktyk\u0105 jest r\u00f3wnie\u017c tworzenie nazw, kt\u00f3re jeste\u015bmy w stanie wym\u00f3wi\u0107. Nie powoduje to problem\u00f3w z domy\u015blaniem si\u0119 jakie zadanie ma do wykonania dana funkcja.<\/p>\n\n\n\n<p>Par\u0119 przyk\u0142ad\u00f3w:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nint sc\n \nList&amp;lt;string&gt; list1 = new List&amp;lt;string&gt;();\n \nconst goodWorkersInThisOffice\n \nconst goodWorkerInThisOffice\n \nfunction sendEmails(a,b) {}\n \nClass sdntRcrd\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>Dobrze<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nint studentsCount\n \nList&amp;lt;string&gt; students = new List&amp;lt;string&gt;();\n \nfunction sendEmails(content,recipients) {}\n \nClass StudentRecord\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p>W r\u00f3\u017cnych projektach cz\u0119sto spotykam si\u0119 z sytuacj\u0105, kiedy kto\u015b nie zastosowa\u0142 sta\u0142ych. Wyobra\u017a sobie sytuacj\u0119, kiedy masz par\u0119 warunk\u00f3w, od kt\u00f3rych zale\u017cy dzia\u0142anie Twojego kodu. W ka\u017cdym z nich sprawdzasz, czy np. ilo\u015b\u0107 produkt\u00f3w w koszyku jest wi\u0119ksza od 6, czy kto\u015b zakupi\u0142 dany produkt itd. Wszystko dzia\u0142a super dop\u00f3ki nie przyjdzie pora, aby zmieni\u0107 warunki promocji. Jak \u0142atwo zapomnie\u0107 o jednym warunku lub po prostu si\u0119 pomyli\u0107. Aby unikn\u0105\u0107 takich sytuacji pos\u0142ugujemy si\u0119 w\u0142a\u015bnie sta\u0142ymi. Dzi\u0119ki ich wykorzystaniu nie tylko mo\u017cemy jednocze\u015bnie zmieni\u0107 warto\u015b\u0107 w wielu miejscach, lecz, co cz\u0119sto wa\u017cniejsze, ich nazwy m\u00f3wi\u0105 nam czego dotyczy dana warto\u015b\u0107.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\tif (p.count &gt; 9) {}\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>Dobrze<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nconst MIN_PRODUCTS_IN_CART = 9;\nif (products.count &gt; MIN_PRODUCTS_IN_CART) {}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p>Popularnym b\u0142\u0119dem w\u015br\u00f3d mniej do\u015bwiadczonych koder\u00f3w, jest r\u00f3wnie\u017c zapisywanie typ\u00f3w zmiennych w ich nazwach. Nie ma co si\u0119 tutaj chyba zbytnio rozpisywa\u0107, bo wydaje mi si\u0119, \u017ce sprawa jest stosunkowo prosta. Nie raz na pewno zdarzy\u0142o Ci si\u0119, \u017ce dana zmienna na pocz\u0105tku Twojej pracy by\u0142a string\u2019iem, jednak po paru zmianach sta\u0142a si\u0119 ona np. int\u2019em.<\/p>\n\n\n\n<p><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nint securityCodeString \/\/ zmienna by\u0142a kiedy\u015b stringiem\n<\/pre><\/div>\n\n\n<p>Starajmy si\u0119 r\u00f3wnie\u017c nie u\u017cywa\u0107 przedrostk\u00f3w. W wielu przypadkach jest on zb\u0119dny i, w oczach bardziej do\u015bwiadczonych programist\u00f3w, po prostu miesza niepotrzebnie w kodzie.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-3 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nClass Worker {\n \nprivate w_name: string;\n \n    setName(name: string) {\n        w_name = name;\n    }\n}\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>Dobrze<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nClass Worker {\n \nprivate name: string;\n \n    setName(name: string) {\n        this.name = name;\n    }\n}\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p>Przejd\u017amy teraz powoli nazw do metod\/funkcji.<\/p>\n\n\n\n<p>Dobra praktyk\u0105, stosowan\u0105 przez wiele os\u00f3b, jest stosowanie czasownik\u00f3w jako nazw metod, np. course.submit()<br>U\u017cywanie przedrostk\u00f3w \u201eget\u201d, \u201eset\u201d, \u201eis\u201d r\u00f3wnie\u017c jest polecane oraz u\u0142atwia p\u00f3\u017aniej wykorzystywanie danych funkcjonalno\u015bci.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nif (course.isCompleted()) {\n    totalCompetedHours += course.getTotalHours();\n    user.setTotalHours(totalCompletedHours);\n}\n<\/pre><\/div>\n\n\n<p>Je\u017celi mamy tak\u0105 mo\u017cliwo\u015b\u0107 starajmy si\u0119 r\u00f3wnie\u017c nie przeci\u0105\u017ca\u0107 konstruktor\u00f3w, a u\u017cywajmy fabryk. Bardzo u\u0142atwia to p\u00f3\u017aniejsze czytanie kodu.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nCity lodz = new City(\"\u0141\u00f3d\u017a\");\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>Dobrze<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nCity lodz = City.FromName(\"\u0141\u00f3d\u017a\");\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p>Na ten moment mam dla Ciebie tyle.<br>Chcia\u0142bym jednak wspomnie\u0107 jeszcze o paru rzeczach poza tworzeniem nazw:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Dodawajmy do naszego kodu kontekst. Nie u\u017cywajmy do tego jednak nadmiarowo\u015bci przedrostk\u00f3w do zarz\u0105dzania kontekstem:<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-5 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>\u0179le<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nName = \"Imi\u0119 nazwisko\"\n \nclass StudentAddreess\nclass WorkerAddreess\n<\/pre><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center\"><strong>Dobrze<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nWorker.name = \"Imi\u0119 nazwisko\"\n \nclass Address\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Nie b\u00f3jmy si\u0119 przycisku &#8222;refactor&#8221; w naszym IDE. To nic z\u0142ego zmieni\u0107 nazwy na takie, kt\u00f3re b\u0119d\u0105 bardziej dopasowane do sytuacji lub\/i bardziej czytelne.<\/li>\n\n\n\n<li>Stosujmy narz\u0119dzia, kt\u00f3re pomog\u0105 nam w utrzymaniu i pisaniu czystego kodu. R\u00f3wnie wa\u017cn\u0105 rzecz\u0105 podczas pisania czystego kodu jest stosowanie przez zesp\u00f3\u0142 wsp\u00f3lnie wypracowanych zasad, np. tabulatory czy spacje, d\u0142ugo\u015b\u0107 wci\u0119cia, pusta linia na ko\u0144cu pliku, maksymalna d\u0142ugo\u015b\u0107 linii itd. Dzi\u0119ki temu nie tylko b\u0119dzie pro\u015bciej przeprowadza\u0107 Code Review, ale r\u00f3wnie\u017c bardziej czytelne stan\u0105 si\u0119 dla nas komunikaty o zmianach, kt\u00f3re dostarcza nam np. GIT. Osobi\u015bcie polecam: <a href=\"https:\/\/editorconfig.org\/\" rel=\"nofollow\" >editorConfig<\/a>, <a href=\"https:\/\/palantir.github.io\/tslint\/\" rel=\"nofollow\" >tslint<\/a>, <a href=\"https:\/\/eslint.org\/\" rel=\"nofollow\" >eslint<\/a>, <a href=\"https:\/\/prettier.io\/\" rel=\"nofollow\" >prettier<\/a> oraz dla VS Code: <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=rbbit.typescript-hero\" rel=\"nofollow\" >typescripthero<\/a><\/li>\n<\/ol>\n\n\n\n<p>Mam nadziej\u0119, \u017ce dzi\u0119ki temu artyku\u0142owi Tw\u00f3j kod b\u0119dzie czytelniejszy i bardziej zrozumia\u0142y dla innych. Super, je\u015bli by\u0142 on dla Ciebie tylko od\u015bwie\u017ceniem podstawowych informacji na temat czysto\u015bci kodu. Oboj\u0119tnie, kt\u00f3ra z opcji jest bli\u017csza Twojej wiedzy na ten temat, pami\u0119taj o tym, \u017ce kod, kt\u00f3ry aktualnie piszesz kto\u015b mo\u017ce po Tobie przej\u0105\u0107.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;7140&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.4&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.4\\\/5 ( votes: 9)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Czysto\u015b\u0107 kodu&quot;,&quot;width&quot;:&quot;122.1&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 122.1px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.4\/5 ( votes: 9)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Nic nie wp\u0142ywa na prac\u0119 zespo\u0142u w projekcie tak bardzo jak z\u0142y, nieczytelny, niechlujny, pisany na szybko bez przemy\u015blenia kod. &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/czystosc-kodu\/\">Continued<\/a><\/p>\n","protected":false},"author":197,"featured_media":7156,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[287,743,742,741,270,744],"class_list":["post-7140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-software-development","tag-clean","tag-clean-code","tag-code","tag-development","tag-software"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/02\/pexels-photo-270360.jpeg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7140"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/197"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7140"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7140\/revisions"}],"predecessor-version":[{"id":24447,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7140\/revisions\/24447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/7156"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}