Áp Dụng Nguyên Tắc SOLID Trong ReactJS: “Món Ngon” Cho Code Dễ Bảo Trì

Nội dung

Chào mừng bạn đến với VietNamTutor! Hôm nay, chúng ta sẽ nói về SOLID – “bí quyết gia truyền” trong làng lập trình để viết code “đẹp như mơ”. Nếu bạn đã từng cảm thấy rối rắm khi phải bảo trì hay nâng cấp một dự án React, SOLID có thể là “phép màu” giúp code của bạn dễ hiểu, dễ chăm sóc như cây cảnh trước hiên nhà.

Bạn có nhớ cái cảm giác khi nhà có khách mà bếp chưa dọn, thức ăn thì chưa nấu xong không? Đúng vậy, code cũng như bếp nhà – nếu không sắp xếp hợp lý, cứ một thời gian ngắn là “tan nát”! Đó chính là lý do chúng ta có các nguyên tắc SOLID để code vừa gọn, vừa “mát mắt”.

1. Món thứ nhất: Single Responsibility (SRP) – Trách Nhiệm Duy Nhất, Chỉ Một Mà Thôi!

SRP (Single Responsibility Principle) nhắc bạn rằng mỗi component chỉ nên có một nhiệm vụ duy nhất. Giống như trong bữa tiệc gia đình, bạn không thể bắt ông bác vừa nấu ăn, vừa dọn dẹp, vừa pha cà phê được – ai vào việc nấy, bếp ai người nấy lo!

Áp dụng SRP trong ReactJS

Trong React, việc tách các component ra cho đúng nhiệm vụ sẽ giúp dự án của bạn chạy “mượt mà như tình đầu”. Ví dụ nhé:

  • Tách biệt giao diện và logic: Đừng cho tất cả vào một component rồi ngồi nhìn chúng… rối bời. Nếu có component UserList, hãy chia nhỏ để hiển thị thông tin của từng người dùng thành một component UserItem.
function UserList() {
    const users = useFetchData("/api/users");

    return (
        <div>
            {users && users.map(user => <UserItem key={user.id} user={user} />)}
        </div>
    );
}Code language: JavaScript (javascript)

Với cách tách biệt này, mỗi phần sẽ làm tròn một nhiệm vụ duy nhất, giống như mâm cơm có món canh, món kho – rõ ràng, dễ gắp mà lại dễ tiêu hóa!

2. Món thứ hai: Open/Closed (OCP) – Đóng Để Không Đổi, Mở Để Mà Thêm!

OCP nhấn mạnh rằng code nên mở rộng mà không cần chỉnh sửa bên trong – giống như một căn phòng có cửa sổ đủ rộng để nhìn ra ngoài mà không phải đập tường!

Áp Dụng OCP trong ReactJS

Trong React, bạn có thể dùng props để truyền dữ liệu vào component, để component có thể “biến hóa” mà không cần đụng đến code bên trong. Ví dụ, hãy xem cách làm một Button đa năng:

function Button({ label, onClick }) {
    return <button onClick={onClick}>{label}</button>;
}Code language: JavaScript (javascript)

Với cách này, bạn có thể dùng Button này ở bất kỳ đâu, truyền vào labelonClick để tạo nên một nút khác biệt mà không cần chỉnh sửa bên trong. Giống như việc bấm remote để thay đổi kênh mà không cần chỉnh TV vậy!

3. Món thứ ba: Liskov Substitution (LSP) – Thay Thế Mà Vẫn “Nuột” Như Xưa

Nguyên tắc LSP nghe hơi “phức tạp”, nhưng thực ra chỉ là đảm bảo rằng bạn có thể dùng component con thay thế component cha mà mọi thứ vẫn chạy “ngon lành”.

Áp Dụng LSP trong ReactJS

Hãy tưởng tượng bạn có component Button và muốn thêm biểu tượng cho nút bấm này. Đừng sửa trong Button nhé, hãy tạo một component IconButton kế thừa từ Button:

function IconButton({ icon, ...props }) {
    return (
        <Button {...props}>
            <span>{icon}</span> {props.label}
        </Button>
    );
}Code language: JavaScript (javascript)

Bạn thấy không? Nhờ nguyên tắc này, IconButton sẽ thừa hưởng tất cả các chức năng của Button, chỉ cần thêm chút icon là đã có một component hoàn toàn mới. Rõ ràng là một kiểu “copy mẹ đẻ con” – linh hoạt mà chẳng cần sửa chỗ nào khác.

4. Món thứ 4: Interface Segregation (ISP) – Đừng Ép Người Khác Phải Dùng Những Thứ Họ Không Cần!

Nguyên tắc ISP dạy chúng ta rằng: component nên nhận những props mà nó thực sự cần thôi, đừng đưa thừa mứa rồi ép người ta sử dụng!

Áp Dụng ISP trong ReactJS

Giống như khi ăn, đừng ép mọi người cùng ăn món cay nếu không ai thích, hãy chỉ cho họ những thứ cần thiết. Trong React, thay vì truyền cả “tá” props vào một component, hãy tách ra thành nhiều component nhỏ. Chẳng hạn như một form có TextInput riêng, PasswordInput riêng và SubmitButton riêng:

function TextInput({ label, value, onChange }) {
    return (
        <div>
            <label>{label}</label>
            <input type="text" value={value} onChange={onChange} />
        </div>
    );
}

function SubmitButton({ onSubmit }) {
    return <button onClick={onSubmit}>Submit</button>;
}Code language: JavaScript (javascript)

Bằng cách này, mỗi component chỉ nhận đúng phần việc cần làm – vừa nhanh gọn lại dễ bảo trì.

5. Món cuối cùng: Dependency Inversion (DIP) – Đảo Ngược Để… Linh Hoạt Hơn!

DIP – một cái tên nghe rất “điệu”, nhưng bản chất là muốn các module cao không phụ thuộc vào module thấp, mà cả hai cùng phụ thuộc vào một trừu tượng hóa. Nói cách khác, component nên linh hoạt hơn là phụ thuộc vào một module cụ thể.

Áp Dụng DIP trong ReactJS

Để thực hiện được điều này trong React, bạn có thể dùng Context API để chia sẻ dữ liệu giữa các component mà không phải truyền qua nhiều cấp độ props. Như thế, tất cả các component có thể cùng dùng chung dữ liệu mà không bị “cột chặt” vào nhau.

// Tạo một context
const UserContext = React.createContext();

function App() {
    return (
        <UserContext.Provider value={{ name: "John Doe" }}>
            <UserProfile />
        </UserContext.Provider>
    );
}

function UserProfile() {
    const user = useContext(UserContext);
    return <div>Welcome, {user.name}!</div>;
}Code language: JavaScript (javascript)

Nhờ Context API, UserProfile có thể dùng được UserContext mà không cần phải kéo thêm các phần không cần thiết. Như vậy, mã nguồn không chỉ linh hoạt mà còn có thể thay đổi dễ dàng mà không ảnh hưởng đến toàn bộ dự án.

Dọn đĩa nào

Vậy là chúng ta đã đi qua 5 nguyên tắc SOLID – những “gia vị” giúp code của bạn “ngon lành” và dễ bảo trì hơn. Áp dụng SOLID trong ReactJS không khó, nhưng cần một chút “nhẫn nại” và… kỷ luật. Nếu mỗi ngày bạn dành chút thời gian để tổ chức lại code, chỉ một thời gian ngắn thôi, bạn sẽ cảm thấy dự án của mình khác hẳn: dễ sửa, dễ thêm mới và chẳng bao giờ “rối tung”.

Hãy nhớ, với VietNamTutor, học lập trình không chỉ là học cách viết code, mà còn là cách làm sao để viết code “chuẩn chỉnh”, không bị “hoảng” mỗi khi có thay đổi. Để S.O.L.I.D trở thành người bạn đồng hành cùng bạn trên con đường làm chủ React nhé!

Anthony Nguyễn

Cây bút chính tại VietnamTutor

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

Kịch bản tự động hóa cho doanh nghiệp bất động sản: từ Lead Facebook đến lịch hẹn với Sales

Kịch bản tự động hóa cho doanh nghiệp bất động sản: từ khi lead điền form Facebook đến khi Sales có đủ thông tin để gọi

Vibe coding và nợ kỹ thuật thầm lặng: kiểm soát bằng kỹ thuật ngữ cảnh

Vibe coding tăng tốc nhưng âm thầm tích lũy nợ kỹ thuật. Bài này giải thích vì sao và cách context engineering giúp bạn giữ codebase

Tự Động Hóa Spa Salon: Quy Trình Đặt Lịch & Giữ Chân Khách

Xem kịch bản tự động hóa spa salon toàn diện: đồng bộ lịch đa kênh, nhắc hẹn Zalo ZNS chống No-show và kích hoạt vòng lặp

Git stash: lưu tạm công việc dở và khôi phục đúng lúc

Git stash cho phép lưu tạm các thay đổi chưa commit để chuyển sang task khác, rồi khôi phục lại đúng lúc — tránh commit dở

Tự động hóa Trung tâm giáo dục: 3 Quy Trình Từ Lead Đến Nhập Học

Bài viết giúp trung tâm giáo dục thiết kế ba workflow tự động hóa từ lead đến học viên nhập học, có nhắc lịch, phân quyền

Tự động hóa Agency Marketing SEO: 3 Quy Trình Từ Hợp Đồng Đến Báo Cáo

Bài viết giúp chủ agency marketing/SEO thiết kế ba workflow tự động hóa từ hợp đồng ký đến báo cáo client định kỳ, có ngoại lệ,

RPA vs Tự Động Hóa Quy Trình: So Sánh Và Cách Kết Hợp Đúng

RPA mô phỏng thao tác trên giao diện, workflow automation điều phối hệ thống qua API. So sánh chi tiết và hướng dẫn kết hợp cho

Cloudflare Agents Week 2026: ADLC, WebMCP, AEO và Ý Nghĩa Cho Website

Tổng hợp Cloudflare Agents Week 2026 theo từng ngày: hạ tầng agent, ADLC, bảo mật agent, WebMCP và AEO. Kèm nhận định và việc cần làm

Bảo mật vibe coding: đừng để AI sinh lỗ hổng website

Bảo mật vibe coding không chỉ là quét lỗi sau khi AI viết code. Bài viết đưa ra checklist kiểm soát secret, prompt injection, dependency, auth

Git rebase bị conflict: cách sửa hoặc abort an toàn

Hướng dẫn xử lý git rebase bị conflict: cách kiểm tra file lỗi, sửa conflict marker, tiếp tục rebase, abort an toàn và khi nào không

Tự động hóa doanh nghiệp Ecommerce: 3 luồng xử lý nên làm

Bài viết giúp chủ Ecommerce thiết kế ba workflow tự động hóa doanh nghiệp Ecommerce từ đơn hàng đến CSKH, có ngoại lệ, phân quyền và

Công cụ tự động hóa mã nguồn mở: chọn và triển khai

Bài viết giúp SME chọn công cụ tự động hóa mã nguồn mở theo use case, năng lực vận hành, dữ liệu nhạy cảm và tổng