Tôi hiện đang làm việc trên một ứng dụng web nơi chúng ta thường cần đưa ra một số logic máy chủ dựa trên trang sẽ được trả lại cho người dùng.
Mỗi trang được cung cấp một mã trang gồm 4 chữ cái và các mã trang này hiện được liệt kê trong một lớp dưới dạng Chuỗi tĩnh:
public class PageCodes {
public static final String FOFP = "FOFP";
public static final String FOMS = "FOMS";
public static final String BKGD = "BKGD";
public static final String ITCO = "ITCO";
public static final String PURF = "PURF";
// etc..
}
Và thường trong mã chúng ta thấy mã như thế này ( mẫu thứ 1 ):
if (PageCode.PURF.equals(destinationPageCode) || PageCodes.ITCO.equals(destinationPageCode)) {
// some code with no obvious intent
}
if (PageCode.FOFP.equals(destinationPageCode) || PageCodes.FOMS.equals(destinationPageCode)) {
// some other code with no obvious intent either
}
Điều này thật kinh khủng khi đọc bởi vì nó không hiển thị thuộc tính chung nào của các trang này đã khiến tác giả của mã đặt chúng ở đây. Chúng ta phải đọc mã trong if
chi nhánh để hiểu.
Giải pháp tạm thời
Những if
phần này đã được đơn giản hóa bằng cách sử dụng danh sách các trang được khai báo bởi những người khác nhau trong các lớp khác nhau. Điều này làm cho mã trông giống như ( mẫu thứ 2 ):
private static final List<String> pagesWithShoppingCart = Collections.unmodifiableList(Arrays.asList(PageCodes.ITCO, PageCodes.PURF));
private static final List<String> flightAvailabilityPages = Collections.unmodifiableList(Arrays.asList(PageCodes.FOMS, PageCodes.FOFP));
// later in the same class
if (pagesWithShoppingCart.contains(destinationPageCode)) {
// some code with no obvious intent
}
if (flightAvailabilityPages.contains(destinationPageCode)) {
// some other code with no obvious intent either
}
... Đó là thể hiện ý định tốt hơn nhiều. Nhưng...
Vấn đề hiện tại
Vấn đề ở đây là nếu chúng ta thêm một trang, về lý thuyết chúng ta cần phải đi qua tất cả các cơ sở mã để tìm xem chúng ta có cần thêm trang của mình vào một if()
hoặc vào danh sách như vậy không.
Ngay cả khi chúng tôi đã chuyển tất cả các danh sách đó sang PageCodes
lớp dưới dạng hằng số tĩnh, nó vẫn cần kỷ luật từ các nhà phát triển để kiểm tra xem trang mới của họ có phù hợp với bất kỳ danh sách nào không và thêm nó vào danh sách đó.
Giải pháp mới
Giải pháp của tôi là tạo ra một enum (vì có một danh sách mã trang nổi tiếng hữu hạn) trong đó mỗi trang chứa một số thuộc tính mà chúng ta cần đặt:
public enum Page {
FOFP(true, false),
FOMS(true, false),
BKGD(false, false),
PURF(false, true),
ITCO(false, true),
// and so on
private final boolean isAvailabilityPage;
private final boolean hasShoppingCart;
PageCode(boolean isAvailabilityPage, boolean hasShoppingCart) {
// field initialization
}
// getters
}
Sau đó, mã điều kiện bây giờ trông như thế này ( mẫu thứ 3 ):
if (destinationPage.hasShoppingCart()) {
// add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
// add some info related to flight availability
}
Mà rất dễ đọc. Ngoài ra, nếu ai đó cần thêm một trang, anh ấy / cô ấy buộc phải suy nghĩ về từng boolean và liệu điều này là đúng hay sai cho trang mới của anh ấy.
Vấn đề mới
Một vấn đề tôi thấy là sẽ có khoảng 10 booleans như thế này, điều này làm cho hàm tạo thực sự lớn và có thể khó có được khai báo ngay khi bạn thêm một trang. Có ai có một giải pháp tốt hơn?