{"id":229504,"date":"2022-11-21T11:35:00","date_gmt":"2022-11-21T08:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229504"},"modified":"2022-11-21T17:37:07","modified_gmt":"2022-11-21T14:37:07","slug":"programowanie-obiektowe-zrozumienie-interfejsow","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/programowanie-obiektowe-zrozumienie-interfejsow\/","title":{"rendered":"Programowanie obiektowe: zrozumienie interfejs\u00f3w"},"content":{"rendered":"\n<p>W tym miejscu powiedzia\u0142bym, \u017ce fundamenty zrozumienia programowania obiektowego zosta\u0142y ju\u017c po\u0142o\u017cone.<\/p>\n<p>W szczeg\u00f3lno\u015bci om\u00f3wi\u0142em:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Abstrakcja\">Abstrakcja<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Kapsu\u0142kowanie\">Kapsu\u0142kowanie<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Dziedzictwo\">Dziedzictwo<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Wielopostaciowo\u015b\u0107\">Wielopostaciowo\u015b\u0107<\/a><\/li>\n<\/ol>\n<p>I tak, toczy si\u0119 debata na temat tego, co stanowi podstawy (to znaczy, niekt\u00f3rzy nie wrzucaj\u0105 polimorfizmu do mieszanki, chocia\u017c ja to robi\u0119). Ale powy\u017csze cztery powinny zapewni\u0107 solidn\u0105 podstaw\u0119 do dalszego budowania umiej\u0119tno\u015bci programowania obiektowego.<\/p>\n<p>Jest ich wi\u0119cej, ale nie s\u0105dz\u0119, \u017ce s\u0105 tak g\u0142\u0119bokie, szczeg\u00f3\u0142owe lub trudne do zrozumienia, jak niekt\u00f3re z wy\u017cej wymienionych koncepcji. Z drugiej strony r\u00f3\u017cne rzeczy przychodz\u0105 innym \u0142atwiej.<\/p>\n<p>W ka\u017cdym razie kolejne dwa tematy, kt\u00f3re nale\u017cy zrozumie\u0107, to:<\/p>\n<ol>\n<li>Interfejsy<\/li>\n<li>Abstrakcja<\/li>\n<\/ol>\n<p>Opowiem o ka\u017cdym z osobna, ale upewnij si\u0119, \u017ce najpierw przeczyta\u0142e\u015b seri\u0119 <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Podstawy<\/a>, poniewa\u017c powy\u017csze dwa tematy pozwol\u0105 ci na nich polega\u0107 i czerpa\u0107 z nich korzy\u015bci.<\/p>\n<p>Niejasne, wiem, ale pozw\u00f3l, \u017ce wyja\u015bni\u0119, a potem odejd\u0119.<\/p>\n<h2>Zrozumienie interfejs\u00f3w<\/h2>\n<p>Zdecydowanie najcz\u0119stsz\u0105 definicj\u0105 interfejsu, kt\u00f3r\u0105 prawdopodobnie us\u0142yszysz, jest to, \u017ce jest to umowa. To nie jest z\u0142e, ale my\u015bl\u0119, \u017ce pozostawia wiele do \u017cyczenia.<\/p>\n<p>Na przyk\u0142ad, kiedy my\u015blisz o umowach, prawdopodobnie my\u015blisz o czym\u015b, co jest bardzo zaanga\u017cowane, du\u017co \u017cargonu, skomplikowany proces podpisywania czego\u015b, datowania, gotowo\u015bci do pracy i robienia tego dalej.<\/p>\n<p>Ale je\u015bli chodzi o interfejsy programistyczne, tak naprawd\u0119 nie jest. W rzeczywisto\u015bci twierdz\u0119, \u017ce definiowanie interfejs\u00f3w mo\u017ce u\u0142atwi\u0107 programowanie i \u0142agodzi wiele biurokracji, poniewa\u017c sprawia, \u017ce \u200b\u200brzeczy s\u0105 bardzo czarne lub bia\u0142e, je\u015bli chodzi o to, co nale\u017cy zaimplementowa\u0107.<\/p>\n<h3>S\u0142owo o \u201einterfejsach&quot;<\/h3>\n<p>Nasza bran\u017ca u\u017cywa s\u0142owa \u201einterfejs&#8221; do dw\u00f3ch rzeczy:<\/p>\n<ul>\n<li>Projektanci i u\u017cytkownicy u\u017cywaj\u0105 terminu interfejs, aby opisa\u0107 to, co widz\u0105 i jak wchodz\u0105 w interakcj\u0119 z aplikacj\u0105. Obejmuje to takie rzeczy, jak przyciski, listy rozwijane i inne elementy, kt\u00f3rych mo\u017cemy \u201edotyka\u0107&#8221;.<\/li>\n<li>Programi\u015bci u\u017cywaj\u0105 tego terminu w odniesieniu do funkcji, kt\u00f3re podklasa musi zaimplementowa\u0107, aby by\u0142a zgodna z interfejsem. Nazywa si\u0119 to \u201eprogramowaniem do interfejsu&#8221;.<\/li>\n<\/ul>\n<p>To ostatnie zostanie om\u00f3wione w tym artykule. I nie, nie b\u0119dziemy u\u017cywa\u0107 typowych przyk\u0142ad\u00f3w, takich jak programowanie w interfejsie <strong>Animal<\/strong> lub cokolwiek innego. Zamiast tego przyjrzymy si\u0119 temu na podstawie rzeczywistych pr\u00f3bek kodu.<\/p>\n<h3>Programowanie do interfejsu<\/h3>\n<p>Definiujemy \u201eprogramowanie do interfejsu&#8221; jako spos\u00f3b na napisanie kodu, kt\u00f3ry implementuje sygnatury funkcji zdefiniowanych w tym interfejsie.<\/p>\n<p>Ale czym s\u0105 sygnatury metod? M\u00f3wi\u0105c najpro\u015bciej, sygnatury metod obejmuj\u0105:<\/p>\n<ul>\n<li>nazwa nazwy funkcji,<\/li>\n<li>potrzebne argumenty,<\/li>\n<li>modyfikator widoczno\u015bci<\/li>\n<\/ul>\n<p>W kontek\u015bcie klasy zobaczysz to <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) \n  {\n    \/\/ method implementation\n  }\n}\n<\/code><\/pre>\n<p>\u0141atwe, prawda?<\/p>\n<p>W powy\u017cszym kodzie widzimy, \u017ce funkcja <strong>set<\/strong> akceptuje <strong>klucz<\/strong> i <strong>warto\u015b\u0107<\/strong>, kt\u00f3ra b\u0119dzie u\u017cywana, a funkcja jest dost\u0119pna dla ka\u017cdego obiektu, kt\u00f3ry ma odniesienie do klasy.<\/p>\n<p>Ale interfejsy r\u00f3wnie\u017c mog\u0105 to obejmowa\u0107. Jest jednak zastrze\u017cenie: interfejsy nie maj\u0105 implementacji metody.<\/p>\n<p>Wi\u0119c zamiast czego\u015b <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takiego:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) {\n    set_transient($key, $value);\n  }\n}\n<\/code><\/pre>\n<p>Zobaczysz <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">to:<\/a><\/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>Ale w powy\u017cszym kodzie jest te\u017c kilka subtelno\u015bci.<\/p>\n<ul>\n<li>Ten kod nie definiuje go jako klasy. Zamiast tego nazywa to <strong>interfejsem<\/strong>.<\/li>\n<li>Nazwa klasy jest poprzedzona \u201ei&#8221;, aby wskaza\u0107, \u017ce jest to interfejs. Nie jest to wymagane; to konwencja.<\/li>\n<li>Metoda nie ma implementacji. Nie ma nic poza podpisem.<\/li>\n<\/ul>\n<p>Kiedy tworzymy interfejs, m\u00f3wimy, jak wspomniano powy\u017cej, \u017ce ka\u017cda klasa implementuj\u0105ca interfejs b\u0119dzie definiowa\u0107 metody, kt\u00f3re zawiera.<\/p>\n<p>Wi\u0119c gdyby\u015bmy mieli powi\u0105za\u0107 wszystko, co widzieli\u015bmy powy\u017cej, ostateczna implementacja wygl\u0105da\u0142aby <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> (chocia\u017c idealnie trzymaliby\u015bmy to w osobnych plikach):<\/p>\n<pre><code>&lt;?php\n\ninterface iCache {\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n\npublic class SimpleCache implemnents iCache\n{\n  public function set($key, $value)\n  {\n    set_transient($key, $value, DAY_IN_SECONDS);\n  }\n\n  public function get($key)\n  {\n    if (!$this-&gt;has($key))\n    {\n      return false;\n    }\n    return get_transient($key);\n  }\n\n  public function has($key)\n  {\n    return false !== get_transient($key);\n  }\n}\n<\/code><\/pre>\n<p>I tak do siebie pasuj\u0105 interfejsy i klasy.<\/p>\n<h2>Ot\u00f3\u017c \u200b\u200bto?<\/h2>\n<p>M\u00f3wi\u0105c pro\u015bciej, tak. Ale z mojego do\u015bwiadczenia odkry\u0142em, \u017ce chodzi o co\u015b wi\u0119cej ni\u017c tylko definiowanie metod i ich wdra\u017canie.<\/p>\n<p>Cz\u0119sto \u0142atwo jest zdefiniowa\u0107 klasy, nast\u0119pnie zdefiniowa\u0107 interfejs, a nast\u0119pnie zaimplementowa\u0107 interfejs. Ale to <strong>ca\u0142kowicie<\/strong> zacofane. Zamiast tego musimy bardziej strategicznie my\u015ble\u0107 o naszej pracy.<\/p>\n<p>Zamiast cofa\u0107 si\u0119 do interfejsu, kt\u00f3ry ca\u0142kowicie niweczy cel, musimy zacz\u0105\u0107 od szerokiego zakresu, aby nasze klasy mog\u0142y specjalizowa\u0107 si\u0119 w tym, co robi\u0105 przez ca\u0142y czas, jednocze\u015bnie wdra\u017caj\u0105c funkcjonalno\u015b\u0107, kt\u00f3ra jest wsp\u00f3lna nie tylko dla tej klasy, ale tak\u017ce dla innych klas, kt\u00f3re mog\u0105 potrzebowa\u0107 tej samej funkcjonalno\u015bci.<\/p>\n<p>Korzystaj\u0105c z powy\u017cszego przyk\u0142adu, mo\u017cemy mie\u0107 <strong>SimpleCache<\/strong> i <strong>TransientCache<\/strong> lub inny rodzaj pami\u0119ci podr\u0119cznej. Niezale\u017cnie od tego, jaki typ pami\u0119ci podr\u0119cznej zaimplementujemy, zaimplementuj\u0105 one interfejs, a funkcjonalno\u015b\u0107 zostanie pozostawiona klasie implementuj\u0105cej interfejs.<\/p>\n<p>Definiujemy wi\u0119c, jak mo\u017ce wygl\u0105da\u0107 pami\u0119\u0107 podr\u0119czna na wysokim poziomie, ale klasy implementuj\u0105ce dok\u0142adnie okre\u015bl\u0105, jak b\u0119d\u0105 funkcjonowa\u0107.<\/p>\n<hr \/>\n<p>Je\u015bli jeste\u015b programist\u0105 WordPress i chcesz dowiedzie\u0107 si\u0119, jak tworzy\u0107 rzeczy na bazie aplikacji za pomoc\u0105 praktycznych, obiektowych technik, <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dlaczego nie do\u0142\u0105czy\u0107 do witryny?<\/a><\/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>Jedn\u0105 z definicji interfejsu programistycznego jest to, \u017ce jest to kontrakt. My\u015bl\u0119, \u017ce przy rozumieniu interfejs\u00f3w pozostawia wiele do \u017cyczenia.<\/p>\n","protected":false},"author":1,"featured_media":164880,"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-229504","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\/229504","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=229504"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229504\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}