Một thủ thuật nhỏ để tối ưu code nodejs

Tôi code web asp.net c# đã lâu năm rồi, giờ có nhiều framework mới, công nghệ mới nên đôi khi cũng chưa có cơ hội để trải qua. Dù sao cũng là tầng lớp già rồi, khó có thời gian học được cái mới. Chính vì vậy, lựa chọn chơi với các bạn trẻ cũng là một cách học hỏi. Bạn trẻ thì có kiến thức mới nhưng lại thiếu kinh nghiệm. Mình già rồi có kinh nghiệm nhưng lại thiếu kiến thức mới. Già, trẻ chơi với nhau chắc chắn sẽ có bù đắp qua lại. Qua đó mà học hỏi đôi bên với nhau.

Hôm nay thằng cu em cho xem project code bằng nodejs. Có đọc qua vài file controller thì thấy một điều thế này. Đúng là hầu hết các bạn trẻ code static quá nhiều và hơn nữa là copy code đã thành tư tưởng cố hữu. Code cứ dài lê thê mà không đóng gói lại thành hàm, thành đối tượng để tái sử dụng lại. Điều mà tôi có nói tới trong bài viết Tại sao code của tôi thường ngắn gọn như vậy

Đây là file controller history.js mà tôi đã đọc của thằng cu em.

const History = require("../services/history");
const { handleResponse, handleError } = require("../helpers/responseHandler");

const getHistoriesByBet = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getHistoriesByBet(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getHistories = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getHistories(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getBalance = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getBalance(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const createHistory = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.createHistory(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};


const createWithdrawHistory = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.createWithdrawHistory(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getWithdraws = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getWithdraws(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

module.exports = {
  getHistories,
  getBalance,
  createHistory,
  getHistoriesByBet,
  createWithdrawHistory,
  getWithdraws
};

Ở đây có thể hiểu là các hàm api ở controller sẽ gọi đến tầng lấy data để gửi xuống client. Nhưng mà có thể thấy. các hàm getHistories, getBalancecreateHistorygetHistoriesByBet,   createWithdrawHistorygetWithdraws cũng cùng một dạng mà copy đi copy lại.

Chính vì vậy mà tôi dù chưa code NodeJs nhưng cũng đã từng code javascript nên thêm một hàm getResponse như sau

class Controllers {
  //   constructor() {}

  constructor(service) {
    this.Service = service;
  }

  ////
  //// code code 
  ////

  getResponse(method, request, response, next) {
    // console.log('request.body',request.body);
    const service = new this.Service();
    return service[method](request.body) // ddc ko ta?
      .then((result) => this.handleResponse({ result, response }))
      .catch((error) => next(this.handleError({ error, response })));
  }
}

Hàm getResponse trong đó có tham số method, còn Controller có thuộc tính this.Service. Và qua đó sẽ truy vấn this.Service thông qua keymethod để lấy được hàm cần gọi. Và cuối cùng file History.js sẽ còn về được như sau

const History = require("../services/history");
const Controller = require("./Controllers");

class HistoryCtrl extends Controller 
{
    constructor() { super(History) }
    
    getHistoriesByBet = async (request, response, next) => this.getResponse("getHistoriesByBet", request, response, next);
    getBalance = async (request, response, next) => this.getResponse("getBalance", request, response, next);
    createHistory = async (request, response, next) => this.getResponse("createHistory", request, response, next);
    getHistoriesByBet = async (request, response, next) => this.getResponse("getHistoriesByBet", request, response, next);
    createWithdrawHistory = async (request, response, next) => this.getResponse("createWithdrawHistory", request, response, next);
    getWithdraws = async (request, response, next) => this.getResponse("getWithdraws", request, response, next);  
}

module.exports = HistoryCtrl;

Đơn giản vậy thui. Mà đã giảm đi phải tới 80% code ấy chứ. Chưa kể các file controller khác cũng tối ưu tương tự thì cũng một lượng code thừa tương đối được loại bỏ. Đây chỉ một trong rất nhỏ các thủ thuật để tối ưu code cho đơn giản và gọn gàng hơn. Còn nhiều thủ thuật khác mà gặp tùy từng tình huống thì tôi sẽ post để chia sẻ thêm.

Chúc các bạn code ngày càng tốt hơn

Sơn 20

Nếu bạn thấy nội dung chia sẻ này có ích với bạn hãy Donate để tạo động lực cho tôi viết các bài viết tiếp theo nhé. Cảm ơn nhiều !!!!

Bài viết cùng chuyên mục

Hướng dẫn gửi email bằng code C#. Cấu hình tài khoản gmail để gửi email từ phần mềm.

Sử dụng thư viện SmtpClient để gửi email. Cấu hình tài khoản gmail ở trạng thái kém bảo mật để có thể gửi email từ phần mềm.

02/12/2020 Xem chi tiết
Các hướng đi cho lập trình viên khi lựa chọn ngôn ngữ lập trình.

Mình thì lựa chọn phát triển web nên đã chọn chuyên sâu về HTML, Css, Javascript, ASP.NET, SQL

23/11/2020 Xem chi tiết
Mật khẩu kém bảo mật được sử dụng phổ biến trong năm 2020

Bất ngờ với mật khẩu 123456 lại đứng top đầu danh sách. Cứ bảo sao tài khoản hay bị hack. Đúng là sai lầm và chủ quan.

20/11/2020 Xem chi tiết
Xây dựng khung phần mềm trên nền Web giao diện Desktop Window

Đã xây dựng gần như xong khung, chỉ việc viết module business để phát triển phần mềm trên nền tảng Web giao diện Window.

30/10/2020 Xem chi tiết
Tôi đã thiết kế ra design pattern Trứng có trước hay Gà có trước như thế nào

Về ý tưởng này tôi đã thực hiện khoảng 5,6 năm trước do tham gia vào dự án mà xây dựng các khối độc lập nhưng lại có tính năng tương tự nhau

19/10/2020 Xem chi tiết
Chia sẻ một số hiệu ứng Hover hữu ích khi làm Frontend viết bằng css

Gồm các hiệu ứng Hover ZoomIn, Hover Fade, Hover Blur, Hover Zoomout, Hover Mask, Hover Over Text, Hover Fall, Hover Blurout

16/10/2020 Xem chi tiết

Bài viết khác

Tại sao code của tôi thường ngắn gọn như vậy

Khi bắt tay vào thực hiện các yêu cầu tôi thường phân tích kỹ và code trừu tượng.

15/09/2020 Xem chi tiết
Hướng dẫn sử dụng bootstrap tourist để làm trợ giúp cho phần mềm

Làm trợ giúp, hướng dẫn cho khách hàng sử dụng website một cách đơn giản nhất. Tôi cũng đã ứng dụng cho phần mềm của mình.

12/09/2020 Xem chi tiết
Hướng dẫn sử dụng Jquery plugin Lazy Load everything

Đây là plugin tôi chỉnh sửa lại từ thư viện jquery.lazyload.js để từ đó có thể lazy với mọi phần tử và không chỉ riêng cho sử dụng lazy image.

10/09/2020 Xem chi tiết
Thư viện Linq.js trong javascript

Thư viện này cung cấp đầy đủ các phương thức như .NET 4.0 và mở rộng thêm nhiều phương thức khác

10/09/2020 Xem chi tiết
Hướng dẫn sử dụng Jquery Plugin Hotkeys - Tạo phím nóng trên trình duyệt web

Thư viện của tác giả Tzury Bar Yochay được viết từ năm 2010

06/09/2020 Xem chi tiết
Hướng dẫn sử dụng Timer trong Javascript

Định nghĩa đối tượng Timer tương tự như trong WinForm C# để thực hiện task vụ theo chu kỳ bằng Javascript

01/09/2020 Xem chi tiết
{"nalias":"mot-thu-thuat-nho-de-toi-uu-code-nodejs","lang":"2","cattype":"0","catId":"3","UrlEngine":"UrlNewsEngine","site":"1"}