Netguru
NetguruNetguru

Pierwsze Kroki w Phoenixie Oczami Gościa od Railsów

10.12.20163 min
Pierwsze Kroki w Phoenixie Oczami Gościa od Railsów

W programowaniu jesteśmy obecnie świadkami powrotu paradygmatu funkcjonalnego. Firmy usiłują sprawdzić, czy w niektórych częściach swojego oprogramowania mogą korzystać z języków, takich jak Haskell, Clojure lub Erlang i czy języki te spiszą się lepiej niż podejścia z wykorzystaniem języków obiektowych, takich jak Ruby.

W ostatnim czasie niektórzy członkowie społeczności Ruby przeszli na język zwany Elixir (i na Phoenix, jako ich framework webowy) stworzony przez José Valima - jednego z głównych autorów frameworku Rails. Pomyślałem sobie, że spróbuję przyswoić sobie nowy sposób myślenia związany z paradygmatem funkcjonalnym.

Odchodzimy od Ruby’ego

Phoenix nie korzysta z Ruby, tylko z Elixira. Elixir zaś oparty jest na BEAM - czyli wirtualnej maszynie Erlanga. Erlang powstał w latach 70tych w celu zautomatyzowania przełączników telekomunikacyjnych. Jako, że urządzenia te muszą pracować z milionami połączeń na raz, muszą również wykazywać wysoką odporność na uszkodzenia. Czy umiecie w ogóle wyobrazić sobie sytuację, w której nie będziecie mogli zadzwonić po karetkę tylko dlatego, że przełączniki będą w trakcie serwisu? Elixir może wykorzystywać wszystkie cudeńka Erlanga: sprawdzony w bojach mechanizm garbage collector, który działa dla każdego procesu niezależnie oraz opartą na modelu aktorów współbieżność wykorzystującą platformę OTP (Open Telecom Platform). Ciekawostką jest fakt, że bibliotekę współbieżności dla Javy i JVM - Akka stworzono, gdy twórca Akki nie był w stanie korzystać z Erlanga ze względu na wymagania klienta.

Przejdźmy zatem prosto do programowania i stwórzmy nową aplikację na bazie Phoenixa - frameworka webowego istniejącego w ekosystemie Elixira. Jednym z głównych elementów projektów tworzonych w Elixirze jest narzędzie mix. Jest ono odpowiednikiem do Bundlera w Ruby: kontroluje zależności między projektami. "Phoenix wykorzystuje również mixa do tworzenia zadań, więc jest też odpowiednikiem rake znanego z ekosystemu Ruby’ego". Do tworzenia nowych projektów w Phoenix można użyć generatorów podobnych do tych z Rails i wpisać do terminala:

W ten sposób stworzymy wzór nowego projektu w Phoenix. Tuż po wykonaniu tego polecenia, Phoenix zapyta cię, czy chcesz zainstalować zależności za pomocą polecenia mix deps.get. Działa to wszystko podobnie, jak w Railsach. Spójrzmy zatem na strukturę projektu:

Jak widzimy, różni się ona od tego, z czym mamy do czynienia w aplikacji Rails. Najważniejsze jest to, że cały kod aplikacji znajduje się w folderze app, a nie w folderze web. Widzimy tu również plik package.json. Do kompilowania i wiązania kodu odpowiedzialnego za interfejs użytkownika Phoenix używa narzędzia o nazwie brunch. Od ręki daje nam on również możliwość pisania kodu w ES6 - czyli najnowszej wersji JavaScript transpilowanej do wersji ES5 tak, aby była kompatybilna ze starszymi przeglądarkami, korzystając z kompilatora babel. Co więcej, Phoenix wykrywa każdą zmianę zapisaną w CSS lub JS, automatycznie odświeżając przeglądarkę, co jest niezwykle pomocnym narzędziem programistycznym. Przyjrzyjmy się więc nieco głębiej katalogowi web:

Mimo że wygląda on podobnie do folderu app w Railsach, jest jednak inny. Podobnie jak w Django, wszystkie pliki HTML lądują w folderze templates. Folder views używany jest do przechowywania kodu widoków, co jest ogromnym usprawnieniem, ponieważ pozwala nam to oddzielić logikę widoku od logiki biznesowej naszej aplikacji. Kontrolery są tutaj bardzo podobne do tych wykorzystywanych w Railsach. Działanie modeli przypomina bardziej wzorzec Data Mapper niż ActiveRecord. Obszarem, w którym Phoenix naprawdę błyszczy, jest programowanie z wykorzystaniem channelo, gdzie wspiera on trwałe połączenie z klientem (np. poprzez technologię Web Socket). Procesy maszyny wirtualnej Erlanga są naprawdę niewielkie, w związku z czym możemy tworzyć ich wiele, co z kolei przekłada się na zawiązanie licznych, trwałych połączeń. To dlatego platformy komunikacyjne WhatsAppa i Facebooka zostały napisane właśnie w Erlangu.

Mam nadzieję, że mój post Wam się przyda. Zachęcam was do dzielenia się przemyśleniami i wpisywania ich w komentarzach pod postem. Kolejny artykuł z tej serii dotyczy modeli i migracji: https://bulldogjob.pl/articles/365-phoenix-vs-rails-modele-i-migracje.

Bartosz Łęcki- Ruby on Rails Developer, Netguru

<p>Loading...</p>