Cruft: Công cụ chống lại con quái vật boilerplate

Boilerplate luôn là một con 'quái vật' gây nên nhiều phiền toái cho các lập trình viên, khiến cho năng suất (productivity) của dev bị hao hụt. Vậy đã có những công cụ nào để chiến đấu với con 'quái vật' này?

Upload image

Boilerplate là gì?

Chắc hẳn là developer nào cũng đã nghe qua từ boilerplate. Đây là những dòng code mà nhiều project luôn phải viết đi viết lại mà không có gì thay đổi. Một ví dụ điển hình là những getter setter trong các class Java, hoặc là những tag <html>, <head>, <doctype>,... trong HTML. Những ngôn ngữ như Java được cho là “dài dòng” (verbose) thường sẽ buộc lập trình viên viết rất nhiều boilerplate. Tuy đã có những công cụ như Lombok giúp giảm thiểu số dòng boilerplate mà developer phải gõ, nhưng sẽ tốt hơn nếu không phải viết dòng nào cả. Mặc dù bản thân Python được coi là một ngôn ngữ không ‘verbose' nhưng boilerplate vẫn luôn là một vấn đề không thể tránh khỏi trong tất cả các ngôn ngữ lập trình.

Theo thời gian, chúng ta sẽ có rất nhiều boilerplate trong codebase khi project của chúng ta phát triển. Tất nhiên, những dòng code boilerplate này có khả năng sẽ phải được cập nhật trong tương lai (như khi Framework hoặc các Module chúng ta đang sử dụng có những thay đổi, update mới). Việc cập nhật này luôn là một công việc rất đau đầu và thừa thãi đối với các developer.

Có những cách nào để giải quyết vấn đề boilerplate?

Trước đây, một package trong Python tên là Cookiecutter được tạo nên để hỗ trợ các lập trình viên trong việc tạo project với chức năng khởi tạo project bằng một template có sẵn. Điều này hỗ trợ một cách nhanh chóng và loại bỏ việc copy paste code từ template mà chúng ta thường làm. Tuy nhiên, công cụ này cũng như một con dao hai lưỡi. Mặc dù chúng ta có thể tạo nhiều project nhanh chóng dựa trên một template nhưng khi template ấy có một vài thay đổi thì người lập trình viên sẽ phải tự code để cập nhật những đoạn code trong project đó (cập nhật một cách thủ công). Và nếu có nhiều project đang cùng sử dụng một template, chúng ta sẽ phải tốn rất nhiều effort để thực hiện công việc cập nhật ấy.

So với Cookiecutter, Cruft không chỉ giúp tạo project dựa trên template một cách nhanh chóng, mà có cả những chức năng hỗ trợ công việc quản lý những template mà ta đang sử dụng xuyên suốt quá trình phát triển dự án. Cruft sẽ đảm bảo rằng code của bạn luôn được đồng bộ với chính template mà nó được tạo dựng nên.

Những chức năng nổi bật của Cruft

  • Tương thích với Cookiecutter:

    Cruft sử dụng Cookiecutter làm công cụ quản lý template, do đó Cruft sẽ tương thích với tất cả các template được tạo nên bằng Cookiecutter.

  • So sánh version Template:

    Cruft có khả năng kiểm tra nếu project đang sử dụng template ở phiên bản mới nhất hay không với cruft check.

  • Tự động cập nhật Template:

    Cruft tự động hóa quá trình cập nhật code để đồng bộ với phiên bản template mới nhất, rất hữu dụng cho công việc quản lý template được sử dụng ở nhiều project khác nhau.

Sử dụng Cruft cho dự án

Cài Cruft qua package manager bằng 1 trong 3 cách sau:

pip3 install cruft 

poetry add cruft
 
pipenv install cruft

Tạo project từ template

Tạo project mới từ template Cookiecutter có sẵn qua cú pháp cruft create <template_url>.

cruft create https://github.com/timothycrosley/cookiecutter-python/

Sau đó, Cruft sẽ yêu cầu bạn nhập một vài thông tin để khởi tạo project.

Check project template

Để kiểm tra xem template đang sử dụng có update mới hay không, vào thư mục của project và dùng command cruft check.

cruft check

Cập nhật project template

Để cập nhật project đang sử dụng Cookiecutter template, dùng câu lệnh cruft update trong thư mục gốc của project.

cruft update

Nếu có update, Cruft sẽ cho bạn xem qua những gì sẽ thay đổi trước khi áp dụng tất cả những thay đổi đó vào project.

Upload image

Việc update template ở đây có sự hỗ trợ của git merge, do đó hầu hết các thao tác update của Cruft rất giống với git. Có những lúc chúng ta sẽ phải resolve conflict giống như khi sử dụng git.

Upload image

Link Project

Trước đây, Cookiecutter luôn đảm nhiệm công việc tạo project và copy code từ những template có sẵn, và Cruft cũng được hình thành dựa trên nhiều chức năng của Cookiecutter. Chức năng cruft link sẽ giúp bạn link template Cruft đang sử dụng đến một project đã được tạo trực tiếp bằng Cookiecutter.

cruft link https://github.com/timothycrosley/cookiecutter-python/

Kiểm độ chênh lệch của Project so với Template ban đầu

Sau một khoảng thời gian phát triển dự án, code của bạn có thể sẽ có rất nhiều thay đổi so với Template ban đầu. Bạn có thể xem những khác biệt ở local so với code trên Template bằng chức năng cruft diff.

cruft diff

Nếu Cruft tìm thấy những điểm khác nhau, nó sẽ thông báo những sự thay đổi ấy trên terminal bằng một cách giống git diff.

Ngoài ra, bạn có thể chọn những file mà Cruft sẽ không kiểm tra trong section skip trong file .cruft.json.

Kết luận

Các công cụ hỗ trợ công việc copy paste code từ Template là con dao hai lưỡi. Mặc dù việc tạo project từ template được thực hiện nhanh chóng hơn nhưng sử dụng những công cụ này sẽ khuyến khích việc copy paste các template, dẫn đến có quá nhiều project dùng cùng một template mà không có cách nào quản lý template của tất cả những project đó. Cruft không chỉ có chức năng tạo và dùng template mà còn là một công cụ quản lý template xuyên suốt các dự án Đồng thời, nó cũng giúp giảm thiểu effort để quản lý những dự án đang dùng những template ấy. Có thể thấy, đây sẽ là một công cụ rất hữu ích trong tương lai không xa.

Tham khảo: Thư viện Cruft

Atekco - Home for Authentic Technical Consultants