{"id":187,"date":"2008-12-13T00:24:54","date_gmt":"2008-12-12T23:24:54","guid":{"rendered":"http:\/\/eriz.pcinside.pl\/weblog\/filozofia-programowania-frameworki-187.html"},"modified":"2008-12-13T00:25:15","modified_gmt":"2008-12-12T23:25:15","slug":"filozofia-programowania-frameworki","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/filozofia-programowania-frameworki-187.html","title":{"rendered":"Filozofia programowania &#8211; frameworki"},"content":{"rendered":"<p>Kto dzisiaj pisze aplikacje bez framework\u00f3w, hy? Znajdzie si\u0119 kto\u015b? No dobra, mo\u017ce jacy\u015b pocz\u0105tkuj\u0105cy, ale tak, czy tak &#8211; pr\u0119dzej, czy p\u00f3\u017aniej &#8211; z\u0142apie za jak\u0105\u015b bibliotek\u0119 i b\u0119dzie (oby ;)) rozwi\u0105zywa\u0107 kolejne problemy. Kiedy\u015b, kiedy\u015b poj\u0119cie frameworka by\u0142o znane raczej tylko przez programist\u00f3w Javy, w kt\u00f3rej pisanie bez zestawu odpowiednich bibliotek jest koszmarem (IMHO Java jest koszmarem ze wzgl\u0119du na wydajno\u015b\u0107 dzia\u0142aj\u0105cych aplikacji :P).<\/p>\n<p>Dzisiaj w praktycznie ka\u017cdym j\u0119zyku programowania mamy do wyboru co najmniej kilka r\u00f3\u017cnych framework\u00f3w.<\/p>\n<p><!--more--><\/p>\n<h3>sens?<\/h3>\n<p><q>Czas, to pieni\u0105dz<\/q>, to powiedzenie nie omija r\u00f3wnie\u017c \u015bwiata zwyk\u0142ych klepaczy kodu (kadz\u0105cych?). A \u017ce zgodnie z kodeksem chakiera nigdy nie lubi si\u0119 nudzi\u0107, wi\u0119c chce sobie jako\u015b u\u0142atwi\u0107 swoj\u0105 n\u0119dzn\u0105, wielobajtow\u0105 egzystencj\u0119 nie zawracaj\u0105c sobie gitary takimi pierdo\u0142ami, jak np. zamykanie po\u0142\u0105cze\u0144, obs\u0142uga protoko\u0142\u00f3w, itp. Apogeum lenistwa wyst\u0119puje IMHO w Javie, gdzie <em>garbage collector<\/em> dzia\u0142a nawet jako osobny w\u0105tek. No i ten pomys\u0142 jednak si\u0119 przyj\u0105\u0142, gdy\u017c inne j\u0119zyki sobie zaimplementowa\u0142y uleniwiacza&#8230;<\/p>\n<p>To by\u0142y takie skrajne przypadki, ale do rzeczy. Pisz\u0119 akurat o frameworkach, gdy\u017c patrz\u0105c na coraz to nowsze twory zaczynam si\u0119 zastanawia\u0107, w jakim kierunku to wszystko zmierza. Skupi\u0119 si\u0119 tu bardziej na przypadku PHP, gdy\u017c to w nim najwi\u0119cej kadz\u0119. Framework\u00f3w powsta\u0142o multum, w PHP5 poprawiono jako tako obiekt\u00f3wk\u0119, co pozwoli\u0142o na zbieranie do kupy wszystkiego, co porozrzucane po ca\u0142ym projekcie.<\/p>\n<p>Jaki\u015b czas temu rozgryza\u0142em Cake&#8217;a, przyznam, \u017ce nie by\u0142o to zbyt przyjemne starcie. Przeci\u0119tny wsp\u00f3\u0142czesny framework tak naprawd\u0119 tworzy nowy j\u0119zyk programowania, nowe metody, kt\u00f3rych albo zabrak\u0142o w pierwotnym \u015brodowisku, albo stanowi\u0105 u\u0142atwiacz dla kodera. Niestety, wygoda idzie w przeciwnym zwrocie do wydajno\u015bci. I tak, zamiast jakich\u015b prostych konstrukcji, to w skrajnych przypadkach, w obiekty nied\u0142ugo b\u0119dzie si\u0119 wciska\u0142o zwyk\u0142e &#8222;pierdni\u0119cie&#8221;.<\/p>\n<h3>wzorce (projektowe :P)<\/h3>\n<p>A ile to ju\u017c tzw. <a href=\"http:\/\/pl.wikipedia.org\/wiki\/Wzorzec_projektowy_(informatyka)\">powsta\u0142o<\/a>&#8230; Huh, sporo nawet. Nad nimi nie mog\u0105 ju\u017c zapanowa\u0107 tw\u00f3rcy danego j\u0119zyka programowania, powstaj\u0105 IMHO &#8222;z buszu&#8221;, tak naprawd\u0119 ka\u017cdy mo\u017ce zrobi\u0107 co\u015b po swojemu, przekona\u0107 do stosowania odpowiedni\u0105 grup\u0119 ludzi i wio. Chocia\u017cby przekazywanie zmiennych globalnych do konkretnej funkcji. Metod jest co najmniej trzy &#8211; <a href=\"http:\/\/pl.wikipedia.org\/wiki\/Wzorzec_projektowy_(informatyka)\">Singleton<\/a>, Registry, czy przekazywanie referencji w parametrach funkcji. Ka\u017cde rozwi\u0105zanie ma swoje wady i zalety, zwolennik\u00f3w jest co najmniej tylu, ile rozwi\u0105za\u0144.<\/p>\n<p>I jak tu si\u0119 dogada\u0107? Jak wybra\u0107 najlepsze rozwi\u0105zanie? Moim zdaniem, nie da si\u0119. Taaa, nie da si\u0119. Zaproponujesz jedno rozwi\u0105zanie, zaraz odezw\u0105 si\u0119 zwolennicy drugiego i b\u0119d\u0105 pi\u0119tnowa\u0107 pozosta\u0142e. Ot tak, jak odwieczna wojna oboz\u00f3w Windows-Linux.<\/p>\n<p>Zada\u0107 jeszcze pytanie, kt\u00f3ry framework jest najlepszy, to ju\u017c masochizm, pole do flamewaru&#8230;<\/p>\n<h3>fanatyzm?<\/h3>\n<p>To okre\u015blenie coraz cz\u0119\u015bciej przewija si\u0119 w mojej g\u0142owie patrz\u0105c na problemy u\u017cyszkod&#8230; u\u017cytkownik\u00f3w r\u00f3\u017cnych bibliotek. No tak. Nied\u0142ugo do wy\u015bwietlenia <em>hello world<\/em> b\u0119dzie inicjowanych kilkana\u015bcie obiekt\u00f3w, kt\u00f3re wyci\u0105gn\u0105 jakie\u015b zupe\u0142nie niepotrzebne pierdo\u0142y.<\/p>\n<p>Zadaj\u0105c pytanie le\u015bne: <q>po kiego grzyba?<\/q> No ludzie, przecie\u017c trzeba czasem zachowa\u0107 i umiar&#8230;<\/p>\n<p>No rozumiem u\u017cycie frameworka w celu zmajstrowania jakiego\u015b zestawu bibliotek, kt\u00f3re zautomatyzuj\u0105 cz\u0119sto implementowan\u0105 funkcjonalno\u015b\u0107. Ale wynajdywania ko\u0142a na nowo ju\u017c zupe\u0142nie nie zdzier\u017c\u0119, jak to ma miejsce w np. Cake&#8217;u. Dawno mia\u0142em z nim styczno\u015b\u0107, ale przyznam, \u017ce funkcje samego j\u0119zyka stanowi\u0105 mniej ni\u017c kilka, mo\u017ce kilkana\u015bcie procent ca\u0142ego kodu aplikacji. Reszta, to odwo\u0142ania do obiekt\u00f3w. No i pseudofunkcje, kt\u00f3re bardzij odwo\u0142uj\u0105 si\u0119 do formy, a nie tre\u015bci. Co z tego, \u017ce wygodniutkie, jak <em>is_callable<\/em> jest wywo\u0142ywane kilkadziesi\u0105t razy? Wydajno\u015b\u0107? Phi&#8230; Nie ta epoka, to nie <acronym title=\"Commodore 64\">C64<\/em>.<\/p>\n<p>Wielu si\u0119 pewnie zas\u0142oni, \u017ce takie rozwi\u0105zania umo\u017cliwiaj\u0105 uniezale\u017cnienie logiki od \u015brodowiska. Ale tak naprawd\u0119, to czy w ten spos\u00f3b osi\u0105gnie si\u0119 maksimum efekt\u00f3w? Chocia\u017cby warstwy abstrakcji baz danych. Generowanie prostych zapyta\u0144 przez sklejanie element\u00f3w tablicy. Albo pobieranie struktury bazy za ka\u017cdym razem&#8230; <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_worry.png\" alt=\":S\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Koszmar, jakich czas\u00f3w ja do\u017cy\u0142em?<\/p>\n<p>Zmiana silnika bazy danych, to s\u0105 naprawd\u0119 ma\u0142e przypadki (mam na my\u015bli rozwi\u0105zania dedykowane, a nie skrypty do udost\u0119pniania), poza tym &#8211; mo\u017cna p\u00f3j\u015b\u0107 na kompromis i stworzy\u0107 obiekty, kt\u00f3re zawieraj\u0105 odpowiednie zapytania dostosowane do konkretnego systemu. Przecie\u017c mo\u017cna nieraz przerzuci\u0107 odpowiednie instrukcje do procedur bazy&#8230;<\/p>\n<h3>herezje<\/h3>\n<p>Pewnie niekt\u00f3rzy z Was zaczn\u0105 mnie teraz miesza\u0107 z b\u0142otem, \u017ce jestem <q>nie z tej epoki<\/q>, \u017ce jestem staro\u015bwiecki, ma\u0142o elastyczny, czy jeszcze jakie\u015b inne okre\u015blenia. Owszem, jestem z poprzedniej epoki. <q>640 KiB wystarczy!<\/q> Jako\u015b programi\u015bci tworz\u0105cy dla demosceny s\u0105 w stanie wycisn\u0105\u0107 wszystko max.<\/p>\n<p>Patrz\u0105c tendencyjnie, to odnosz\u0119 wra\u017cenie, \u017ce z roku na rok przybywa coraz wi\u0119cej powod\u00f3w do zastanawiania si\u0119&#8230; Chocia\u017cby wzorce projektowe. C\u00f3\u017c, nic nie stoi w miejscu, <q>kto stoi w miejscu, ten si\u0119 cofa<\/q>. Ale rozwija\u0107 si\u0119 trzeba z g\u0142ow\u0105, a nie wg owczego p\u0119du.<\/p>\n<p>Najbardziej zaskakuje mnie jednak to, \u017ce napisanie jednej biblioteki jest w stanie wypromowa\u0107 wymar\u0142y j\u0119zyk. Tak by\u0142o np. w przypadku Ruby i frameworka Rails&#8230; Nie pa\u0142am do niego sympati\u0105, nie kryj\u0119 tego. <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_tongue.png\" alt=\":P\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>Ale mo\u017ce by tak kto\u015b napisa\u0142 frameworka do <a href=\"http:\/\/pl.wikipedia.org\/wiki\/Brainfuck\">Brainfucka<\/a>? <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_tongue.png\" alt=\":P\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Promujmy!<\/p>\n<p>A co s\u0105dzicie Wy, Czytelnicy? Czy grozi nam <em>hello world<\/em> w kilku tysi\u0105cach linijek?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kto dzisiaj pisze aplikacje bez framework\u00f3w, hy? Znajdzie si\u0119 kto\u015b? No dobra, mo\u017ce jacy\u015b pocz\u0105tkuj\u0105cy, ale tak, czy tak &#8211; pr\u0119dzej, czy p\u00f3\u017aniej &#8211; z\u0142apie za jak\u0105\u015b bibliotek\u0119 i b\u0119dzie (oby ;)) rozwi\u0105zywa\u0107 kolejne problemy. Kiedy\u015b, kiedy\u015b poj\u0119cie frameworka by\u0142o znane raczej tylko przez programist\u00f3w Javy, w kt\u00f3rej pisanie bez zestawu odpowiednich bibliotek jest koszmarem [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,12],"tags":[40,30,52],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/187"}],"collection":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/comments?post=187"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/187\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}