Một ứng dụng backend điển hình có ba mối quan tâm khác nhau: nhận/trả HTTP (presentation), logic nghiệp vụ (service/domain), và truy cập dữ liệu (repository). Tách chúng thành các tầng nghĩa là mỗi tầng chỉ biết việc của mình và phụ thuộc một chiều xuống dưới. Lý do thực tế: khi logic nghiệp ...
Code smell là những dấu hiệu bề mặt gợi ý có vấn đề sâu hơn về thiết kế — duplicated code, long method, magic number, large class, primitive obsession. Bản thân smell không phải bug; nó là "mùi" cảnh báo code sẽ khó sửa, dễ sai khi thay đổi. Nhận ra smell là kỹ năng review cốt lõi. Nhưng có một quy tắc ...
"Hàm nên nhỏ" là lời khuyên hay bị hiểu thành "đếm dòng": dưới 20 dòng thì tốt, trên thì xấu. Đó là cách hiểu sai. Một hàm tốt làm một việc ở một mức trừu tượng, đọc như một câu mô tả ý định; độ dài chỉ là hệ quả. Mục tiêu thật là giảm độ phức tạp người đọc phải giữ trong đầu cùng lúc — một hàm dài trộn nhiều mức...
Tên là tài liệu được đọc nhiều nhất trong code — mỗi lần đọc một hàm, một biến, người đọc dựa vào tên để hiểu ý định mà không phải đọc hết phần thân. Tên tốt làm code tự giải thích; tên sai chủ động đánh lừa, dẫn người đọc tới giả định sai và gây bug khi họ dùng một hàm theo cách tên gợi ý mà không phải cách nó thự...
Immutable data nghĩa là một khi tạo ra, giá trị không bị sửa tại chỗ; mọi "thay đổi" tạo ra một bản sao mới với phần đã đổi. Cách làm này loại bỏ một nguồn bug lớn: side effect ngầm, nơi một hàm sửa object mà nơi gọi không ngờ tới, gây ra hành vi sai ở một chỗ hoàn toàn khác. Nó cũng là nền của cách ...
Dependency Inversion Principle nói module cấp cao không nên phụ thuộc trực tiếp module cấp thấp; cả hai nên phụ thuộc vào abstraction. Dependency Injection là cách thực hiện: thay vì một class tự tạo ra các dependency của nó (gọi new, import trực tiếp), nó nhận chúng từ ngoài ...