Elm Programlama Dilini Kullanmaya Başlarken

Yayınlanan: 2022-03-11

Çok ilginç ve yenilikçi bir projenin baş geliştiricisi AngularJS'den Elm'e geçmeyi önerdiğinde ilk düşüncem şuydu: Neden?

Sağlam durumda, iyi test edilmiş ve üretimde kanıtlanmış, güzel bir şekilde yazılmış bir AngularJS uygulamamız zaten vardı. Ve AngularJS'den değerli bir yükseltme olan Angular 4, yeniden yazma için doğal bir seçim olabilirdi - yani React veya Vue olabilir. Karaağaç, insanların neredeyse hiç duymadığı, alana özgü garip bir dil gibi görünüyordu.

karaağaç programlama dili

Bu, Elm hakkında bir şey öğrenmeden önceydi. Şimdi, onunla ilgili biraz deneyimle, özellikle AngularJS'den ona geçiş yaptıktan sonra, sanırım bu "neden"e bir cevap verebilirim.

Bu yazıda, Elm'in artılarını ve eksilerini ve bazı egzotik konseptlerinin bir ön uç web geliştiricisinin ihtiyaçlarına nasıl mükemmel şekilde uyduğunu inceleyeceğiz. Daha öğretici benzeri bir Elm dili makalesi için bu blog gönderisine göz atabilirsiniz.

Elm: Tamamen İşlevsel Bir Programlama Dili

Java veya JavaScript ile programlamaya alışkınsanız ve bunun kod yazmanın doğal yolu olduğunu düşünüyorsanız, Karaağaç öğrenmek tavşan deliğinden düşmek gibi olabilir.

Fark edeceğiniz ilk şey, garip sözdizimi: parantez yok, çok sayıda ok ve üçgen.

Kıvrımlı parantezler olmadan yaşamayı öğrenebilirsiniz, ancak kod bloklarını nasıl tanımlar ve iç içe geçirirsiniz? Veya bu konuda for döngüsü veya başka bir döngü nerede? Açık kapsam bir let bloğu ile tanımlanabilirken, klasik anlamda hiçbir blok ve hiçbir döngü yoktur.

Elm, tamamen işlevsel, güçlü bir şekilde yazılmış, reaktif ve olaya dayalı bir web istemci dilidir.

Programlamanın bu şekilde mümkün olup olmadığını merak etmeye başlayabilirsiniz.

Gerçekte, bu nitelikler bir araya gelerek size harika bir programlama ve iyi yazılım geliştirme paradigması sunar.

Tamamen İşlevsel

Java'nın daha yeni sürümünü veya ECMAScript 6'yı kullanarak işlevsel programlama yapabileceğinizi düşünebilirsiniz. Ancak bu sadece görünen yüzü.

Bu programlama dillerinde, dil yapılarının bir cephaneliğine ve işlevsel olmayan kısımlarına başvurma cazibesine hala erişiminiz var. Farkı gerçekten fark ettiğiniz yer, işlevsel programlama dışında hiçbir şey yapamadığınız zamandır. İşte bu noktada, sonunda işlevsel programlamanın ne kadar doğal olabileceğini hissetmeye başlarsınız.

Elm'de neredeyse her şey bir fonksiyondur. Kayıt adı bir işlevdir, birleşim türü değeri bir işlevdir; her işlev, bağımsız değişkenlerine kısmen uygulanan işlevlerden oluşur. Artı (+) ve eksi (-) gibi operatörler bile fonksiyondur.

Bir programlama dilini bu tür yapıların varlığından ziyade tamamen işlevsel olarak ilan etmek için, diğer her şeyin yokluğu çok önemlidir. Ancak o zaman tamamen işlevsel bir şekilde düşünmeye başlayabilirsiniz.

Elm, işlevsel programlamanın olgun kavramları üzerine modellenmiştir ve Haskell ve OCaml gibi diğer işlevsel dillere benzer.

Kesinlikle Yazılı

Java veya TypeScript ile programlıyorsanız, bunun ne anlama geldiğini bilirsiniz. Her değişkenin tam olarak bir türü olmalıdır.

Bazı farklılıklar var tabii. TypeScript'te olduğu gibi, tür bildirimi isteğe bağlıdır. Mevcut değilse, çıkarılacaktır. Ancak “herhangi bir” tip yoktur.

Java, genel türleri destekler, ancak daha iyi bir şekilde. Java'daki jenerikler daha sonra eklendi, bu nedenle aksi belirtilmedikçe türler jenerik değildir. Ve bunları kullanmak için çirkin <> sözdizimine ihtiyacımız var.

Elm'de türler, aksi belirtilmedikçe geneldir. Bir örneğe bakalım. Belirli bir türün listesini alan ve bir sayı döndüren bir yönteme ihtiyacımız olduğunu varsayalım. Java'da şöyle olurdu:

 public static <T> int numFromList(List<T> list){ return list.size(); }

Ve Karaağaç dilinde:

 numFromList list = List.length list

İsteğe bağlı olmasına rağmen, her zaman tür bildirimleri eklemenizi şiddetle tavsiye ederim. Elm derleyicisi asla yanlış türlerde işlemlere izin vermez. Bir insan için, özellikle dil öğrenirken böyle bir hata yapmak çok daha kolaydır. Bu nedenle, tür ek açıklamaları olan yukarıdaki program şöyle olacaktır:

 numFromList: List a -> Int numFromList list = List.length list

Türleri ayrı bir satırda belirtmek ilk başta alışılmadık gelebilir ancak bir süre sonra doğal görünmeye başlar.

Web İstemcisi Dili

Bunun anlamı, Elm'in JavaScript'i derlemesidir, böylece tarayıcılar onu bir web sayfasında çalıştırabilir.

Bu göz önüne alındığında, Java veya Node.js ile JavaScript gibi genel amaçlı bir dil değil, web uygulamalarının istemci bölümünü yazmak için alana özgü bir dildir. Bundan daha da fazlası, Elm hem iş mantığını (JavaScript'in yaptığı) hem de sunum bölümünü (HTML'nin yaptığı) içerir - hepsi tek bir işlevsel dilde.

Bunların tümü, The Elm Architecture olarak adlandırılan, çok özel bir çerçeve benzeri şekilde yapılır.

reaktif

Elm Mimarisi, reaktif bir web çerçevesidir. Modellerdeki herhangi bir değişiklik, açık DOM manipülasyonu olmadan hemen sayfada işlenir.

Bu şekilde Angular veya React'e benzer. Ama Elm de bunu kendi yöntemiyle yapıyor. Temellerini anlamanın anahtarı, view ve update işlevlerinin imzasındadır:

 view : Model -> Html Msg update : Msg -> Model -> Model

Bir Elm görünümü, modelin yalnızca HTML görünümü değildir. Msg türünde mesajlar üretebilen HTML'dir, burada Msg , tanımladığınız tam bir birlik türüdür.

Herhangi bir standart sayfa olayı bir mesaj üretebilir. Ve bir mesaj üretildiğinde, Elm dahili olarak bu mesajla güncelleme fonksiyonunu çağırır, bu daha sonra modeli mesaja ve mevcut modele göre günceller ve güncellenen model tekrar dahili olarak görünüme işlenir.

olay odaklı

JavaScript'e çok benzeyen Elm, olay odaklıdır. Ancak, örneğin, zaman uyumsuz eylemler için bireysel geri aramaların sağlandığı Node.js'den farklı olarak, Elm olayları, tek bir mesaj türünde tanımlanan ayrı mesaj kümelerinde gruplanır. Ve herhangi bir birleşim türünde olduğu gibi, ayrı tür değerlerinin taşıdığı bilgiler herhangi bir şey olabilir.

Mesaj üretebilen üç olay kaynağı vardır: Html görünümündeki kullanıcı eylemleri, komutların yürütülmesi ve abone olduğumuz dış olaylar. Bu nedenle her üç tür de Html , Cmd ve Sub argümanları olarak msg içerir. Ve, genel msg türü üç tanımda da aynı olmalıdır - güncelleme işlevine sağlananla aynı (önceki örnekte, tüm mesaj işlemenin merkezileştirildiği Msg türü, büyük M ile).

Gerçekçi Bir Örneğin Kaynak Kodu

Bu GitHub deposunda eksiksiz bir Elm web uygulaması örneği bulabilirsiniz. Basit olmasına rağmen, günlük istemci programlamasında kullanılan işlevlerin çoğunu gösterir: bir REST uç noktasından veri alma, JSON verilerinin kodunu çözme ve kodlama, görünümleri, mesajları ve diğer yapıları kullanma, JavaScript ile iletişim kurma ve derlemek ve paketlemek için gereken her şey Webpack ile karaağaç kodu.

ELM web örneği

Uygulama, bir sunucudan alınan kullanıcıların bir listesini görüntüler.

Daha kolay bir kurulum/demo süreci için, Webpack'in geliştirme sunucusu hem Elm dahil her şeyi paketlemek hem de kullanıcı listesini sunmak için kullanılır.

Bazı işlevler Elm'de ve bazıları JavaScript'tedir. Bu, önemli bir nedenden dolayı kasıtlı olarak yapılır: Birlikte çalışabilirliği göstermek. Muhtemelen Elm'i başlatmak veya mevcut JavaScript kodunu yavaş yavaş ona geçirmek veya Elm dilinde yeni işlevler eklemek için denemek istersiniz. Birlikte çalışabilirlik sayesinde uygulamanız hem Elm hem de JavaScript koduyla çalışmaya devam eder. Bu muhtemelen tüm uygulamayı Elm'de sıfırdan başlatmaktan daha iyi bir yaklaşımdır.

Örnek koddaki Elm kısmı önce JavaScript'ten gelen yapılandırma verileriyle başlatılır, ardından kullanıcı listesi alınır ve Elm dilinde görüntülenir. Diyelim ki JavaScript'te zaten uygulanmış bazı kullanıcı eylemlerimiz var, bu nedenle Elm'de bir kullanıcı eylemi çağırmak sadece ona geri çağrı gönderir.

Kod ayrıca bir sonraki bölümde açıklanan bazı kavram ve teknikleri de kullanır.

Karaağaç Kavramlarının Uygulanması

Gerçek dünya senaryolarında Elm programlama dilinin bazı egzotik kavramlarını inceleyelim.

Birlik Tipi

Bu, Karaağaç dilinin saf altınıdır. Yapısal olarak farklı verilerin aynı algoritmayla kullanılması gerektiğinde tüm bu durumları hatırlıyor musunuz? Bu durumları modellemek her zaman zordur.

İşte bir örnek: Listeniz için sayfalandırma oluşturduğunuzu hayal edin. Her sayfanın sonunda önceki, sonraki ve tüm sayfalara numaralarına göre bağlantılar verilmelidir. Kullanıcının tıkladığı bağlantı bilgilerini tutmak için nasıl yapılandırırsınız?

Önceki, sonraki ve sayfa numarası tıklamaları için birden fazla geri arama kullanabiliriz veya neyin tıklandığını belirtmek için bir veya iki boole alanı kullanabiliriz veya negatif sayılar, sıfır vb. gibi belirli tamsayı değerlerine özel anlamlar verebiliriz. Ancak hiçbiri bu çözümler tam olarak bu tür bir kullanıcı olayını modelleyebilir.

Elm'de çok basit. Bir birlik türü tanımlardık:

 type NextPage = Prev | Next | ExactPage Int

Ve bunu mesajlardan biri için parametre olarak kullanıyoruz:

 type Msg = ... | ChangePage NextPage

Son olarak, nextPage türünü kontrol etmek için bir case sahip olmak için işlevi güncelleriz:

 update msg model = case msg of ChangePage nextPage -> case nextPage of Prev -> ... Next -> ... ExactPage newPage -> ...

Çok zarif şeyler yapar.

<| İle Birden Çok Harita İşlevi Oluşturma

Birçok modül, farklı sayıda argümana uygulanacak çeşitli varyantları olan bir map işlevi içerir. Örneğin, List map , map5 map2 vardır. Peki ya altı argüman alan bir fonksiyonumuz varsa? map6 yok. Ancak, bunu aşmak için bir teknik var. <| parametre olarak işlev ve kısmi işlevler, bazı argümanlar orta sonuç olarak uygulanır.

Basit olması açısından, bir List yalnızca map ve map2 sahip olduğunu ve üç listede üç argüman alan bir işlev uygulamak istediğimizi varsayalım.

Uygulamanın nasıl göründüğü aşağıda açıklanmıştır:

 map3 foo list1 list2 list3 = let partialResult = List.map2 foo list1 list2 in List.map2 (<|) partialResult list3

Aşağıdaki gibi tanımlanan sayısal argümanlarını çoğaltan foo kullanmak istediğimizi varsayalım:

 foo abc = a * b * c

Yani map3 foo [1,2,3,4,5] [1,2,3,4,5] [1,2,3,4,5] sonucunun sonucu [1,8,27,64,125] : List number .

Burada neler olup bittiğini deşifre edelim.

İlk olarak, partialResult = List.map2 foo list1 list2 , foo kısmen list1 ve list2 içindeki her çifte uygulanır. Sonuç [foo 1 1, foo 2 2, foo 3 3, foo 4 4, foo 5 5] bir parametre alan (ilk ikisi zaten uygulanmış olduğundan) ve bir sayı döndüren işlevlerin listesidir.

List.map2 (<|) partialResult list3 , aslında List.map2 (<|) [foo 1 1, foo 2 2, foo 3 3, foo 4 4, foo 5 5] list3 . Bu iki listenin her bir çifti için (<|) fonksiyonunu çağırıyoruz. Örneğin, ilk çift için (<|) (foo 1 1) 1 , bu da foo 1 1 <| 1 ile aynıdır. foo 1 1 <| 1 üreten foo 1 1 1 1 aynıdır. İkincisi için, (<|) (foo 2 2) 2 olacak, bu da foo 2 2 2 olacak, bu da 8 olarak değerlendirilecek, vb.

Json.Decode onları Json.Decode kadar sağladığından, bu yöntem özellikle birçok alana sahip JSON nesnelerinin kodunu çözmek için mapN işlevleriyle yararlı map8 .

Belkiler Listesinden Tüm Hiçbir Şey Değerlerini Kaldırma

Diyelim ki elimizde bir Maybe değerleri listemiz var ve bir taneye sahip olan öğelerden yalnızca değerleri çıkarmak istiyoruz. Örneğin, liste şudur:

 list : List (Maybe Int) list = [ Just 1, Nothing, Just 3, Nothing, Nothing, Just 6, Just 7 ]

Ve [1,3,6,7] : List Int almak istiyoruz. Çözüm, bu tek satırlık ifadedir:

 List.filterMap identity list

Bunun neden işe yaradığını görelim.

List.filterMap , sağlanan bir listenin öğelerine uygulanan (ikinci bağımsız değişken) bir işlev (a -> Maybe b) ilk argümanın olmasını bekler ve sonuçta ortaya çıkan liste, tüm Nothing değerlerini atlamak için filtrelenir ve ardından gerçek değerler Maybe s'den çıkarılır.

Bizim durumumuzda, identity , bu nedenle ortaya çıkan liste tekrar [ Just 1, Nothing, Just 3, Nothing, Nothing, Just 6, Just 7 ] olur. Süzdükten sonra [ Just 1, Just 3, Just 6, Just 7 ] elde ediyoruz ve değer çıkardıktan sonra [1,3,6,7] istediğimiz gibi oluyor.

Özel JSON Kod Çözme

JSON kod çözme (veya seri durumdan çıkarma) konusundaki ihtiyaçlarımız, Json.Decode modülünde açığa çıkanları aşmaya başladığından, yeni egzotik kod çözücüler oluşturmada sorun yaşayabiliriz. Bunun nedeni, bu kod çözücülerin, örneğin Http yöntemlerinde, kod çözme işleminin ortasından çağrılması ve özellikle sağlanan JSON'da çok fazla alan varsa, giriş ve çıkışlarının her zaman net olmamasıdır.

İşte bu tür vakaların nasıl ele alınacağını gösteren iki örnek.

İlkinde, gelen JSON, a ve b dikdörtgen bir alanın kenarlarını gösteren iki alanımız var. Ancak, bir Elm nesnesinde yalnızca alanını depolamak istiyoruz.

 import Json.Decode exposing (..) areaDecoder = map2 (*) (field "a" int) (field "b" int) result = decodeString areaDecoder """{ "a":7,"b":4 }""" -- Ok 28 : Result.Result String Int

Alanların kodu field int kod çözücü ile ayrı ayrı çözülür ve ardından her iki değer de map2 sağlanan işleve sağlanır. Çarpma ( * ) da bir fonksiyon olduğundan ve iki parametre aldığından, onu bu şekilde kullanabiliriz. Sonuçta ortaya çıkan areaDecoder , uygulandığında işlevin sonucunu döndüren bir kod çözücüdür, bu durumda a*b .

İkinci örnekte, null veya boş dahil herhangi bir dize olabilen dağınık bir durum alanı alıyoruz, ancak işlemin yalnızca “Tamam” ise başarılı olduğunu biliyoruz. Bu durumda, True olarak ve diğer tüm durumlar için False olarak saklamak istiyoruz. Kod çözücümüz şöyle görünür:

 okDecoder = nullable string |> andThen (\ms -> case ms of Nothing -> succeed False Just s -> if s == "OK" then succeed True else succeed False )

Bunu bazı JSON'lara uygulayalım:

 decodeString (field "status" okDecoder) """{ "a":7, "status":"OK" }""" -- Ok True decodeString (field "status" okDecoder) """{ "a":7, "status":"NOK" }""" -- Ok False decodeString (field "status" okDecoder) """{ "a":7, "status":null }""" -- Ok False

Buradaki anahtar andThen işlevinde bulunur; bu, önceki bir null yapılabilir dize kod çözücünün ( Maybe String bir andThen ) sonucunu alır, onu ihtiyacımız olan şeye dönüştürür ve sonucu succeed yardımıyla bir kod çözücü olarak döndürür.

Anahtar Paket Servis

Bu örneklerden de görülebileceği gibi, işlevsel bir şekilde programlama, Java ve JavaScript geliştiricileri için çok sezgisel olmayabilir. Çok fazla deneme yanılma ile buna alışmak biraz zaman alıyor. Anlamaya yardımcı olmak için, ifadelerinizin dönüş türlerini kontrol etmek ve kontrol etmek için elm-repl kullanabilirsiniz.

Bu makalenin önceki bölümlerinde bağlantı verilen örnek proje, bunları anlamanıza yardımcı olabilecek birkaç özel kod çözücü ve kodlayıcı örneği daha içerir.

Ama Yine de, Neden Karaağaç Seçmelisiniz?

Diğer istemci çerçevelerinden çok farklı olan Elm dili kesinlikle "başka bir JavaScript kitaplığı" değildir. Hal böyle olunca onlara göre olumlu ya da olumsuz sayılabilecek pek çok özelliği vardır.

Önce olumlu yönden başlayalım.

HTML ve JavaScript Olmadan İstemci Programlama

Son olarak, hepsini yapabileceğiniz bir diliniz var. Artık ayrılık ve karıştırılmalarının garip kombinasyonları yok. JavaScript'te HTML oluşturma ve bazı sadeleştirilmiş mantık kurallarına sahip özel şablonlama dilleri yok.

Elm ile, tüm ihtişamıyla yalnızca bir sözdizimine ve tek bir dile sahipsiniz.

tekdüzelik

Hemen hemen tüm kavramlar fonksiyonlara ve birkaç yapıya dayandığından, sözdizimi çok özlüdür. Örnek veya sınıf düzeyinde bir yöntem tanımlanıp tanımlanmadığı veya yalnızca bir işlev olup olmadığı konusunda endişelenmenize gerek yok. Bunların tümü modül düzeyinde tanımlanan işlevlerdir. Ve listeleri yinelemenin yüz farklı yolu yoktur.

Çoğu dilde, kodun dilin yolunda yazılıp yazılmadığı konusunda her zaman bu tartışma vardır. Birçok deyimde uzmanlaşmak gerekir.

Elm'de derleniyorsa, muhtemelen “Karaağaç” yoludur. Değilse, kesinlikle değildir.

dışavurumculuk

Kısa olmasına rağmen, Elm sözdizimi çok anlamlıdır.

Bu, çoğunlukla birleşim türlerinin, resmi tür bildirimlerinin ve işlevsel stilin kullanılmasıyla sağlanır. Tüm bunlar daha küçük işlevlerin kullanımına ilham verir. Sonunda, hemen hemen kendi kendini belgeleyen bir kod alırsınız.

Boş Yok

Java veya JavaScript'i çok uzun süre kullandığınızda, null sizin için tamamen doğal bir şey haline gelir - programlamanın kaçınılmaz bir parçası. Ve sürekli olarak NullPointerException s ve çeşitli TypeError s görmemize rağmen, asıl sorunun null öğesinin varlığı olduğunu düşünmüyoruz. Bu çok doğal .

Elm ile bir süre sonra çabucak netleşir. null'a sahip olmamak, yalnızca çalışma zamanı null referans hatalarını tekrar tekrar görmemizi engellemekle kalmaz, aynı zamanda gerçek değere sahip olamayabileceğimiz tüm durumları açıkça tanımlayıp ele alarak daha iyi kod yazmamıza yardımcı olur, böylece null değerini ertelemeyerek teknik borcu da azaltır. bir şey kırılana kadar idare etmek.

İşe Yarayacağına Güven

Sözdizimsel olarak doğru JavaScript programları oluşturmak çok hızlı bir şekilde yapılabilir. Ancak, gerçekten işe yarayacak mı? Peki sayfayı tekrar yükleyip iyice test ettikten sonra bakalım.

Elm ile tam tersi. Statik tür denetimi ve zorunlu null denetimlerle, özellikle yeni başlayanlar bir program yazdığında, derlemek için biraz zamana ihtiyaç duyar. Ancak, bir kez derlendiğinde, düzgün çalışması için iyi bir şans vardır.

Hızlı

Bu, bir istemci çerçevesi seçerken önemli bir faktör olabilir. Kapsamlı bir web uygulamasının yanıt verebilirliği, genellikle kullanıcı deneyimi ve dolayısıyla tüm ürünün başarısı için çok önemlidir. Ve testlerin gösterdiği gibi, Elm çok hızlı.

Elm'in Artıları ve Geleneksel Çerçeveler

Geleneksel web çerçevelerinin çoğu, web uygulaması oluşturmak için güçlü araçlar sunar. Ancak bu gücün bir bedeli vardır: bunların nasıl ve ne zaman kullanılacağına dair birçok farklı kavram ve kural içeren aşırı karmaşık mimari. Hepsine hakim olmak çok zaman alıyor. Denetleyiciler, bileşenler ve yönergeler vardır. Ardından derleme ve yapılandırma aşamaları ile çalıştırma aşaması gelir. Ardından, sağlanan yönergelerde kullanılan hizmetler, fabrikalar ve tüm özel şablon dilleri vardır - sayfayı yenilemek için doğrudan $scope.$apply() çağırmamız gereken tüm bu durumlar ve daha fazlası.

Elm'in JavaScript'e derlemesi de kesinlikle çok karmaşıktır, ancak geliştirici, bunun tüm somunlarını ve cıvatalarını bilmek zorunda kalmaktan korunur. Sadece biraz Elm yazın ve derleyicinin işini yapmasına izin verin.

Ve Neden Karaağaç Seçmiyorsunuz?

Elm'i övmek yeter. Şimdi, onun pek de iyi olmayan yanlarından bazılarını görelim.

belgeler

Bu gerçekten önemli bir sorun. Karaağaç dili ayrıntılı bir kılavuzdan yoksundur.

Resmi eğitimler sadece dili gözden geçirir ve birçok cevapsız soru bırakır.

Resmi API referansı daha da kötü. Pek çok işlev, herhangi bir açıklama veya örnekten yoksundur. Ve bir de şu cümleye sahip olanlar var: "Bu kafa karıştırıcıysa, Elm Mimarisi Eğitimi üzerinden çalışın. Gerçekten yardımcı oluyor!” Resmi API belgelerinde görmek istediğiniz en büyük satır değil.

Umarım, bu yakında değişecek.

Elm'in bu kadar zayıf belgelerle, özellikle de Java veya JavaScript'ten gelen ve bu tür kavramların ve işlevlerin hiç de sezgisel olmadığı insanlarla yaygın olarak benimsenebileceğine inanmıyorum. Bunları kavramak için çok sayıda örnek içeren çok daha iyi belgelere ihtiyaç vardır.

Biçim ve Boşluk

Kıvrımlı parantezlerden veya parantezlerden kurtulmak ve girinti için beyaz boşluk kullanmak güzel görünebilir. Örneğin, Python kodu çok düzgün görünüyor. Ancak elm-format yaratıcıları için bu yeterli değildi.

Tüm çift satır boşlukları ve birden çok satıra bölünmüş ifadeler ve atamalar ile Elm kodu yataydan daha dikey görünüyor. Eski güzel C'deki tek astar ne olurdu, Elm dilinde kolayca birden fazla ekrana yayılabilir.

Yazılan kod satırlarıyla ödeme alıyorsanız, bu kulağa hoş gelebilir. Ancak, bir şeyi 150 satır önce başlayan bir ifadeyle hizalamak istiyorsanız, doğru girintiyi bulma konusunda iyi şanslar.

Kayıt İşleme

Onlarla çalışmak zordur. Bir kaydın alanını değiştirmek için kullanılan sözdizimi çirkindir. İç içe alanları değiştirmenin veya rastgele alanlara ada göre başvurmanın kolay bir yolu yoktur. Erişimci işlevlerini genel bir şekilde kullanıyorsanız, düzgün yazma konusunda çok fazla sorun vardır.

JavaScript'te bir kayıt veya nesne, birçok yolla oluşturulabilen, erişilebilen ve değiştirilebilen merkezi yapıdır. JSON bile bir kaydın yalnızca serileştirilmiş bir versiyonudur. Geliştiriciler web programlamada kayıtlarla çalışmaya alışkındır, bu nedenle birincil veri yapısı olarak kullanılırlarsa Elm'de kullanımlarındaki zorluklar fark edilebilir hale gelebilir.

Daha Fazla Yazma

Elm, JavaScript'ten daha fazla kod yazılmasını gerektirir.

Dize ve sayı işlemleri için örtük tür dönüşümü yoktur, bu nedenle çok sayıda int-float dönüşümü ve özellikle toString çağrıları gerekir, bu da daha sonra doğru sayıda argümanla eşleşmesi için parantezler veya işlev uygulama sembolleri gerektirir. Ayrıca, Html.text işlevi, bağımsız değişken olarak bir dize gerektirir. Tüm bu Maybe s, Results , türler vb. için birçok vaka ifadesi gereklidir.

Bunun ana nedeni katı tip sistemdir ve bu, ödenmesi gereken adil bir bedel olabilir.

JSON Kod Çözücüler ve Kodlayıcılar

Daha fazla yazmanın gerçekten öne çıktığı bir alan JSON işlemedir. JavaScript'teki bir JSON.parse() çağrısı, Elm dilinde yüzlerce satıra yayılabilir.

Tabii ki, JSON ve Elm yapıları arasında bir tür eşlemeye ihtiyaç var. Ancak aynı JSON parçası için hem kod çözücüler hem de kodlayıcılar yazma ihtiyacı ciddi bir sorundur. REST API'leriniz yüzlerce alana sahip nesneleri aktarırsa, bu çok fazla iş olacaktır.

Sarmak

Elm hakkında gördük, muhtemelen programlama dilleri kadar eski olan iyi bilinen soruları cevaplamanın zamanı geldi: Rekabetten daha mı iyi? Projemizde kullanmalı mıyız?

Her alet çekiç olmadığı ve her şey çivi olmadığı için ilk sorunun cevabı öznel olabilir. Elm, birçok durumda diğer web istemci çerçeveleri üzerinde parlayabilir ve daha iyi bir seçim olabilirken, diğerlerinde yetersiz kalabilir. Ancak, web ön uç geliştirmeyi alternatiflerinden çok daha güvenli ve kolay hale getirebilecek gerçekten benzersiz bir değer sunar.

İkinci soru için, aynı zamanda eski “duruma göre değişir” ile cevap vermekten kaçınmak için basit cevap şudur: Evet. Bahsedilen tüm dezavantajlara rağmen, Elm'in programınızın doğru olduğuna dair size verdiği güven, onu kullanmak için yeterli bir nedendir.

Elm'de kodlama da eğlencelidir. “Geleneksel” web programlama paradigmalarına alışmış herkes için tamamen yeni bir bakış açısı.

Gerçek kullanımda, uygulamanızın tamamını hemen Elm'e geçirmeniz veya içinde tamamen yeni bir uygulama başlatmanız gerekmez. Arayüzün bir kısmından veya Elm dilinde yazılmış bazı işlevlerden başlayarak, denemek için JavaScript ile birlikte çalışabilirliğinden yararlanabilirsiniz. İhtiyaçlarınıza uygun olup olmadığını hızlı bir şekilde öğrenecek ve daha sonra kullanımını genişletecek veya bırakacaksınız. Kim bilir, işlevsel web programlama dünyasına da aşık olabilirsiniz.

İlgili: Ön Uç Geliştirme için ClojureScript'i Ortaya Çıkarma