{"id":694,"date":"2018-04-17T21:04:24","date_gmt":"2018-04-17T21:04:24","guid":{"rendered":"http:\/\/hayperek.pl\/?p=694"},"modified":"2018-04-17T21:04:24","modified_gmt":"2018-04-17T21:04:24","slug":"okna-cz-1","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/04\/17\/okna-cz-1\/","title":{"rendered":"Okna &#8211; cz. 1"},"content":{"rendered":"<p>Dzi\u015b przyszed\u0142 czas na opakowanie widget\u00f3w w struktur\u0119 nadrz\u0119dn\u0105 &#8211; okno. <\/p>\n<p>Dotychczas widgety, kt\u00f3re tworzyli\u015bmy \u017cy\u0142y w\u0142asnym \u017cyciem, zawieszone &#8222;gdzie\u015b w przestrzeni&#8221;. Ot rysowali\u015bmy je na ekranie i tyle. Nale\u017cy jednak pami\u0119ta\u0107, i\u017c tworzone przez nas urz\u0105dzenie musi udost\u0119pnia\u0107 kilkadziesi\u0105t r\u00f3\u017cnych widok\u00f3w &#8211; okien. Poniewa\u017c przy tej skali &#8222;r\u0119czna&#8221; obs\u0142uga widget\u00f3w jest ma\u0142o efektywna i bardzo pracoch\u0142onna, najlepszym rozwi\u0105zaniem jest delegowanie odpowiedzialno\u015bci za ich rysowanie do obiektu nadrz\u0119dnego. <\/p>\n<p>W ten spos\u00f3b wymuszamy powstanie og\u00f3lnej implementacji &#8222;abstrakcyjnego&#8221; okna, kt\u00f3rego zadaniem b\u0119dzie narysowanie wszystkich nale\u017c\u0105cych do niego widget\u00f3w. Analogiczne do widgetu, okno r\u00f3wnie\u017c b\u0119dzie posiada\u0107 uog\u00f3lniony interfejs w postaci funkcji <em>ZbudujOkno()<\/em> and <em>NarysujOkno()<\/em>. Widzimy tu pewne podobie\u0144stwo w podej\u015bciu oraz abstrakcj\u0119, pozwalaj\u0105c\u0105 odwo\u0142ywa\u0107 si\u0119 z poziomu GUI w ten sam spos\u00f3b do przer\u00f3\u017cnych rodzaj\u00f3w okien.<\/p>\n<blockquote><p>A mo\u017ce okno powinno by\u0107 widgetem! Wystarczy, \u017ce b\u0119dzie dziedziczy\u0107&#8230; <\/p><\/blockquote>\n<p>Stop! A czy okno jest <strong>rodzajem<\/strong> widgetu? Nie, okno to zupe\u0142nie odr\u0119bny byt, kt\u00f3ry mo\u017ce jedynie <strong>zawiera\u0107<\/strong> widgety. Ca\u0142y jego \u015bwiat rz\u0105dzi si\u0119 ju\u017c innymi prawami! Przek\u0142adaj\u0105c to na j\u0119zyk developer\u00f3w &#8211; okno nie powinno dziedziczy\u0107 niczego po widgecie. <\/p>\n<p>Celowo wybra\u0142em ten przyk\u0142ad, aby pokaza\u0107 b\u0142\u0105d cz\u0119sto pope\u0142niany zar\u00f3wno przez mniej jak i bardziej do\u015bwiadczonych programist\u00f3w. Polega on na wykorzystywaniu dziedziczenia w stosunku do klas, kt\u00f3re powinny by\u0107 jedynie obiektami sk\u0142adowymi tworzonej klasy. Zawsze nale\u017cy bowiem zada\u0107 sobie pytanie, czy nowo tworzona klasa stanowi rodzaj innej klasy czy po prostu zawiera j\u0105 w sobie. To daje jasn\u0105 odpowied\u017a, kt\u00f3r\u0105 drog\u0105 p\u00f3j\u015b\u0107. <\/p>\n<blockquote><p>Ale w zasadzie nie ma to przecie\u017c wi\u0119kszego znaczenia? W obu przypadkach mamy dost\u0119p do metod i sk\u0142adowych.<\/p><\/blockquote>\n<p>R\u00f3\u017cnica jest i to przeogromna! Czy <em>Opona <\/em>jest sk\u0142adow\u0105 <em>Samochodu<\/em>, czy mo\u017ce <em>Samoch\u00f3d <\/em>jest rodzajem <em>Opony <\/em>\ud83d\ude42 ? Wyobra\u017amy sobie co by by\u0142o, gdyby nasz <em>Samoch\u00f3d <\/em> odziedziczy\u0142 po <em>Oponie <\/em>interfejs z metod\u0105 <em>Napompuj()<\/em>\ud83d\ude42<\/p>\n<blockquote><p>Ok, nasze okno powinno wi\u0119c zawiera\u0107 widgety&#8230; Ale jak efektywnie przypisa\u0107 ca\u0142\u0105 chmur\u0119 przer\u00f3\u017cnych widget\u00f3w do okna? Tablica? A mo\u017ce lista? <\/p><\/blockquote>\n<p>Jak pami\u0119tamy, na samym pocz\u0105tku stworzyli\u015bmy widget typu Box. Jedynym jego zadaniem by\u0142o grupowanie innych widget\u00f3w. Wystarczy nasze abstrakcyjne okno wyposa\u017cy\u0107 w jeden taki widget, jako element sk\u0142adowy, a nast\u0119pnie przypisa\u0107 do niego pozosta\u0142e widgety &#8211; w tym r\u00f3wnie\u017c np. inne Box&#8217;y. W ten spos\u00f3b zachowana zostaje hierarchia widget\u00f3w w obr\u0119bie okna &#8211; korzeniem drzewa kontrolek b\u0119dzie w\u0142a\u015bnie \u00f3w nadrz\u0119dy Box. Nie musimy r\u00f3wnie\u017c tworzy\u0107 odr\u0119bnego mechanizmu obs\u0142uguj\u0105cego widgety z poziomu okna.<\/p>\n<p>Tyle na dzi\u015b &#8211; z konieczno\u015bci dzisiejsze rozwa\u017cania by\u0142y nieco kr\u00f3tsze \ud83d\ude42 Jutro kontynuacja, jednak w nieco bardziej praktycznym uj\u0119ciu.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dzi\u015b przyszed\u0142 czas na opakowanie widget\u00f3w w struktur\u0119 nadrz\u0119dn\u0105 &#8211; okno. Dotychczas widgety, kt\u00f3re tworzyli\u015bmy \u017cy\u0142y w\u0142asnym \u017cyciem, zawieszone &#8222;gdzie\u015b w przestrzeni&#8221;. Ot rysowali\u015bmy je na ekranie i tyle. Nale\u017cy jednak pami\u0119ta\u0107, i\u017c tworzone przez nas urz\u0105dzenie musi udost\u0119pnia\u0107 kilkadziesi\u0105t r\u00f3\u017cnych widok\u00f3w &#8211; okien. Poniewa\u017c przy tej skali &#8222;r\u0119czna&#8221; obs\u0142uga widget\u00f3w jest ma\u0142o efektywna i [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":697,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-694","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-stodni","9":"post-with-thumbnail","10":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/comments?post=694"}],"version-history":[{"count":3,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/694\/revisions"}],"predecessor-version":[{"id":698,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/694\/revisions\/698"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/697"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}