Javascript functional programming: Ramda

Giới thiệu

Như chúng ta đã biết, functional programming là một phương pháp lập trình dựa trên các hàm toán học, tránh việc thay đổi giá trị của dữ liệu. Phương pháp này có nhiều lợi ích như : các khối xử lý độc lập dễ tái sử dụng, thuận lợi cho việc thay đổi logic hoặc tìm lỗi chương trình.
Các ngôn ngữ lập trình dựa trên functional programming đang rất phát triển, tiêu biểu là Haskell, Scala. Đối với javascript, việc lập trình theo functional programming được áp dụng chủ yếu cho kiểu dữ liệu mảng (Array). Ngoài ra chúng ta cũng có những bộ thư viện như Underscore (http://underscorejs.org) hoặc Lodash (https://lodash.com). Trong bài viết này, chúng ta sẽ cùng làm quen với Ramda, một bộ thư viện functional programming, những nét tương đồng và khác biệt với các bộ thư viện trước.

Cài đặt và sử dụng

  • Cài đặt qua npm
npm install ramda
  • Github
    https://github.com/ramda/ramda

  • Gợi ý cách sử dụng các hàm cho các trường hợp tiêu biểu
    https://github.com/ramda/ramda/wiki/What-Function-Should-I-Use%3F

Các đặc điểm khác biệt

So với Lodash và Underscore, Ramda có 2 đặc điểm khác biệt chính
Trong lời gọi thực thi lệnh, Ramda đặt các tham số là hàm ở trước, các tham số dữ liệu ở phía sau. Điều này giúp cho việc kết hợp các hàm dễ dàng, số lượng code ít hơn.
Ví dụ

var users = [
{"name": "LongTV", "age": 29, "gender": "male"},
{"name": "TungBungBu", "age": 29, "gender": "male"},
{"name": "ThuNX", "age": 25, "gender": "male"},
{"name": "HangIn", "age": 27, "gender": "female"}
];

Trong Lodash

var findMen = function(users) {
          return _.filter(users, function(user) { 
            return user.gender === 'male' ; 
          });
        };

Trong Ramda

var findMen = R.filter(R.where({gender: R.equals("male")}));
  • Các hàm có sẵn trong thư viện Ramda đều được áp dụng kỹ thuật currying.
    Ví dụ
    Với Lodash, khai báo như sau là lỗi cú pháp
var addOne = _.add(1);
addOne(2);

Nhưng với Ramda, ta hoàn toàn có thể viết

var addOne = R.add(1);
addOne(2); // => 3

Điều này giúp chúng ta có thể tùy biến các hàm có sẵn thành các hàm mới theo logic mong muốn và kết hợp với đặc tính “hàm đứng trước, dữ liệu ở sau”, việc triển khai sẽ ngắn gọn hơn so với Lodash và Underscore.
* Đối với Lodash ta cũng có thể áp dụng _.curry hoặc _.partial cho chính các hàm có sẵn trong thư viện

var curried = _.curry(_.add);
curried(1)(2); // => 3

Kết luận

Với gần 200 hàm xử lý trong thư viện, Ramda đáp ứng gần như đầy đủ các tính năng xử lý logic như của Lodash và Underscore. Ngoài ra, điểm khác biệt trong thiết lập trật tự tham số giúp cho cách kết hợp các hàm ngắn gọn và dễ dàng. Nếu các bạn quan tâm và muốn sử dụng javascript functional programming, Ramda là một trong số các lựa chọn đáng quan tâm và thử nghiệm.

Tham khảo
http://ramdajs.com/docs/

Add a Comment

Scroll Up