ขณะนี้ฉันกำลังทำงานกับ webapp ซึ่งเรามักจะต้องกำหนดเงื่อนไขของเซิร์ฟเวอร์บางอย่างโดยอิงจากหน้าเว็บที่จะถูกส่งคืนให้กับผู้ใช้
แต่ละหน้าจะได้รับรหัสหน้า 4 ตัวอักษรและรหัสหน้าเหล่านี้มีการระบุไว้ในชั้นเรียนเป็นสตริงคงที่:
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..
}
และบ่อยครั้งที่ในโค้ดเราเห็นโค้ดลักษณะนี้ ( รูปแบบที่ 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
}
การอ่านแบบไหนที่น่ากลัวเพราะมันไม่ได้แสดงให้เห็นว่าคุณสมบัติทั่วไปของหน้าเหล่านี้ทำให้ผู้เขียนรหัสมารวมกันที่นี่ เราต้องอ่านรหัสในif
สาขาเพื่อให้เข้าใจ
ทางออกปัจจุบัน
ส่วนเหล่านี้if
ได้รับการทำให้ง่ายขึ้นโดยใช้รายการหน้าซึ่งประกาศโดยคนต่าง ๆ ในชั้นเรียนที่แตกต่างกัน ทำให้โค้ดดูเหมือน ( แบบที่ 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
}
... ซึ่งเป็นการแสดงออกถึงเจตนาที่ดีกว่ามาก แต่...
ปัญหาปัจจุบัน
ปัญหาที่นี่คือถ้าเราเพิ่มหน้าเราในทางทฤษฎีจะต้องผ่านฐานรหัสทั้งหมดเพื่อค้นหาว่าเราจำเป็นต้องเพิ่มหน้าของเราไปยังรายการif()
หรือรายการแบบนั้น
แม้ว่าเราจะย้ายรายการเหล่านั้นทั้งหมดไปยังPageCodes
ชั้นเรียนเป็นค่าคงที่แบบคงที่มันก็ยังต้องการวินัยจากนักพัฒนาเพื่อตรวจสอบว่าหน้าใหม่ของพวกเขาเหมาะกับรายการใด ๆ เหล่านั้นและเพิ่มตามนั้น
โซลูชั่นใหม่
โซลูชันของฉันคือการสร้าง enum (เนื่องจากมีรายการรหัสหน้าเว็บที่รู้จักกันดี) ซึ่งแต่ละหน้ามีคุณสมบัติบางอย่างที่เราต้องตั้งค่า:
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
}
จากนั้นรหัสเงื่อนไขนี้จะมีลักษณะดังนี้ ( รูปแบบที่ 3 ):
if (destinationPage.hasShoppingCart()) {
// add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
// add some info related to flight availability
}
ซึ่งอ่านง่ายมาก นอกจากนี้หากมีคนต้องการเพิ่มหน้าเขา / เธอถูกบังคับให้คิดเกี่ยวกับบูลีนแต่ละครั้งและไม่ว่าจะเป็นเรื่องจริงหรือเท็จสำหรับหน้าใหม่ของเขา
ปัญหาใหม่
ปัญหาหนึ่งที่ฉันเห็นคืออาจจะมี 10 booleans เช่นนี้ซึ่งทำให้ตัวสร้างใหญ่จริงๆและมันอาจจะยากที่จะได้รับการประกาศเมื่อคุณเพิ่มหน้า ไม่มีใครมีทางออกที่ดีกว่า?