{
    "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\/pl_pl\/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> oraz <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>",
        "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\/pl_pl\/wp-json\/wp\/v2\/posts\/694",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/comments?post=694"
            }
        ],
        "version-history": [
            {
                "count": 3,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/694\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 698,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/694\/revisions\/698"
            }
        ],
        "wp:featuredmedia": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media\/697"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media?parent=694"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/categories?post=694"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/tags?post=694"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}