{"id":229559,"date":"2022-11-22T15:24:00","date_gmt":"2022-11-22T12:24:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229559"},"modified":"2022-11-22T15:27:13","modified_gmt":"2022-11-22T12:27:13","slug":"klasy-abstrakcyjne-czesc-2-klasy-abstrakcyjne-i-interfejsy","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-2-klasy-abstrakcyjne-i-interfejsy\/","title":{"rendered":"Klasy abstrakcyjne, cz\u0119\u015b\u0107 2 \u2013 Klasy abstrakcyjne i interfejsy"},"content":{"rendered":"\n<p>W <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-1-zachowanie-abstrakcji\/\" title=\"poprzednim po\u015bcie\">poprzednim po\u015bcie<\/a><\/strong> z tej serii przeszed\u0142em przez:<\/p>\n<ul>\n<li>podstawy klas abstrakcyjnych,<\/li>\n<li>jak je wdro\u017cy\u0107,<\/li>\n<li>i poda\u0142 dzia\u0142aj\u0105ce przyk\u0142ady kodu.<\/li>\n<\/ul>\n<p>I chocia\u017c uwa\u017cam, \u017ce zrozumienie klas abstrakcyjnych jest kluczem do stworzenia silnych podstaw programowania obiektowego, cz\u0119sto widz\u0119, \u017ce mo\u017ce to by\u0107 myl\u0105ce, je\u015bli chodzi o por\u00f3wnywanie ich z interfejsami i wiedza, kiedy ich u\u017cywa\u0107.<\/p>\n<h2>Klasy abstrakcyjne i interfejsy<\/h2>\n<p>W tym po\u015bcie udost\u0119pni\u0119:<\/p>\n<ul>\n<li>szybkie przypomnienie o tym, czym s\u0105 interfejsy,<\/li>\n<li>czym s\u0105 klasy abstrakcyjne,<\/li>\n<li>a nast\u0119pnie, jak wiedzie\u0107, kiedy u\u017cy\u0107 jednego z drugim.<\/li>\n<\/ul>\n<p>Nie powinien to by\u0107 artyku\u0142 intensywnie koduj\u0105cy, ale powinien pom\u00f3c wiedzie\u0107, kiedy pisa\u0107 kod okre\u015blonego typu, aby pom\u00f3c w lepszej organizacji projekt\u00f3w.<\/p>\n<h3>1 Interfejsy<\/h3>\n<p>Przypomnijmy, \u017ce je\u015bli chodzi o interfejsy, u\u017cywamy r\u00f3wnie\u017c terminu \u201eprogramowanie do interfejsu&quot; z my\u015bl\u0105 o tym, \u017ce interfejs definiuje metody, kt\u00f3re klasa musi zaimplementowa\u0107, aby wype\u0142ni\u0107 \u201ekontrakt&#8221; z tym interfejsem.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kod<\/a> u\u017cyty do zademonstrowania podstawowego interfejsu to:<\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Pami\u0119taj jednak, \u017ce celem interfejsu nie jest definiowanie po napisaniu kodu. Zamiast tego jest to narz\u0119dzie u\u017cywane do projektowania, jakie klasy powinny zaimplementowa\u0107, je\u015bli b\u0119d\u0105 przestrzega\u0107 okre\u015blonego paradygmatu lub je\u015bli wymagaj\u0105 okre\u015blonego zestawu funkcji.<\/p>\n<p>Oznacza to, \u017ce je\u015bli zamierzasz projektowa\u0107 zestaw klas, kt\u00f3re dzia\u0142aj\u0105 z buforowaniem, nie piszesz najpierw klas. Najpierw piszesz interfejs, a nast\u0119pnie klasy implementuj\u0105 ten interfejs.<\/p>\n<p>Chodzi o to, \u017ce ka\u017cda klasa implementuj\u0105ca interfejs b\u0119dzie mie\u0107 te funkcje.<\/p>\n<h3>2 Klasy abstrakcyjne<\/h3>\n<p>Z drugiej strony klasy abstrakcyjne pozwalaj\u0105 nam robi\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dwie rzeczy:<\/a><\/strong><\/p>\n<ol>\n<li>implementowa\u0107 funkcjonalno\u015b\u0107, z kt\u00f3rej mog\u0105 korzysta\u0107 podklasy,<\/li>\n<li>implementuj sygnatury metod, kt\u00f3re musz\u0105 implementowa\u0107 podklasy.<\/li>\n<\/ol>\n<p>Na pocz\u0105tku mo\u017ce wydawa\u0107 si\u0119 to troch\u0119 niesp\u00f3jne, ale rozwa\u017c to:<\/p>\n<p>Kiedy masz klas\u0119 pewnego typu, kt\u00f3ra b\u0119dzie mia\u0142a sp\u00f3jn\u0105 funkcjonalno\u015b\u0107 bez wzgl\u0119du na podklas\u0119, funkcjonalno\u015b\u0107 przechodzi do klasy abstrakcyjnej. Gdy inne metody wymagaj\u0105 implementacji metody, wystarczy poda\u0107 sygnatur\u0119 metody i oznaczy\u0107 j\u0105 jako <strong>abstract<\/strong>.<\/p>\n<p>Oto przyk\u0142ad z <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-1-zachowanie-abstrakcji\/\" title=\"poprzedniego postu:\">poprzedniego postu:<\/a><\/strong><\/p>\n<p>To sprawia, \u017ce \u200b\u200bwszyscy jeste\u015bmy zaj\u0119ci poprzednimi przyk\u0142adami i poprzednimi rzeczami, na kt\u00f3rych musimy si\u0119 skupi\u0107, je\u015bli chodzi o interfejsy i klasy abstrakcyjne, ale dla niekt\u00f3rych nadal nie zapewnia to zbytniej jasno\u015bci.<\/p>\n<p>Konkretnie, to nadal nie odpowiada na pytanie: Jak decydujemy, kiedy u\u017cy\u0107 klasy abstrakcyjnej, a kiedy u\u017cy\u0107 interfejsu?<\/p>\n<p>Na pierwszy rzut oka mo\u017ce to zabrzmie\u0107 nieco myl\u0105ce, ale jest kilka rzeczy, kt\u00f3rych mo\u017cesz u\u017cy\u0107, aby podj\u0105\u0107 decyzj\u0119.<\/p>\n<h2>Kiedy u\u017cywamy ka\u017cdego?<\/h2>\n<p>Pami\u0119taj, \u017ce je\u015bli chodzi o programowanie obiektowe, mo\u017cemy je podzieli\u0107 na trzy r\u00f3\u017cne sposoby:<\/p>\n<ul>\n<li>Zaj\u0119cia reprezentuj\u0105 rzecz. Mo\u017cesz uzna\u0107 to za rzeczownik.<\/li>\n<li>Atrybuty lub w\u0142a\u015bciwo\u015bci s\u0105 jak przymiotniki. Opisuj\u0105 przedmiot lub co\u015b, co przedmiot mo\u017ce posiada\u0107.<\/li>\n<li>Metody lub funkcje s\u0105 jak czasowniki. Opisuj\u0105, co mog\u0105 zrobi\u0107 ich sprzeciw.<\/li>\n<\/ul>\n<p>Teraz, je\u015bli chodzi o interfejs, zastan\u00f3w si\u0119, co ten interfejs robi: opisuje, bez implementacji, co mo\u017ce zrobi\u0107 obiekt. A je\u015bli chodzi o klas\u0119 abstrakcyjn\u0105, opisuje, czym jest obiekt w czasie wykonywania.<\/p>\n<p>Innymi s\u0142owy, dobr\u0105 zasad\u0105 jest to, \u017ce je\u015bli potrzebujesz zapewni\u0107 zestaw zachowa\u0144 dla obiektu, interfejs jest dobrym rozwi\u0105zaniem. Je\u015bli chcesz opisa\u0107, czym jest obiekt, u\u017cyj klasy abstrakcyjnej.<\/p>\n<p>W przypadku klas abstrakcyjnych p\u00f3jd\u0119 o krok dalej i powiem, \u017ce pomaga opisa\u0107 podstawowy poziom danych, kt\u00f3ry opisuje obiekt lub to, co mo\u017ce przechowywa\u0107 opr\u00f3cz podstawowego poziomu funkcjonalno\u015bci.<\/p>\n<h3>Masz przyk\u0142ad?<\/h3>\n<p>Podobnie jak w przypadku wi\u0119kszo\u015bci tre\u015bci w ka\u017cdym z tych post\u00f3w, staram si\u0119 poda\u0107 przyk\u0142ady, nawet je\u015bli nie jest to specjalnie zrobione w kodzie. By\u0107 mo\u017ce pomo\u017ce to wyja\u015bni\u0107 to jeszcze bardziej:<\/p>\n<ul>\n<li><strong>Interfejsy nie maj\u0105 implementacji.<\/strong> Gwarantuj\u0105 tylko to, co zrobi klasa.<\/li>\n<li><strong>Klasy abstrakcyjne powinny mie\u0107 podstawowy poziom implementacji<\/strong>. Powinno to reprezentowa\u0107, co klasa mo\u017ce posiada\u0107 i zrobi\u0107, ale nie jest kompletna. Wymagaj\u0105 nieco wi\u0119cej implementacji z podklasy.<\/li>\n<\/ul>\n<p>Kiedy pracujesz z kodem obiektowym, mam nadziej\u0119, \u017ce pomo\u017ce to w dostarczeniu wskaz\u00f3wek, kiedy u\u017cywa\u0107 czego. Je\u015bli nie, nie wahaj si\u0119 zostawi\u0107 komentarza (co\u015b, na co cz\u0142onkowie maj\u0105 pozwolenie :).<\/p>\n<p>Co wi\u0119cej, zobaczymy to w praktyce, gdy przejdziemy do pisania kodu obiektowego (zw\u0142aszcza dla WordPressa, ale nie zawsze).<\/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>Zrozumienie r\u00f3\u017cnicy w klasach abstrakcyjnych i interfejsach jest wa\u017cne podczas pisania kodu obiektowego.<\/p>\n","protected":false},"author":1,"featured_media":164774,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845],"tags":[1169],"class_list":["post-229559","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229559","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=229559"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229559\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}