0
0
Lập trình
Admin Team
Admin Teamtechmely

Nguyên Tắc SOLID: Bước Đệm Để Trở Thành Lập Trình Viên Chuyên Nghiệp

Đăng vào 3 ngày trước

• 5 phút đọc

Nguyên Tắc SOLID Trong Lập Trình

Nguyên tắc SOLID trong lập trình bao gồm một tập hợp các nguyên tắc thiết kế phần mềm cơ bản. Những nguyên tắc này không chỉ giúp bạn tạo ra mã nguồn linh hoạt mà còn dễ dàng bảo trì và mở rộng trong tương lai. Hãy cùng khám phá từng nguyên tắc trong SOLID để trở thành một lập trình viên có tâm và có tầm.

1. Nguyên Tắc Đơn Trách Nhiệm (Single Responsibility Principle - SRP)

Nguyên tắc này nhấn mạnh rằng mỗi lớp chỉ nên có một lý do để thay đổi và chỉ thực hiện một chức năng cụ thể. Điều này giúp mã nguồn trở nên dễ đọc, dễ bảo trì và dễ hiểu hơn.

Ví dụ:

java Copy
class Employee {
    private String name;
    private double salary;
    // Các phương thức để lấy và thiết lập thông tin nhân viên
}

class EmployeeDatabase {
    void saveEmployee(Employee emp) {
        // Lưu thông tin nhân viên vào cơ sở dữ liệu
    }
}

Lớp Employee chỉ trách nhiệm quản lý thông tin một nhân viên cụ thể, trong khi lớp EmployeeDatabase thực hiện các tác vụ lưu trữ.

2. Nguyên Tắc Mở Rộng (Open/Closed Principle - OCP)

Phần mềm nên thiết kế sao cho mở rộng được mà không cần sửa đổi mã nguồn hiện tại. Bạn có thể mở rộng bằng cách sử dụng kế thừa hoặc interfaces mà không cần thay đổi mã đã tồn tại.

Ví dụ:

java Copy
interface Shape {
    double area();
}

class Circle implements Shape {
    private double radius;

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

class Rectangle implements Shape {
    private double width;
    private double height;

    @Override
    public double area() {
        return width * height;
    }
}

Sử dụng kế thừa và interface giúp mở rộng chức năng mà không cần chỉnh sửa mã nguồn hiện có.

3. Nguyên Tắc Thay Thế Liskov (Liskov Substitution Principle - LSP)

Các đối tượng lớp con nên có thể thay thế cho các đối tượng lớp cha mà không làm thay đổi tính đúng đắn của chương trình. Điều này đảm bảo tính nhất quán khi sử dụng các đối tượng.

Ví dụ:

java Copy
class Bird {
    public boolean areThereFeathers() {
        return true;
    }

    public void fly() {
        // Logic bay
    }
}

class Sparrow extends Bird { }

class Ostrich extends Bird {
    public void fly() {
        throw new UnsupportedOperationException("Ostrich cannot fly");
    }
}

Trong trường hợp này, việc kế thừa từ lớp Bird cho Ostrich vi phạm nguyên tắc Liskov. Chúng ta cần điều chỉnh kế thừa như sau:

java Copy
class Bird {
    public boolean areThereFeathers() {
        return true;
    }
}

class FlyingBird extends Bird {
    public void fly() {
        System.out.println("I can Fly");
    }
}

class RunningBird extends Bird {
    public void run() {
        System.out.println("I can Run");
    }
}

class Sparrow extends FlyingBird { }

class Ostrich extends RunningBird { }

Bằng cách này, mỗi loại chim được phân loại rõ ràng.

4. Nguyên Tắc Tách Biệt Giao Diện (Interface Segregation Principle - ISP)

Một lớp không nên cần triển khai các phương thức mà nó không sử dụng. Các giao diện nên được chia nhỏ để đảm bảo rằng lớp chỉ triển khai những gì cần thiết cho nhiệm vụ của mình.

Ví dụ:

java Copy
interface Printer {
    void print();
    void scan();
}

// Tách thành 2 interface riêng biệt
interface SimplePrinter {
    void print();
}

interface Scanner {
    void scan();
}

Một máy in đơn giản chỉ nên có chức năng in mà không cần các chức năng không liên quan.

5. Nguyên Tắc Đảo Ngược Sự Phụ Thuộc (Dependency Inversion Principle - DIP)

Các module cấp cao không nên phụ thuộc vào các chi tiết cấp thấp. Cả hai nên phụ thuộc vào các trừu tượng, giúp hệ thống linh hoạt và có thể thay đổi mà không ảnh hưởng đến các module khác.

Ví dụ:

java Copy
interface DataAccess {
    void save();
}

class Database implements DataAccess {
    @Override
    public void save() {
        // Lưu vào cơ sở dữ liệu
    }
}

class Customer {
    private DataAccess dataAccess;

    public Customer(DataAccess dataAccess) {
        this.dataAccess = dataAccess;
    }

    public void save() {
        dataAccess.save();
    }
}

Trong ví dụ này, Customer phụ thuộc vào interface DataAccess thay vì vào Database, giúp giảm độ ràng buộc.

Tóm Tắt Về SOLID

Tên Định Nghĩa
Nguyên Tắc Đơn Trách Nhiệm (SRP) Mỗi lớp chỉ có một lý do để thay đổi và thực hiện một chức năng cụ thể.
Nguyên Tắc Mở Rộng (OCP) Đảm bảo phần mềm có thể mở rộng mà không cần thay đổi mã nguồn hiện tại.
Nguyên Tắc Thay Thế Liskov (LSP) Các đối tượng lớp con có thể thay thế các đối tượng lớp cha mà không gây lỗi cho chương trình.
Nguyên Tắc Tách Biệt Giao Diện (ISP) Lớp không chịu áp lực phải triển khai các phương thức không cần thiết.
Nguyên Tắc Đảo Ngược Sự Phụ Thuộc (DIP) Các module cấp cao không nên phụ thuộc vào chi tiết cấp thấp, cả hai nên phụ thuộc vào các trừu tượng.

Lời Kết

Việc nỗ lực không chỉ nằm ở việc hoàn thành công việc, mà còn là cách bạn sống mỗi ngày. Hãy làm tốt mọi việc, không trì hoãn và không than phiền. Mỗi ngày chỉ cần cố gắng một chút là bạn có thể tạo ra những bước tiến lớn dẫn tới thành công sau này.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào