{"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\/en\/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\/en\/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\/en\/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>\n","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\/en\/wp-json\/wp\/v2\/posts\/533","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=533"}],"version-history":[{"count":7,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/533\/revisions"}],"predecessor-version":[{"id":750,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/533\/revisions\/750"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/749"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}