อย่างไรก็ตามตราบใดที่คุณเชื่อมั่นว่าหลักการของการทดแทนของ Liskov จะเป็นไปตามนั้นทำไมคุณถึงไม่ยอมให้มันล้มล้าง?
ตัวอย่างเช่นเนื่องจากฉันต้องการให้การนำโครงกระดูกของอัลกอริทึมไปใช้คงที่และอนุญาตเฉพาะบางส่วนเท่านั้นที่จะถูกกำหนดโดยคลาสย่อย นี่เป็นที่รู้จักอย่างกว้างขวางว่าเป็นรูปแบบวิธีการของแม่แบบ (เน้นด้านล่างโดยฉัน):
เทมเพลตเมธอดจึงจัดการภาพขนาดใหญ่ของซีแมนทิกส์ของงานและรายละเอียดการใช้งานที่ละเอียดยิ่งขึ้นของการเลือกและลำดับของเมธอด รูปภาพขนาดใหญ่นี้เรียกวิธีการแบบนามธรรมและไม่ใช่แบบนามธรรมสำหรับงานในมือ วิธีการที่ไม่เป็นนามธรรมถูกควบคุมอย่างสมบูรณ์โดยวิธีแม่แบบ แต่วิธีนามธรรมที่นำมาใช้ในคลาสย่อยให้อำนาจการแสดงออกของรูปแบบและระดับของเสรีภาพ วิธีการเชิงนามธรรมบางส่วนหรือทั้งหมดอาจมีความเชี่ยวชาญในคลาสย่อยช่วยให้นักเขียนของคลาสย่อยสามารถแสดงพฤติกรรมที่เฉพาะเจาะจงโดยมีการปรับเปลี่ยนน้อยที่สุดเพื่อความหมายที่ใหญ่กว่า เทมเพลตเมธอด (ซึ่งไม่ใช่แบบนามธรรม) ยังคงไม่เปลี่ยนแปลงในรูปแบบนี้ทำให้มั่นใจได้ว่าเมธอดที่ไม่เป็นนามธรรมและวิธีการแบบนามธรรมถูกเรียกในลำดับที่ตั้งใจไว้ แต่เดิม
ปรับปรุง
ตัวอย่างที่เป็นรูปธรรมของโครงการที่ฉันได้ทำ:
- การสื่อสารกับระบบเมนเฟรมดั้งเดิมผ่าน "หน้าจอ" ที่หลากหลาย แต่ละหน้าจอมีหลายฟิลด์ชื่อคงที่ตำแหน่งและความยาวมีบิตข้อมูลเฉพาะ คำขอเติมข้อมูลบางฟิลด์ด้วยข้อมูลเฉพาะ การตอบกลับจะส่งคืนข้อมูลในฟิลด์อื่นอย่างน้อยหนึ่งฟิลด์ แต่ละธุรกรรมตามตรรกะพื้นฐานเดียวกัน แต่รายละเอียดจะแตกต่างกันในทุกหน้าจอ เราใช้วิธีการเทมเพลตในโครงการที่แตกต่างกันเพื่อใช้โครงกระดูกคงที่ของตรรกะการจัดการหน้าจอในขณะที่อนุญาตให้คลาสย่อยเพื่อกำหนดรายละเอียดเฉพาะของหน้าจอ
- การส่งออก / นำเข้าข้อมูลการกำหนดค่าในตาราง DB ไปยัง / จากไฟล์ Excel อีกครั้งสคีมาพื้นฐานของการประมวลผลไฟล์ Excel และการแทรก / อัปเดตฐานข้อมูล DB หรือการถ่ายโอนข้อมูลไปยัง Excel นั้นเหมือนกันสำหรับแต่ละตาราง แต่รายละเอียดของแต่ละตารางนั้นแตกต่างกัน ดังนั้นเทมเพลตเมธอดคือตัวเลือกที่ชัดเจนมากในการกำจัดการทำซ้ำโค้ดและทำให้โค้ดเข้าใจและบำรุงรักษาได้ง่ายขึ้น
- สร้างเอกสาร PDF เอกสารแต่ละฉบับมีโครงสร้างเดียวกัน แต่เนื้อหาของเอกสารแต่ละฉบับนั้นแตกต่างกันไปขึ้นอยู่กับปัจจัยหลายประการ อีกครั้งวิธีเทมเพลตทำให้ง่ายต่อการแยกโครงกระดูกคงที่ของอัลกอริทึมการสร้างออกจากรายละเอียดเฉพาะกรณีและเปลี่ยนแปลงได้ ในความเป็นจริง. มันก็จะนำไปใช้ในหลายระดับที่นี่เป็นเอกสารที่ประกอบด้วยหลายส่วนซึ่งแต่ละประกอบด้วยศูนย์หรือมากกว่าสาขา วิธีเทมเพลตมีการใช้งาน 3 ระดับที่แตกต่างกันที่นี่
ในสองกรณีแรกการใช้งานแบบดั้งเดิมใช้กลยุทธ์ทำให้เกิดโค้ดซ้ำจำนวนมากซึ่งแน่นอนว่าในช่วงหลายปีที่ผ่านมามีความแตกต่างเล็กน้อยที่นี่และที่นั่นมีข้อผิดพลาดซ้ำหรือแตกต่างกันเล็กน้อยและยากมากที่จะรักษา การเปลี่ยนเป็นวิธีแม่แบบ (และการปรับปรุงอื่น ๆ เช่นการใช้คำอธิบายประกอบ Java) ลดขนาดรหัสลงประมาณ 40-70%
เหล่านี้เป็นเพียงตัวอย่างล่าสุดที่มาถึงใจของฉัน ฉันสามารถอ้างถึงกรณีเพิ่มเติมจากเกือบทุกโครงการที่ฉันทำงานมาจนถึงตอนนี้