{"id":229470,"date":"2022-11-20T17:55:00","date_gmt":"2022-11-20T14:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229470"},"modified":"2022-11-20T17:56:33","modified_gmt":"2022-11-20T14:56:33","slug":"pierwsze-dwa-filary-oop","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/","title":{"rendered":"Pierwsze dwa filary OOP"},"content":{"rendered":"\n<p>Je\u015bli chodzi o m\u00f3wienie o programowaniu obiektowym (lub OOP), prawdopodobnie us\u0142yszysz o Trzech Filarach Programowania Obiektowego lub Czterech Filarach Programowania Obiektowego.<\/p>\n<p>W zale\u017cno\u015bci od Twojego pochodzenia, by\u0107 mo\u017ce ju\u017c o nich s\u0142ysza\u0142e\u015b, wiesz, czym one s\u0105 i naprawd\u0119 nie musisz si\u0119 w to zbytnio zag\u0142\u0119bia\u0107. Ale je\u015bli nie, uwa\u017cam, \u017ce zrozumienie ich jest podstaw\u0105 programowania obiektowego.<\/p>\n<p>Om\u00f3wili\u015bmy ca\u0142\u0105 faz\u0119 <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analizy<\/a><\/strong> programowania obiektowego:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-analiza-czesc-1\/\" title=\"Analiza, cz\u0119\u015b\u0107 1\">Analiza, cz\u0119\u015b\u0107 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-analiza-czesc-2\/\" title=\"Analiza, cz\u0119\u015b\u0107 2\">Analiza, cz\u0119\u015b\u0107 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-zrozumienie-oczekiwan-klientow\/\" title=\"Zrozumienie oczekiwa\u0144 klient\u00f3w\">Zrozumienie oczekiwa\u0144 klient\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpress-zestawienie-pracy\/\" title=\"Zestawienie pracy\">Zestawienie pracy<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-w-wordpressie-regulamin\/\" title=\"Zasady i warunki\">Zasady i warunki<\/a><\/li>\n<\/ol>\n<p>Powiedziawszy to, przejd\u017amy do dyskusji na temat projektowania i wdra\u017cania. W ko\u0144cu to jest to, do czego i tak wielu ludzi chce skoczy\u0107, prawda?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165086-61e77571592ef.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165086-61e77571592ef.jpg\" alt=\"Pierwsze dwa filary OOP\"><\/a><\/p>\n<p>Zanim napisz\u0119 jakikolwiek kod, chcia\u0142bym napisa\u0107 dwa posty o czterech punktach programowania obiektowego (poniewa\u017c jestem jednym z tych, kt\u00f3rzy podpisuj\u0105 si\u0119 pod ide\u0105, \u017ce s\u0105 cztery).<\/p>\n<h2>Dwa filary OOP<\/h2>\n<p>Ponownie, zrozumienie ich jest kluczem do zrozumienia podstaw programowania obiektowego. Bez nich trudno b\u0119dzie porusza\u0107 si\u0119 po reszcie tego, co zostanie om\u00f3wione w przysz\u0142ych postach.<\/p>\n<p>Porozmawiajmy wi\u0119c o ka\u017cdym z nich. Pierwsze dwa om\u00f3wimy w tym po\u015bcie, a ostatnie dwa w nast\u0119pnym po\u015bcie.<\/p>\n<h3>1 Abstrakcja<\/h3>\n<p>Og\u00f3lnie rzecz bior\u0105c, jest to klucz do pisania kodu obiektowego. Mam tu na my\u015bli wszystko, co jest zawarte w klasie. Abstrahujemy ide\u0119 czego\u015b w klas\u0119. W wielu ksi\u0105\u017ckach widzimy takie rzeczy jak <strong>Zwierz\u0119ta<\/strong> czy <strong>Samochody<\/strong> przedstawiane jako klasy.<\/p>\n<p>To dzia\u0142a teoretycznie, ale w praktyce nie programujemy zwierz\u0105t ani samochod\u00f3w (cho\u0107 my\u015bl\u0119, \u017ce w tym momencie historii mo\u017cna by si\u0119 spiera\u0107, \u017ce tak jest, ale robi\u0119 dygresj\u0119, poniewa\u017c wiesz, co mam na my\u015bli).<\/p>\n<p>Zamiast tego b\u0119dziemy abstrahowa\u0107 pomys\u0142y do \u200b\u200bich klas. I tutaj jest kluczowa idea:<\/p>\n<blockquote>\n<p>Klasa powinna reprezentowa\u0107 rzeczownik.<\/p>\n<\/blockquote>\n<p>Oznacza to, \u017ce nie powiniene\u015b mie\u0107 klasy, kt\u00f3ra reprezentuje co\u015b w rodzaju \u201eBieganie&quot;. Zamiast tego mo\u017cesz mie\u0107 co\u015b, co dzia\u0142a, a zatem <strong>uruchamianie<\/strong> by\u0142oby metod\u0105. Oto og\u00f3lny podzia\u0142 dzia\u0142ania abstrakcji:<\/p>\n<ol>\n<li>To, co ma by\u0107 reprezentowane, to klasa,<\/li>\n<li>Rzecz\u0105, kt\u00f3r\u0105 robi, s\u0105 jej metody,<\/li>\n<li>A spos\u00f3b, w jaki opisujesz rzecz, zwykle mo\u017cna to zrobi\u0107 za pomoc\u0105 jej atrybut\u00f3w lub w\u0142a\u015bciwo\u015bci.<\/li>\n<\/ol>\n<p>Nie oznacza to, \u017ce nie mamy funkcji lub metod, kt\u00f3re modyfikuj\u0105 jego w\u0142a\u015bciwo\u015bci, ale powy\u017csze trzy punkty s\u0105 dobrymi zasadami. Wi\u0119c kiedy projektujesz klas\u0119, mo\u017cesz zada\u0107 takie pytania jak:<\/p>\n<ul>\n<li>Czy co\u015b pisz\u0119?<\/li>\n<li>Czy pisz\u0119 co\u015b do zrobienia?<\/li>\n<li>A mo\u017ce pisz\u0119 co\u015b, co co\u015b opisuje?<\/li>\n<\/ul>\n<p>Poniewa\u017c je\u015bli piszesz dzia\u0142anie, prawdopodobnie jest ono przez co\u015b zrobione (poniewa\u017c rzeczy podejmuj\u0105 dzia\u0142anie \u2013 robi\u0105 rzeczy). A je\u015bli co\u015b opisujesz, prawdopodobnie odnosi si\u0119 to do czego\u015b (kiedy ostatnio nic nie opisa\u0142e\u015b?)<\/p>\n<p>Ma sens?<\/p>\n<h3>2 Hermetyzacja<\/h3>\n<p>Je\u015bli wi\u0119c piszemy klasy \u2013 dobre klasy \u2013 to musimy je pisa\u0107 w taki spos\u00f3b, aby\u015bmy prawid\u0142owo hermetyzowali ich dane. A enkapsulacja to tak naprawd\u0119 tylko \u201edu\u017ce&#8221; s\u0142owo, kt\u00f3re odnosi si\u0119 do idei zarz\u0105dzania swoimi obowi\u0105zkami (lub \u015bledzenia swoich danych).<\/p>\n<p>Na przyk\u0142ad, gdyby\u015bmy napisali klas\u0119 reprezentuj\u0105c\u0105 post WordPress, mieliby\u015bmy klas\u0119 o nazwie <strong>Post<\/strong> z w\u0142a\u015bciwo\u015bciami takimi jak <strong>publikowanie, aktualizowanie, usuwanie,<\/strong> \u00a0<strong>postData, publishDate, lastUpdatedData<\/strong>, <strong>deletedDate<\/strong> i tak dalej.<\/p>\n<p>Wtedy mieliby\u015bmy funkcje zaprojektowane specjalnie do podejmowania dzia\u0142a\u0144 na instancji klasy <strong>Post .<\/strong><\/p>\n<p>Na przyk\u0142ad mo\u017cemy\u2026<\/p>\n<ul>\n<li>publikowa\u0107,<\/li>\n<li>aktualizacja,<\/li>\n<li>lub usu\u0144 post<\/li>\n<\/ul>\n<p>Te metody zostan\u0105 prawdopodobnie ujawnione w taki spos\u00f3b, aby inne klasy mog\u0142y z nich skorzysta\u0107. Ponadto te metody prawdopodobnie b\u0119d\u0105 r\u00f3wnie\u017c korzysta\u0107 z innych w\u0142a\u015bciwo\u015bci, takich jak <strong>publishDate<\/strong> lub <strong>deleteDate<\/strong>.<\/p>\n<p>I tu w gr\u0119 wchodzi poj\u0119cie widoczno\u015bci. W programowaniu obiektowym enkapsulacja odnosi si\u0119 nie tylko do idei informacji, kt\u00f3re zawiera klasa, ale tak\u017ce do sposobu, w jaki ujawnia ona dane.<\/p>\n<p>Odbywa si\u0119 to na trzy sposoby, z kt\u00f3rych wszystkie s\u0105 zdefiniowane poni\u017cej:<\/p>\n<ol>\n<li><strong>publiczne<\/strong> w\u0142a\u015bciwo\u015bci i funkcje s\u0105 dost\u0119pne dla ka\u017cdego, kto z nich korzysta; jednak\u00a0 nieruchomo\u015bci <strong>publiczne\u00a0<\/strong> zwykle nie s\u0105 eksponowane. Zamiast tego upewniamy si\u0119, \u017ce mo\u017cna je modyfikowa\u0107 metod\u0105 <strong>publiczn\u0105<\/strong>.<\/li>\n<li><strong>chronione<\/strong> w\u0142a\u015bciwo\u015bci i funkcje s\u0105 dost\u0119pne do u\u017cycia przez klas\u0119 i ka\u017cd\u0105 inn\u0105 klas\u0119, kt\u00f3ra dziedziczy z niej informacje. Zostanie to om\u00f3wione bardziej szczeg\u00f3\u0142owo w nast\u0119pnym po\u015bcie.<\/li>\n<li><strong>prywatne<\/strong> w\u0142a\u015bciwo\u015bci i funkcje to te, kt\u00f3re maj\u0105 by\u0107 u\u017cywane wy\u0142\u0105cznie w kontek\u015bcie danej klasy. Mog\u0105 to by\u0107 w\u0142a\u015bciwo\u015bci u\u017cywane do \u015bledzenia wewn\u0119trznych status\u00f3w lub metod u\u017cywanych do pracy jako funkcje pomocnicze dla funkcji publicznych w celu uko\u0144czenia ich pracy.<\/li>\n<\/ol>\n<p>Kontynuuj\u0105c t\u0119 \u200b\u200bseri\u0119, zobaczymy rol\u0119, jak\u0105 ka\u017cdy z nich odgrywa podczas pisania przejrzystych, \u0142atwych do na\u015bladowania, dobrze zaprojektowanych klas.<\/p>\n<p>Na razie jednak wa\u017cne jest, aby zrozumie\u0107, \u017ce te s\u0142owa, <strong>public, protected<\/strong> i <strong>private<\/strong>, s\u0105 okre\u015blane jako modyfikatory widoczno\u015bci, poniewa\u017c, jak mo\u017cesz si\u0119 upewni\u0107, zarz\u0105dzaj\u0105 widoczno\u015bci\u0105 metody lub w\u0142a\u015bciwo\u015bci w odniesieniu do jej klasy i klasy, kt\u00f3re po nim dziedzicz\u0105 i kt\u00f3re z nim wsp\u00f3\u0142dzia\u0142aj\u0105.<\/p>\n<p>M\u00f3wi\u0105c o dziedziczeniu, b\u0119d\u0119 o tym m\u00f3wi\u0142 w nast\u0119pnej cz\u0119\u015bci tej serii.<\/p>\n<h2>Abstrakcja, enkapsulacja i WordPress<\/h2>\n<h4>Z\u0142e wie\u015bci: zaj\u0119cia na WordPressie<\/h4>\n<p>Oto rzecz: w WordPressie cz\u0119sto widzimy bardzo, bardzo du\u017ce klasy. To nie jest dobra rzecz. W rzeczywisto\u015bci s\u0105 to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Anti-pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anty-wzorce<\/a> zwane boskimi klasami (pomys\u0142 polega na tym, \u017ce masz jedn\u0105 klas\u0119, kt\u00f3ra wie wszystko).<\/p>\n<p>A kiedy masz bosk\u0105 klas\u0119, wydaje si\u0119 to wygodne, poniewa\u017c mo\u017cesz zrzuci\u0107 wszystkie funkcje w jednym miejscu. Ale<\/p>\n<ul>\n<li>ci\u0119\u017cko to przetestowa\u0107,<\/li>\n<li>nie skaluje si\u0119,<\/li>\n<li>nie gra dobrze z inn\u0105 klas\u0105 (nie m\u00f3wi\u0105c ju\u017c o klasach lub bibliotekach innych firm),<\/li>\n<li>nie przystosowuje si\u0119 dobrze do zmian.<\/li>\n<\/ul>\n<p>Ostatecznie, kiedy to robisz, nie robisz programowania obiektowego. Bierzesz funkcje i wrzucasz je do klasy. I chcemy od tego uciec.<\/p>\n<h4>Dobra wiadomo\u015b\u0107: pisanie zaj\u0119\u0107 na WordPressie<\/h4>\n<p>Rodzi to jednak pytanie: po co uczy\u0107 si\u0119 programowania obiektowego za pomoc\u0105 WordPressa, je\u015bli nie jest to solidny przyk\u0142ad programowania obiektowego?<\/p>\n<p>To dlatego, \u017ce nadal mo\u017cesz pisa\u0107 dobry kod obiektowy na WordPressie. Nadal mo\u017ce dobrze wsp\u00f3\u0142pracowa\u0107 z WordPressem i nadal mo\u017ce \u0142adnie wsp\u00f3\u0142pracowa\u0107 z wieloma innymi aspektami WordPressa.<\/p>\n<p>Wiem, \u017ce brzmi to sprzecznie z intuicj\u0105, ale gdy zag\u0142\u0119bimy si\u0119 w pisanie kodu obiektowego na WordPressie, powinno to sta\u0107 si\u0119 jasne.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zanim napisz\u0119 jakikolwiek kod, chcia\u0142bym napisa\u0107 dwa posty na temat czterech filar\u00f3w OOP. Pierwsze dwa to abstrakcja i enkapsulacja.<\/p>\n","protected":false},"author":1,"featured_media":165087,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,836,845],"tags":[1169],"class_list":["post-229470","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-przewodnik-dla-poczatkujacych","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229470"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229470\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/165087"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}