Giới thiệu thư viện lập trình hàm Ramda

Giới thiệu thư viện lập trình hàm Ramda

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » Xem thêm

Ramda là gì?

Ramda là một thư viện có chứa rất nhiều hàm tiện ích hỗ trợ cho lập trình Javascript. Nếu bạn đã nghe hoặc từng sử dụng lodash thì có thể hình dung ra chức năng của Ramda cũng gần tương tự. Còn nếu bạn chưa từng nghe hoặc chưa từng biết đến cả hai thì hãy đọc tiếp phần dưới đây nhé.

Tính tiện ích của Ramda

Một vấn đề rất đơn giản được đặt ra là hãy lấy thuộc tính "name" trong một object person.

const person = {
  name: "Coffee",
  age: 18,
}

Đơn giản phải không chúng ta chỉ cần gọi person.name lập tức sẽ lấy được dữ liệu là "Coffee". Bạn có thể sử dụng cách này để nhanh chóng lấy ra được dữ liệu tuy nhiên giả sử person có giá trị null hoặc undefined thì sao? Tốt nhất hãy gói nó thành một hàm tiện ích để tái sử dụng.

Bây giờ hãy làm nó linh hoạt bằng cách viết hàm chuyên để lấy một thuộc tính của object.

function get(obj, attr) {
  return obj[attr];
}

Giờ thì chúng ta có thể gọi get(person, "name") để nhận được dữ liệu là "Coffee".

Tuy nhiên hàm trên có vẻ còn chưa ổn, nếu obj là undefined hoặc null hay đơn giản nó không phải là một Object thì hàm get sẽ bị lỗi. Bạn có thể kiểm tra một vài điều kiện trước khi lấy giá trị, điều đó chỉ tốn chút thời gian và công sức của bạn thôi.

Hiểu được vấn đề đó, Ramda đã viết sẵn cho bạn một hàm có tên là prop chuyên để lấy giá trị của thuộc tính.

const R = require('ramda');

R.prop("name", person); // Coffee
// hoặc
R.prop("name")(person); // Coffee
// hoặc
const getName = R.prop("name");
getName(person); // Coffee

Oh, nếu chỉ có thế thôi thì sao mọi người lại thích dùng nhỉ? Bởi vì prop chỉ là một trong số rất nhiều hàm mà Ramda hỗ trợ. Còn nhiều hàm khác cung cấp những tính năng mạnh mẽ mà bạn không cần phải mất thời gian viết lại, hơn thế nữa chúng còn có thể dễ dàng kết hợp lại với nhau để trở nên "bá đạo" hơn.

Ví dụ kết hợp các hàm Ramda lại để lọc trong danh sách people những đối tượng có "age" > 18 và sắp xếp lại theo thứ tự giảm dần của "age".

R.pipe(
  R.filter(
    R.pipe(R.prop('age'), R.lt(18)),
  ),
  R.sortWith([
    R.descend(R.prop('age')),
  ])
)(people)

Thoạt nhìn thì đoạn mã trên có hơi dài và khó hiểu. Để có thể hiểu và áp dụng được Ramda thì cách duy nhất là các bạn cần xem mô tả tất cả các hàm trên trang chủ của nó. Đồng thời bạn cũng cần phải hiểu được các hàm curry hoạt động như thế nào.

Tại sao tôi nên sử dụng Ramda?

Như đã giới thiệu ở đầu bài, bởi vì Ramda là tập hợp các hàm tiện ích chung thích hợp cho nhiều bài toán. Một điều khác biệt với các thư viện tiện ích tương tự khác đó là Ramda mang phong cách của lập trình hàm (Functional Programming) chính vì thế Ramda là thư viện thường được sử dụng trong những dự án mang phong cách của lập trình hàm.

Ramda có gì đặc biệt?

Ramda được thiết kế theo phong cách lập trình hàm, vì thế tính bất biến và các hàm thuần tuý là trọng tâm của nó. Điều này giúp bạn xử lý mã đơn giản và tường minh.

Các hàm trong Ramda hầu hết đều hỗ trợ curry. Điều này cho phép bạn dễ dàng xây dựng các hàm mới từ các hàm cũ bằng cách không cung cấp các tham số cuối cùng.

Các tham số của hàm được sắp xếp để thuận tiện cho việc áp dụng curry function. Dữ liệu cuối thường được yêu cầu sau cùng.

Tổng kết

Bài viết này chỉ mang tính chất giới thiệu đến mọi người một thư viện tiện ích hỗ trợ lập trình hàm Javascript Ramda. Ramda cung cấp rất nhiều hàm tập trung giải quyết một vấn đề nhỏ, bên cạnh đó bạn có thể dễ dàng kết hợp chúng lại với nhau để tạo nên một chương trình mạnh mẽ.

Khi ramda trở thành tiếng nói chung trong nhiều dự án thì sẽ giúp mọi người dễ dàng triển khai và bảo trì hơn.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Tùng Nguyễn3 năm trước

Ảo quá thấy cách viết này còn khó hiểu hơn

Trả lời
Avatar
Xuân Hoài Tống2 năm trước

@gif [10JhviFuU2gWD6]