{
    "id": 533,
    "date": "2018-04-24T20:45:35",
    "date_gmt": "2018-04-24T20:45:35",
    "guid": {
        "rendered": "http:\/\/hayperek.pl\/?p=533"
    },
    "modified": "2018-04-24T20:45:35",
    "modified_gmt": "2018-04-24T20:45:35",
    "slug": "kto-ty-jestes-widget-maly-czyli-za-co-lubie-c",
    "status": "publish",
    "type": "post",
    "link": "https:\/\/hayperek.pl\/pl_pl\/2018\/04\/24\/kto-ty-jestes-widget-maly-czyli-za-co-lubie-c\/",
    "title": {
        "rendered": "Kto Ty jeste\u015b? Widget ma\u0142y! &#8211; czyli za co lubi\u0119 C++"
    },
    "content": {
        "rendered": "<p>W jednym z <a href=\"http:\/\/hayperek.pl\/pl_pl\/2018\/03\/23\/software-czyli-jak-tchnac-zycie-w-sprzet\/\">pierwszych artyku\u0142\u00f3w<\/a> niniejszego bloga zastawiali\u015bmy si\u0119 nad wyborem najlepszego j\u0119zyka programowania dla naszego projektu. O ile niskopoziomowa cz\u0119\u015b\u0107, taka jak drivery sprz\u0119tu czy obs\u0142uga protoko\u0142\u00f3w diagnostycznych s\u0105 domen\u0105 j\u0119zyka C, to przechodz\u0105c do wysokopoziomowej cz\u0119\u015bci warto pochyli\u0107 si\u0119 nad jego m\u0142odszym bratem &#8211; C++. <\/p>\n<blockquote><p>Dlaczego? Czy nie lepiej trzyma\u0107 si\u0119 jednego j\u0119zyka tak, aby projekt by\u0142 sp\u00f3jny?<\/p><\/blockquote>\n<p>Jest to bardzo trafny argument, pami\u0119tajmy jednak, i\u017c czysty j\u0119zyk C ma pewne ograniczenia w swojej formie ekspresji. C\u00f3\u017c&#8230; powsta\u0142 prawie p\u00f3\u0142 wieku temu \ud83d\ude42 <a href=\"https:\/\/pl.wikipedia.org\/wiki\/C_(j%C4%99zyk_programowania)\">Nie wierzycie?<\/a><\/p>\n<blockquote><p>Ok. Ale w czym konkretnie C++ b\u0119dzie lepszy od starego, dobrego C?<\/p><\/blockquote>\n<p>Przyjrzyjmy si\u0119 naszym rozwa\u017caniom z <a href=\"http:\/\/hayperek.pl\/pl_pl\/2018\/04\/11\/widgety-cz-2\/\">drugiej cz\u0119\u015bci cyklu o widgetach<\/a>. Wspomina\u0142em tam, i\u017c poj\u0119cie widgetu stanowi pewn\u0105 abstrakcj\u0119, bli\u017cej nieokre\u015blon\u0105 kszta\u0142tem, posiadaj\u0105c\u0105 jednak pewien dobrze zdefiniowany zestaw akcji (<em>czyli jak powiedzia\u0142 by developer &#8211; interfejs)<\/em>. Mo\u017cna wi\u0119c przyj\u0105\u0107, i\u017c widget jest idealnym, ksi\u0105\u017ckowym wr\u0119cz przyk\u0142adem klasy wirtualnej. Na jej bazie mo\u017cna &#8222;nadbudowywa\u0107&#8221; kolejne warstwy konkretnych lub abstrakcyjnych widget\u00f3w-klas potomnych. Trudno wyobrazi\u0107 sobie lepszy j\u0119zyk programowania dla system\u00f3w wbudowanych, kt\u00f3ry b\u0119dzie potrafi\u0142 poradzi\u0107 sobie z tak\u0105 konstrukcj\u0105, ni\u017c C++. <\/p>\n<blockquote><p>Stop. Przecie\u017c bez najmniejszego problemu mo\u017cna stworzy\u0107 namiastk\u0119 klas w C.<\/p><\/blockquote>\n<p>Mo\u017cna, jednak wci\u0105\u017c b\u0119dzie to namiastka. Za u\u017cyciem prawdziwych klas przemawia wiele argument\u00f3w. Po pierwsze pojawia si\u0119 abstrakcja, kt\u00f3ra ogromnie upraszcza proces tworzenia i u\u017cywania widget\u00f3w w naszym systemie. Po drugie zak\u0142adamy, \u017ce b\u0119dziemy dynamicznie tworzy\u0107 wiele instancji widget\u00f3w r\u00f3\u017cnych typ\u00f3w. Po trzecie &#8211; cz\u0119\u015b\u0107 kontrolek b\u0119dzie stanowi\u0107 jedynie &#8222;odmian\u0119&#8221; innych, np. widget pomiaru jest niczym innym jak nieco rozbudowanym tekstem statycznym.<\/p>\n<blockquote><p>A kwestia szybko\u015bci? Kod C b\u0119dzie lepiej zoptymalizowany&#8230;<\/p><\/blockquote>\n<p>Prawda, jednak niewielka poprawa wydajno\u015bci zostanie uzyskana kosztem znacznego pogorszenia czytelno\u015bci i przejrzysto\u015bci kodu. Brak odpowiednich mechanizm\u00f3w na poziomie sk\u0142adni j\u0119zyka spowoduje powstawanie &#8222;potwork\u00f3w&#8221;, kt\u00f3re w d\u0142u\u017cszej perspektywie b\u0119d\u0105 mia\u0142y wi\u0119cej wad ni\u017c zalet. Brak dziedziczenia, a co za tym idzie &#8211; hierarchii typ\u00f3w w j\u0119zyku C spowoduje, \u017ce wszystkie &#8222;abstrakcyjne&#8221; interfejsy b\u0119d\u0105 musia\u0142y nolens volens rzutowa\u0107 niejawnie wska\u017aniki, struktury&#8230; To bardzo nieeleganckie, a co gorsze, niebezpieczne rozwi\u0105zanie, kt\u00f3re dodatkowo utrudnia jakiekolwiek debugowanie kodu.<\/p>\n<p>Pami\u0119tajmy w tym miejscu r\u00f3wnie\u017c o tym, \u017ce tworzymy kod opisuj\u0105cy GUI. Nie wymaga on real-time&#8217;owej responsywno\u015bci &#8211; jego wykonanie mo\u017ce trwa\u0107 nieco d\u0142u\u017cej \ud83d\ude42 Kilka-kilkana\u015bcie milisekund to wieczno\u015b\u0107 z perspektywy CPU, dla cz\u0142owieka to mniej ni\u017c mgnienie oka. Walka o pojedyncze cykle zegara nie jest wi\u0119c absolutnie potrzebna!<\/p>\n<p>Osobi\u015bcie jestem wielkim fanem j\u0119zyka C &#8211; ceni\u0119 go za minimalizm i zwi\u0119z\u0142o\u015b\u0107 semantyki. Pod wieloma wzgl\u0119dami jest to j\u0119zyk idealny do niskopoziomowych zabaw ze sprz\u0119tem czy sprytnych algorytm\u00f3w. jednak w pewnych sytuacjach musz\u0119 uzna\u0107 wy\u017cszo\u015b\u0107 jego m\u0142odszego brata &#8211; i to bez cienia sentymentu!<\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>W jednym z pierwszych artyku\u0142\u00f3w niniejszego bloga zastawiali\u015bmy si\u0119 nad wyborem najlepszego j\u0119zyka programowania dla naszego projektu. O ile niskopoziomowa cz\u0119\u015b\u0107, taka jak drivery sprz\u0119tu czy obs\u0142uga protoko\u0142\u00f3w diagnostycznych s\u0105 domen\u0105 j\u0119zyka C, to przechodz\u0105c do wysokopoziomowej cz\u0119\u015bci warto pochyli\u0107 si\u0119 nad jego m\u0142odszym bratem &#8211; C++. Dlaczego? Czy nie lepiej trzyma\u0107 si\u0119 jednego j\u0119zyka [&hellip;]<\/p>",
        "protected": false
    },
    "author": 1,
    "featured_media": 749,
    "comment_status": "closed",
    "ping_status": "open",
    "sticky": false,
    "template": "",
    "format": "standard",
    "meta": {
        "footnotes": ""
    },
    "categories": [
        3
    ],
    "tags": [],
    "class_list": {
        "0": "post-533",
        "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\/533",
                "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=533"
            }
        ],
        "version-history": [
            {
                "count": 7,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/533\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 750,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/533\/revisions\/750"
            }
        ],
        "wp:featuredmedia": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media\/749"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media?parent=533"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/categories?post=533"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/tags?post=533"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}