ฉันมีชั้นเรียนที่ใช้ในการประมวลผลการชำระเงินของลูกค้า ทั้งหมดยกเว้นหนึ่งในวิธีการของคลาสนี้จะเหมือนกันสำหรับลูกค้าทุกคนยกเว้นวิธีที่คำนวณ (ตัวอย่าง) จำนวนผู้ใช้ของลูกค้าที่ค้างชำระ สิ่งนี้อาจแตกต่างกันอย่างมากจากลูกค้าไปยังลูกค้าและไม่มีวิธีง่ายๆในการจับตรรกะของการคำนวณในบางสิ่งบางอย่างเช่นไฟล์คุณสมบัติเนื่องจากอาจมีปัจจัยที่กำหนดเองจำนวนเท่าใดก็ได้
ฉันสามารถเขียนรหัสน่าเกลียดที่เปลี่ยนตาม customerID:
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
แต่สิ่งนี้ต้องการการสร้างคลาสใหม่ทุกครั้งที่เราได้ลูกค้าใหม่ อะไรคือวิธีที่ดีกว่า
[แก้ไข] บทความ "ซ้ำกัน" แตกต่างอย่างสิ้นเชิง ฉันไม่ได้ถามว่าจะหลีกเลี่ยงคำสั่ง switch ได้อย่างไรฉันกำลังขอการออกแบบที่ทันสมัยที่ใช้กับกรณีนี้ได้ดีที่สุด - ซึ่งฉันสามารถแก้ไขได้ด้วยคำสั่ง switch หากฉันต้องการเขียนรหัสไดโนเสาร์ ตัวอย่างที่ให้ไว้มีทั่วไปและไม่เป็นประโยชน์เนื่องจากพวกเขาบอกว่า "เฮ้สวิตช์ทำงานได้ค่อนข้างดีในบางกรณีไม่ใช่ในบางกรณี"
[แก้ไข] ฉันตัดสินใจเลือกคำตอบอันดับต้น ๆ (สร้างคลาส "ลูกค้า" แยกต่างหากสำหรับลูกค้าแต่ละรายที่ใช้อินเทอร์เฟซมาตรฐาน) ด้วยเหตุผลดังต่อไปนี้:
ความสอดคล้อง: ฉันสามารถสร้างอินเทอร์เฟซที่สร้างความมั่นใจว่าลูกค้าทุกระดับจะได้รับและส่งคืนผลลัพธ์เดียวกันแม้ว่าจะสร้างโดยนักพัฒนาคนอื่น
การบำรุงรักษา: รหัสทั้งหมดจะถูกเขียนในภาษาเดียวกัน (Java) ดังนั้นจึงไม่จำเป็นต้องให้คนอื่นเรียนรู้ภาษาการเข้ารหัสที่แยกต่างหากเพื่อรักษาสิ่งที่ควรจะเป็นคุณลักษณะที่ง่ายตาย
การใช้ซ้ำ: ในกรณีที่เกิดปัญหาที่คล้ายกันในรหัสฉันสามารถใช้คลาสลูกค้าเพื่อเก็บวิธีการใด ๆ เพื่อใช้ตรรกะ "กำหนดเอง"
ความคุ้นเคย: ฉันรู้วิธีการทำสิ่งนี้อยู่แล้วดังนั้นฉันจึงสามารถทำมันได้อย่างรวดเร็วและไปยังประเด็นอื่นที่เร่งด่วนกว่า
ข้อเสีย:
ลูกค้าใหม่แต่ละรายต้องการการรวบรวมคลาสลูกค้าใหม่ซึ่งอาจเพิ่มความซับซ้อนให้กับวิธีการที่เรารวบรวมและปรับใช้การเปลี่ยนแปลง
ลูกค้าใหม่แต่ละรายจะต้องถูกเพิ่มโดยนักพัฒนาผู้สนับสนุนไม่สามารถเพิ่มตรรกะให้กับไฟล์คุณสมบัติได้ สิ่งนี้ไม่เหมาะ ... แต่แล้วฉันก็ไม่แน่ใจว่าผู้สนับสนุนจะสามารถเขียนตรรกะทางธุรกิจที่จำเป็นได้อย่างไรโดยเฉพาะอย่างยิ่งถ้ามันมีความซับซ้อนพร้อมข้อยกเว้นมากมาย
มันจะขยายขนาดไม่ได้หากเราเพิ่มลูกค้าใหม่จำนวนมาก สิ่งนี้ไม่ได้คาดหวัง แต่ถ้ามันเกิดขึ้นเราจะต้องคิดใหม่อีกหลายส่วนของรหัสเช่นนี้
สำหรับผู้ที่คุณสนใจคุณสามารถใช้ Java Reflection เพื่อโทรหาชั้นเรียนตามชื่อ:
Payment payment = getPaymentFromSomewhere();
try {
String nameOfCustomClass = propertiesFile.get("customClassName");
Class<?> cpp = Class.forName(nameOfCustomClass);
CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();
payment = pp.processPayment(payment);
} catch (Exception e) {
//handle the various exceptions
}
doSomethingElseWithThePayment(payment);