Nguyên tắc Mở / Đóng trong Java

1. Khái quát chung

Trong hướng dẫn này, chúng ta sẽ thảo luận về Nguyên tắc Mở / Đóng (OCP) là một trong những nguyên tắc SOLID của lập trình hướng đối tượng.

Nhìn chung, chúng ta sẽ đi vào chi tiết nguyên tắc này là gì và cách thực hiện nó khi thiết kế phần mềm của chúng tôi.

2. Nguyên tắc Mở / Đóng

Như tên cho thấy, nguyên tắc này nói rằng các thực thể phần mềm nên mở để mở rộng, nhưng đóng để sửa đổi. Do đó, khi các yêu cầu nghiệp vụ thay đổi thì pháp nhân có thể được mở rộng, nhưng không được sửa đổi.

Đối với hình minh họa bên dưới, chúng tôi sẽ tập trung vào cách các giao diện là một cách để tuân theo OCP.

2.1. Không tuân thủ

Hãy xem xét chúng tôi đang xây dựng một ứng dụng máy tính có thể có một số phép toán, chẳng hạn như cộng và trừ.

Trước hết, chúng tôi sẽ xác định giao diện cấp cao nhất - Máy tínhOperation :

public interface CalculatorOperation {}

Hãy xác định một Addition lớp, mà sẽ thêm hai con số và thực hiện C alculatorOperation :

public class Addition implements CalculatorOperation { private double left; private double right; private double result = 0.0; public Addition(double left, double right) { this.left = left; this.right = right; } // getters and setters }

Hiện tại, chúng ta chỉ có một phép cộng lớp , vì vậy chúng ta cần xác định một lớp khác có tên là Phép trừ :

public class Subtraction implements CalculatorOperation { private double left; private double right; private double result = 0.0; public Subtraction(double left, double right) { this.left = left; this.right = right; } // getters and setters }

Bây giờ chúng ta hãy xác định lớp chính của chúng ta, lớp này sẽ thực hiện các phép tính trên máy tính của chúng ta:

public class Calculator { public void calculate(CalculatorOperation operation) { if (operation == null) { throw new InvalidParameterException("Can not perform operation"); } if (operation instanceof Addition) { Addition addition = (Addition) operation; addition.setResult(addition.getLeft() + addition.getRight()); } else if (operation instanceof Subtraction) { Subtraction subtraction = (Subtraction) operation; subtraction.setResult(subtraction.getLeft() - subtraction.getRight()); } } }

Mặc dù điều này có vẻ ổn, nhưng nó không phải là một ví dụ điển hình về OCP. Khi có yêu cầu mới về việc thêm chức năng nhân hoặc chia, chúng tôi không có cách nào khác ngoài việc thay đổi phương pháp tính toán của lớp Máy tính .

Do đó, có thể nói mã này không tuân thủ OCP.

2.2. Tuân thủ OCP

Như chúng ta đã thấy, ứng dụng máy tính của chúng tôi chưa tuân thủ OCP. Mã trong phương pháp tính toán sẽ thay đổi với mọi yêu cầu hỗ trợ hoạt động mới đến. Vì vậy, chúng ta cần giải nén đoạn mã này và đặt nó vào một lớp trừu tượng.

Một giải pháp là ủy quyền từng thao tác vào lớp tương ứng của chúng:

public interface CalculatorOperation { void perform(); }

Kết quả là, lớp Addition có thể thực hiện logic của việc cộng hai số:

public class Addition implements CalculatorOperation { private double left; private double right; private double result; // constructor, getters and setters @Override public void perform() { result = left + right; } }

Tương tự như vậy, một lớp Phép trừ được cập nhật sẽ có logic tương tự. Và tương tự để bổ sungphép trừ , như một yêu cầu thay đổi mới, chúng ta có thể thực hiện phân chia logic:

public class Division implements CalculatorOperation { private double left; private double right; private double result; // constructor, getters and setters @Override public void perform() { if (right != 0) { result = left / right; } } }

Và cuối cùng, lớp Máy tính của chúng tôi không cần triển khai logic mới khi chúng tôi giới thiệu các toán tử mới:

public class Calculator { public void calculate(CalculatorOperation operation) { if (operation == null) { throw new InvalidParameterException("Cannot perform operation"); } operation.perform(); } } 

Bằng cách đó, lớp được đóng để sửa đổi nhưng mở để mở rộng.

3. Kết luận

Trong hướng dẫn này, chúng ta đã tìm hiểu định nghĩa OCP là gì, sau đó giải thích kỹ hơn về định nghĩa đó. Sau đó, chúng tôi thấy một ví dụ về một ứng dụng máy tính đơn giản có sai sót trong thiết kế của nó. Cuối cùng, chúng tôi đã làm cho thiết kế trở nên tốt đẹp bằng cách làm cho nó tuân thủ OCP.

Như mọi khi, mã có sẵn trên GitHub.