Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

Thiết kế và xây dựng phần mềm

Assignment 10
Thông tin:
Họ và tên:…………………………………………………………………… ……………………
Mã số sinh viên:……………………………… …………………………… ……………………

Câu 1: Một lập trình viên thiết kế một class class chứa các phương thức xử lý liên quan đến CSDL
như sau:

public class DBHelper {


public Connection openConnection() {};
public void saveUser(User user) {};
public List<Product> getProducts() {};
public void closeConnection() {};
}

Thiết kế này có vi phạm nguyên lý nào của SOLID? Giải thích và đưa ra giải pháp.

Trả lời:

-Thiết kế này vi phạm nguyên lý Đơn trách nhiệm (SRP).

- Nguyên lý Đơn trách nhiệm (SRP): Theo SRP, một lớp chỉ nên có một lý do để thay đổi. Trong thiết
kế đã cung cấp, lớp DBHelper có nhiều nhiệm vụ:

+ Mở và đóng kết nối cơ sở dữ liệu.

+ Lưu dữ liệu người dùng vào cơ sở dữ liệu.

+ Lấy thông tin sản phẩm từ cơ sở dữ liệu.

-Để tuân thủ SRP, chúng ta nên tái cấu trúc lớp DBHelper thành nhiều lớp, mỗi lớp chỉ có một trách
nhiệm duy nhất

Câu 2: Một lập trình viên thiết kế logic xử lý tính phí vận chuyển của một đơn hàng được đặt luôn
bên trong class Order như sau:

public class Order {

1|Page
public long calculateShipping(ShippingMethod shippingMethod) {
if (shippingMethod == GROUND) {
// Calculate for ground shipping
} else if (shippingMethod == AIR) {
// Calculate for air shipping
} else {
// Default
}
}
}

Giả sử hệ thống cần bổ sung thêm một phương thức vận chuyển mới, điều này khiến cho lập trình
viên phải bổ sung một case nữa trong phương thức calculateShipping(). Thiết kế này có vi phạm
nguyên lý nào của SOLID? Giải thích và đưa ra giải pháp.

Trả lời

-Thiết kế này vi phạm Nguyên tắc Mở/Đóng (OCP) của SOLID.

- Nguyên tắc Mở/Đóng (OCP): Theo OCP, các lớp nên mở rộng được nhưng đóng lại trước sự thay
đổi. Trong thiết kế đã cung cấp, việc thêm một phương thức vận chuyển mới đòi hỏi phải sửa đổi
phương thức calculateShipping() hiện tại bằng cách thêm một nhánh điều kiện mới. Điều này vi
phạm nguyên tắc vì nó yêu cầu sửa đổi mã hiện tại, có thể giới thiệu lỗi mới và tăng độ phức tạp của
lớp.

- Để tuân thủ OCP, chúng ta nên tái cấu trúc lớp Order để mở rộng mà không cần sửa đổi

Câu 3: Một lập trình viên thiết kế một giao diện chứa các phương thức phục vụ cho việc chuyển đổi
các kiểu dữ liệu như sau:

public interface Conversion {


public void intToDouble();
public void intToChar();
public void charToString();
}

Thiết kế này có vi phạm nguyên lý nào của SOLID? Giải thích và đưa ra giải pháp.

Trả lời

- Thiết kế này vi phạm Nguyên tắc Phân chia Giao diện (ISP) của SOLID.

- Nguyên tắc Phân chia Giao diện (ISP): ISP quy định rằng một client không nên bị ép buộc phải triển
khai các giao diện mà họ không sử dụng. Trong thiết kế đã cung cấp, giao diện Conversion chứa
nhiều phương thức (intToDouble(), intToChar(), charToString()) có thể không phù hợp cho tất cả các

2|Page
triển khai của giao diện. Điều này vi phạm ISP vì nó buộc các lớp triển khai phải cung cấp triển khai
cho tất cả các phương thức, ngay cả khi chúng không cần.

- Để tuân thủ ISP, chúng ta nên tái cấu trúc giao diện Conversion thành các giao diện nhỏ hơn, tập
trung hơn, mỗi giao diện có một mục đích cụ thể

Câu 4: Một dự án gồm 2 module cấp thấp BackendDeveloper và FrontendDeveloper và 1 module cấp
cao Project sử dụng 2 module trên:

public class BackendDeveloper {


public void codeJava() {};
}

public class FrontendDeveloper {


public void codeJS() {};
}

public class Project {


private BackendDeveloper backendDeveloper = new BackendDeveloper();
private FrontendDeveloper frontendDeveloper = new FrontendDeveloper();
public void build() {
backendDeveloper.codeJava();
frontendDeveloper.codeJS();
}
}

Thiết kế này có vi phạm nguyên lý nào của SOLID? Giải thích và đưa ra giải pháp.

Trả lời

- Thiết kế này vi phạm Nguyên tắc Đảo ngược phụ thuộc (DIP) của SOLID.

- Nguyên tắc Đảo ngược phụ thuộc (DIP): DIP quy định rằng các module cấp cao không nên phụ
thuộc vào các module cấp thấp, mà cả hai đều nên phụ thuộc vào các khái niệm trừu tượng. Trong
thiết kế đã cung cấp, lớp Project phụ thuộc trực tiếp vào các triển khai cụ thể của BackendDeveloper
và FrontendDeveloper. Điều này làm cho lớp Project gắn kết chặt chẽ với các triển khai cụ thể, vi
phạm nguyên tắc.

- Để tuân thủ DIP, chúng ta nên giới thiệu các khái niệm trừu tượng (giao diện hoặc lớp trừu tượng)
cho các phụ thuộc và làm cho lớp Project phụ thuộc vào các khái niệm trừu tượng này thay vì các
triển khai cụ thể

…/HẾT/…

3|Page

You might also like