ch20-TheBoys-ramda-with-react

Before starting this section, make sure to go through the prerequisite where were mirror Heroes to Boys.

Bu bölüme başlamadan önce, Heroesı Boysa yansıttığımız önkoşul bölümünden geçtiğinizden emin olun.

Neden Fonksiyonel Programlama, neden Ramda?

Eğer EcmaScript'e yapılan son önerilere bir göz atarsak, FP'nin yolunun olduğunu ve yeni JS özelliklerinin RamdaJS yardımcı programlarına benzer şekilde olacağını fark ederiz. Bir özet için ES2025'te neler yeni? başlıklı videoya göz atın. Bugün FP ve Ramda'yı öğrenmenin, en azından önümüzdeki on yıl için geleceğe dayanıklı bir JS beceri seti oluşturacağına inanıyoruz.

Tüm seviyelerde TDD ile oluşturulmuş sağlam testlere sahip bir React uygulamamız ve %100 kod kapsamımız var. Önkoşullarda Heroes varlık grubunu Boysa yansıttık. Şimdi cesur yeniden yapılandırmalar deneyebilir ve her şeyin hala çalışıp çalışmadığını görebiliriz.

FP üzerine yazılmış çok sayıda kaynak bulunsa da, özellikle modern React ve TypeScript ile FP ve Ramda kullanımına dair gerçek dünya örneklerine yönelik eksiklikler bulunmaktadır. Bu bölümün bu boşluğu doldurmasını umuyoruz.

Fonksiyonel Programlama JS kaynakları

Bu çalışmayı ilham kaynağı olarak kullanılan kaynaklar şunlardır. Bu bölümden yararlanmak için FP konusunda akıcı olmanız gerekmez, ancak daha sonra bilginizi tamamlamayı tercih ederseniz, bu kaynakları şiddetle önerilir.

Ramda paketini yükleyin

İlerleyen bölümlerde Ramda kullanarak pratik örnekler sunacağız ve bu bilgileri 3 Boys bileşenine uygulayacağız; BoyDetail.tsx, BoyList.tsx ve Boys.tsx.

n bağımsız değişkenli herhangi bir işlev oluşturun ve bunu partial ile sarın. Önceden paketlenmiş olan bağımsız değişkenleri bildirin ve geri kalan bağımsız değişkenler beklenir. Basit bir şekilde anlatmak gerekirse; beş parametreli bir işleve sahipseniz ve bağımsız değişkenlerin üçünü sağlarsanız, son ikisini bekleyen bir işlevle karşılaşırsınız.

partial React dünyasında nerede uygulanabilir? İsimsiz bir işlemin, bir bağımsız değişkenle adlandırılmış bir işlev döndürdüğü herhangi bir olay işleyici. Aşağıdaki iki örnek aynıdır:

handleCancel, tıklama olayını bekleyecektir - onClick={handleCancel} - ve /boys rotasına yönlendirecektir.

Partial'ın benzer uygulamaları Boys.tsx dosyasında bulunabilir.

Hiçbir FP tanıtımı, curry'siz tamamlanmış sayılmaz. Burada basit bir örnek üzerinde duracağız ve daha önce klasik curry'i nasıl kullandığımızı hatırlayacağız.

Curry, React dünyasında nasıl kullanılır? Heroes.tsx, HeroesList.tsx, VillianList.tsx VillainList.tsx bileşenlerinde curry'i kullandığımızı hatırlayacaksınız. O zaman Ramda curry'i kullanmadık, çünkü o zaman çok karmaşık olurdu. İsteğe bağlı olarak şimdi onları değiştirebilirsiniz.

BoysList.tsx bileşenlerinde Ramda curry'i kullanalım.

3 işlev alır; yargı, doğru-sonuç, yanlış-sonuç. Klasik if else veya üçlü operatöre göre avantajı, işlev ifadeleriyle iç içe geçmiş ifadeler veya üçlü değerlerle çok daha yaratıcı hale gelebiliriz. Basit bir örnek ile açıklanabilir:

ifElse React dünyasında nerede uygulanabilir? Klasik if else ifadeleri veya üçlü operatörlerle ifade etmesi zor olan karmaşık koşullu mantık bulunan her yerde. BoyDetail.tsx'deki örnek basit olsa da, Ramda çalışmak icin uygun.

Yukarıdaki değişikliklerin ardından BoyDetail.tsx bileşeni burada. HeroDetail.tsx ile yan yana kıyaslanarak, Ramda kullanımı ve klasik dizi yöntemleri arasındaki fark görülebilir.

pipe, Ramda'nın temelidir; soldan sağa işlev bileşimi gerçekleştirmek için kullanılır - compose ise sağdan sola işlev bileşimidir. Basit bir örnek ile açıklanır:

React dünyasında pipe nerede uygulanabilir? Herhangi bir işlem dizisi uygun olacaktır.

Aşağıdaki 3 çeşit handleCloseModal fonksiyonu Boys.tsx dosyasından eşdeğerdir.

Boys.tsx dosyasından aşağıdaki 3 çeşit handleDeleteBoy fonksiyonu da eşdeğerdir.

Boys.tsx dosyasından aşağıdaki 3 çeşit handleDeleteFromModal fonksiyonu da eşdeğerdir.

Yukarıdaki değişikliklerin ardından Boys.tsx bileşeni burada. Ramda ve klasik dizi yöntemleri arasındaki farkı görmek için Heroes.tsx ile karşılaştırılabilir.

Dizi yöntemleriyle arama filtresini Ramda'ya yeniden düzenleme

Bu örnekte, BoyList.tsx içindeki arama filtresi mantığını, tipler ve verilerle birlikte bağımsız bir TS dosyasına çıkaracağız. Veri heroes dizisine göre (id, name, description gibi) herhangi bir özellikle filtrelemek ve 1 veya daha fazla nesne göstermek istiyoruz. Bunu başarmak için, searchExistsC ve propertyExistsC adlı 2 lego-fonksiyon kullanarak searchPropertiesC'ye, C ise klasik anlamında ulaşırız.

İşlevleri legolar gibi bölmüş olsak da, kodu okurken mantığı çok kolay takip etmek mümkün değildir. Bunun nedeni, birden fazla argüman kullanmak zorunda olmak ve verinin bir dizi öğesinden (bir nesne) bir dizi öğesine değişmesi, ayrıca argümanların yerini değiştirmek zorunda olmaktır. Ramda kullanarak kodu daha okunaklı ve kullanışlı hale getirebiliriz.

.toLowerCase() ve toLower() ile .indexOf() ve indexOf arasında hızlı bir karşılaştırma yapalım. Veri üzerinde zincirleme yerine, Ramda yardımcıları indexOf ve toLower, veriyi argüman olarak alan işlevlerdir:

  • someData.toLowerCase() vs toLower(someData)

  • array.indexOf(arrayItem) vs indexOf(arrayItem, array)

searchExistsC'yi Ramda kullanacak şekilde yeniden düzenleyebiliriz. İşte önce ve sonra yan yana:

Aşağıda, array.find ile Ramda find, Object.values ile Ramda values arasında hızlı bir karşılaştırma bulunmaktadır. Ramda sürümünde verinin sonunda nasıl geldiğine dikkat edin; bu stil ile daha sonra kullanmak üzere bir argümanı kaydedebiliriz.

İşte propertyExistsC'nin Ramda kullanacak şekilde yeniden düzenlenmesi, önce ve sonra yan yana. Akışı klasik sürüme daha benzer hale getirmek için Ramda sürümünü pipe ile güçlendirebiliriz.

Son işlevimiz searchExistsC önceki ikisini kullanır. İşte klasik ve Ramda sürümleri yan yana. Ramda sürümünü geliştirerek 1 argüman alacak hale getirebilir ve veriyi, ne zaman kullanılabilir olduğunu sonra alabiliriz.

İşte her yere kopyalanıp yapıştırılabilen tam örnek dosyası:

Bununla birlikte, searchProperties ve ona yol açan lego-fonksiyonları Ramda sürümleriyle değiştirebiliriz.

İşte ana değişikliklerin karşılaştırması:

İşte bileşenin son hali:

Araçlarımız ve testlerimiz, değişikliklerden sonra hala sağlam durumda ve bu, çok yüksek kapsamaya sahip olmanın lüksüdür. Kodumuza cesur, deneysel yeniden düzenlemeler uygulayabildik ve FP ve Ramda kullanarak kodun daha okunaklı ve çalışılabilir hale gelirken hiçbir şeyin gerilemediğinden emin olduk.

Önce ve sonraya bakmak için, bu bölümle ilgili PR'ı şu adreste bulabilirsiniz: https://github.com/muratkeremozcan/tour-of-heroes-react-cypress-ts/pull/110. Ayrıca Boys dosyalarını Heroes veya Villains ile karşılaştırabilirsiniz.

Last updated