
SOLID trong React: Hiểu và Áp dụng 5 Nguyên Tắc Thiết Kế Phần Mềm

Tác giả: Phi Long
Cập nhật lần cuối: 04/03/2025
SOLID là tập hợp 5 nguyên tắc thiết kế phần mềm (do Robert C. Martin đề xuất)
1. S - Single Responsibility Principle (Nguyên tắc trách nhiệm đơn nhất)
Ý nghĩa: Mỗi module, class, hoặc function chỉ nên có một lý do duy nhất để thay đổi. Nói cách khác, một thành phần chỉ nên làm một việc.
Áp dụng trong React:
function UserProfile() {
const [user, setUser] = useState(null);
useEffect(() => {
fetch('/api/user').then(res => setUser(res.data));
}, []);
return <div>{user?.name}</div>;
}
// Nên:
function useUserData() { // Hook xử lý logic
const [user, setUser] = useState(null);
useEffect(() => {
fetch('/api/user').then(res => setUser(res.data));
}, []);
return user;
}
function UserProfile() { // Component chỉ hiển thị
const user = useUserData();
return <div>{user?.name}</div>;
}
2. O - Open/Closed Principle (Nguyên tắc mở/đóng)
Ý nghĩa: Các thành phần nên mở để mở rộng (thêm tính năng) nhưng đóng để sửa đổi (không cần thay đổi code cũ).
Áp dụng trong React:
function Button({ variant = 'primary', children, ...props }) {
const className = variant === 'primary' ? 'btn-primary' : 'btn-secondary';
return <button className={className} {...props}>{children}</button>;
}
// Sử dụng
<Button variant="primary">Click me</Button>
<Button variant="secondary" disabled>Disabled</Button>
3. L - Liskov Substitution Principle (Nguyên tắc thay thế Liskov)
Ý nghĩa: Một đối tượng của lớp con có thể thay thế cho đối tượng của lớp cha mà không làm hỏng chương trình. Trong React, điều này áp dụng cho việc tái sử dụng component.
Áp dụng trong React:
function Card({ title, content }) {
return (
<div className="card">
<h2>{title}</h2>
<p>{content}</p>
</div>
);
}
function ImageCard({ title, content, imageUrl }) {
return (
<div className="card">
<h2>{title}</h2>
<img src={imageUrl} alt={title} />
<p>{content}</p>
</div>
);
}
<CardList cards={[<Card />, <ImageCard />]} />
4. I - Interface Segregation Principle (Nguyên tắc phân tách giao diện)
Ý nghĩa: Không bắt buộc một thành phần phải phụ thuộc vào những thứ nó không dùng.
Áp dụng trong React:
// Tránh:
function UserAvatar({ user }) {
return <img src={user.avatarUrl} alt={user.name} />;
}
<UserAvatar user={{ id: 1, name: 'John', avatarUrl: 'url', email: 'john@example.com' }} />
// Nên:
function UserAvatar({ avatarUrl, name }) {
return <img src={avatarUrl} alt={name} />;
}
<UserAvatar avatarUrl="url" name="John" />
5. D - Dependency Inversion Principle (Nguyên tắc đảo ngược phụ thuộc)
Ý nghĩa: Các module cấp cao không nên phụ thuộc vào module cấp thấp, mà cả hai nên phụ thuộc vào abstraction (trừu tượng).
Áp dụng trong React:
// Tránh:
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch('/api/users').then(res => setUsers(res.data));
}, []);
return <ul>{users.map(u => <li>{u.name}</li>)}</ul>;
}
function useApiFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url).then(res => setData(res.data));
}, [url]);
return data;
}
function UserList() {
const users = useApiFetch('/api/users');
return <ul>{users?.map(u => <li>{u.name}</li>)}</ul>;
}
Bình luận(0)
Hãy là người đầu tiên bình luận!