Chúng ta đã thấy cách kiến trúc có thể đề cập đến việc tổ chức cơ sở hạ tầng (infrastructure) và lưu trữ (storage). Bây giờ chúng ta hãy xem một số mã và cách kiến trúc có thể tham chiếu đến cấu trúc thư mục và mô-đun mã.
1. Cấu trúc một thư mục
Để minh họa tại sao cấu trúc thư mục lại quan trọng, hãy xây dựng một API ví dụ. Chúng ta sẽ có một cơ sở dữ liệu giả và API sẽ thực hiện các hành động CRUD trên đó. Chúng ta sẽ xây dựng điều này với Node và Express.
Đây là cách tiếp cận đầu tiên của chúng ta, không có cấu trúc thư mục nào cả. Kho lưu trữ của chúng ta sẽ bao gồm thư mục node_modules và các tệp app.js, package-lock.json và package.json

Vì vậy, vấn đề với điều này là gì? Không có gì, thực sự, nó hoạt động tốt. Vấn đề sẽ chỉ phát sinh khi cơ sở mã ngày càng lớn hơn và phức tạp hơn và chúng ta bắt đầu thêm các tính năng mới vào API của mình.
Tương tự như những gì chúng ta đã nói trước đây khi giải thích về kiến trúc nguyên khối (monolith), việc có mọi thứ ở một nơi duy nhất là điều tốt đẹp và dễ dàng lúc đầu. Nhưng khi mọi thứ bắt đầu trở nên lớn hơn và phức tạp hơn, đây là một cách tiếp cận khó hiểu và khó làm theo.
Tuân theo nguyên tắc mô đun, một ý tưởng tốt hơn là có các thư mục và tệp khác nhau cho các trách nhiệm và hành động khác nhau mà chúng ta cần thực hiện.
Để minh họa rõ hơn điều này, hãy thêm các tính năng mới vào API của chúng ta và xem cách chúng ta có thể thực hiện phương pháp mô-đun với sự trợ giúp của kiến trúc lớp.
2. Cấu trúc thư mục lớp (Layers Folder Structure)
Cấu trúc lớp là phân chia các mối quan tâm và trách nhiệm thành các thư mục và tệp khác nhau, đồng thời chỉ cho phép giao tiếp trực tiếp giữa các thư mục và tệp nhất định.
Vấn đề dự án của bạn nên có bao nhiêu lớp, mỗi lớp nên có tên gì và nó nên xử lý những hành động nào là tất cả vấn đề cần thảo luận. Vì vậy, một trong những cách tiếp cận tốt cho ví dụ của chúng ta đó là ứng dụng của chúng ta sẽ có năm lớp khác nhau, sẽ được sắp xếp theo cách này:

- Lớp ứng dụng (Application layer) thiết lập cơ bản máy chủ và kết nối đến các tuyến của chúng ta (lớp tiếp theo).
- Lớp định tuyến (Routes layer) định nghĩa về tất cả các tuyến của chúng ta và kết nối với các bộ điều khiển (lớp tiếp theo).
- Lớp bộ điều khiển (Controllers layer) chứa logic thực tế mà chúng ta muốn thực hiện trong mỗi điểm cuối của chúng ta và kết nối với lớp mô hình (lớp tiếp theo, bạn có ý tưởng …). Logic ở đây có thể hiểu là các quy tắc nghiệp vụ (business rules).
- Lớp mô hình (Model layer) giữ logic để tương tác với cơ sở dữ liệu của chúng ta.
- Lớp dữ liệu (Persistence layer) là nơi chứa cơ sở dữ liệu của chúng ta.
Bạn có thể thấy cách tiếp cận này có cấu trúc hơn nhiều và có sự phân chia mối quan tâm rõ ràng. Sau khi thiết lập, cấu trúc này sẽ cho phép chúng ta biết rõ ràng từng thứ đang ở đâu, những thư mục và tệp nào chịu trách nhiệm cho mỗi hành động mà ứng dụng của chúng ta thực hiện.
Một điều quan trọng cần ghi nhớ là trong loại cấu trúc này, có một luồng giao tiếp xác định giữa các lớp phải được tuân theo để nó có ý nghĩa.
Điều này có nghĩa là một yêu cầu đầu tiên phải đi qua lớp đầu tiên, sau đó là lớp thứ hai, rồi đến lớp thứ ba, v.v. Không có yêu cầu nào nên bỏ qua các lớp vì điều đó sẽ gây rối với logic của cấu trúc, lợi ích của tổ chức và mô đun mà nó mang lại cho chúng ta

Sử dụng cấu trúc thư mục lớp cho ứng dụng của chúng ta có thể trông giống như sau:

Như chúng ta có thể thấy, có rất nhiều thư mục và tệp trong cấu trúc này. Nhưng kết quả là, cơ sở mã của chúng ta được cấu trúc và tổ chức rõ ràng hơn nhiều. Mọi thứ đều có vị trí riêng của nó và giao tiếp giữa các tệp khác nhau được xác định rõ ràng.
Kiểu tổ chức này tạo điều kiện thuận lợi đáng kể cho việc bổ sung các tính năng mới, sửa đổi mã và sửa lỗi.
Khi bạn đã quen với cấu trúc thư mục và biết nơi tìm từng thứ, bạn sẽ thấy rất thuận tiện khi làm việc với các tệp ngắn hơn và nhỏ hơn này thay vì phải cuộn qua một hoặc hai tệp lớn nơi mọi thứ được tập hợp lại với nhau.
Giả sử bây giờ chúng ta muốn thêm các tính năng mới để thêm / chỉnh sửa / xóa các thông tin. Chúng ta sẽ tạo các thư mục mới cho các thông tin và mỗi thư mục có các tuyến đường, bộ điều khiển và tệp mô hình riêng. Ý tưởng là tách các mối quan tâm ra và đặt mỗi thứ vào vị trí riêng của nó.
3. Cấu trúc thư mục MVC
MVC là một mẫu kiến trúc viết tắt của Model View Controller. Có thể nói cấu trúc MVC giống như một sự đơn giản hóa cấu trúc các lớp, kết hợp giao diện (UI) của ứng dụng.
Theo cấu trúc này, chúng ta sẽ chỉ có ba lớp chính:

- Lớp xem (View) sẽ chịu trách nhiệm hiển thị giao diện người dùng.
- Lớp bộ điều khiển (Controller) sẽ chịu trách nhiệm xác định các tuyến đường và logic (quy tắc nghiệp vụ) cho mỗi chúng.
- Lớp mô hình (Model) sẽ chịu trách nhiệm tương tác với cơ sở dữ liệu của chúng ta.
Tương tự như trước, mỗi lớp sẽ chỉ tương tác với lớp tiếp theo để chúng ta có một luồng giao tiếp được xác định rõ ràng

Có rất nhiều frameworks cho phép bạn triển khai kiến trúc MVC ngay lập tức (như Django hoặc Ruby on Rails chẳng hạn). Để làm điều này với Node and Express, chúng ta sẽ cần một công cụ mẫu như EJS.
Các frameworks đơn giản chỉ là một cách để dễ dàng hiển thị HTML trong khi tận dụng các tính năng lập trình như biến, vòng lặp, điều kiện, v.v. (rất giống với những gì chúng ta sẽ làm với JSX trong React) .
Cấu trúc thư mục MVC của chúng ta sẽ như thế này:
