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.
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.
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.