'
ยินดีต้อนรับสู่โพสต์แรกของซีรีส์“ Design Patterns Exposed” ในซีรีส์นี้เราจะเปิดเผย Design Pattern ตั้งแต่เริ่มต้น
เพียงแค่รู้ภาษาโปรแกรมและโครงสร้างจะไม่ทำให้คุณเป็นโปรแกรมเมอร์หรือนักพัฒนาที่ดีขึ้น ต้องมีความรู้เกี่ยวกับรูปแบบการออกแบบเพื่อสร้างซอฟต์แวร์ที่จะใช้งานได้ในวันนี้และในอนาคต
นักพัฒนาหลายคนเจอปัญหาการออกแบบที่คุณกำลังเผชิญอยู่ในตอนนี้หรือจะเผชิญในอนาคต พวกเขาได้ระบุวิธีมาตรฐานในการจัดการกับปัญหานั้น ดังนั้นเมื่อใช้รูปแบบการออกแบบคุณจะได้รับประโยชน์จากการใช้เทคนิคที่พิสูจน์แล้ว
รูปแบบการออกแบบแต่ละแบบมีไว้สำหรับแก้ไขสถานการณ์บางประเภทอาจมีสถานการณ์ที่สามารถใช้รูปแบบการออกแบบได้มากกว่าหนึ่งรูปแบบ
โปรแกรมเมอร์ส่วนใหญ่พยายามแก้ปัญหาที่พวกเขาเผชิญโดยไม่ต้องกังวลเกี่ยวกับรูปแบบการออกแบบรหัสซ้ำซ้อนหรือแม้แต่การเชื่อมต่อที่แน่นหนา แต่โปรแกรมเมอร์ที่ดีเริ่มต้นไม่เหมือนกัน พวกเขาคิดถึงข้อกำหนดของวันนี้ข้อกำหนดในอนาคตการดูแลรักษาโค้ดและการนำโค้ดกลับมาใช้ใหม่ได้
โปรแกรมเมอร์ที่ดีไม่รีบร้อนที่จะเริ่มเขียนโค้ดเมื่อได้รับข้อกำหนด พวกเขานั่งครุ่นคิดถึงปัญหาว่าการออกแบบจะใช้ได้ไหม ถ้าใช่จะใช้งานได้หลังจาก 6 เดือนหรือไม่เมื่อข้อกำหนดต่างๆจะเปลี่ยนไป
โปรแกรมเมอร์ที่ดีใช้ปากกาและกระดาษและเริ่มออกแบบชั้นเรียนและความสัมพันธ์ระหว่างชั้นเรียน พวกเขาพยายามทำให้การมีเพศสัมพันธ์หลวมและการเชื่อมต่อกันสูงในการออกแบบของพวกเขาในขณะที่ทำทั้งหมดนี้พวกเขามีหลักการเชิงวัตถุอยู่ในใจ พวกเขาจะไม่เข้าไปในโค้ดระดับต่ำในทันที ในการออกแบบซอฟต์แวร์ที่ยืดหยุ่นและใช้ซ้ำได้คุณควรทำตามแนวทางนี้มิฉะนั้นคุณจะพบว่าตัวเองกำลังแก้ไขโค้ดที่คุณเขียนไว้ก่อนหน้านี้เสมอ
มีเพียงสิ่งเดียวที่คงที่ในอุตสาหกรรมซอฟต์แวร์นั่นคือ เปลี่ยน. ข้อกำหนดจะเปลี่ยนแปลงอยู่เสมอ ดังนั้นเราจะออกแบบซอฟต์แวร์ที่โค้ดของคุณสามารถปรับให้เข้ากับความต้องการในอนาคตได้อย่างไร? ด้วยเหตุนี้คุณต้องเริ่มต้นก่อนและออกแบบในลักษณะที่ข้อกำหนดในอนาคตจะไม่ทำลายรหัสเดิมของคุณ
ฉันจะทำเช่นนั้นได้อย่างไร?
สามารถทำได้โดยทำตามหลักการออกแบบและรูปแบบการออกแบบตามหลักการเหล่านั้น
ตอนนี้มาเจาะลึกการเขียนโค้ดและเริ่มต้นเส้นทางสู่การเป็นโปรแกรมเมอร์ที่ดีขึ้น ในโพสต์นี้เราจะเปิดเผยหนึ่งในรูปแบบที่สำคัญที่สุด - รูปแบบกลยุทธ์ .
เมื่อฉันพูดว่าสิ่งที่สำคัญที่สุดมันสะท้อนให้เห็นถึงปัญหาทั่วไปที่แก้ไขได้ด้วยรูปแบบกลยุทธ์
รูปแบบกลยุทธ์คืออะไร?
นี่คือคำจำกัดความที่ตรงจากหนังสือ 'Gang of Four': 'รูปแบบกลยุทธ์ใช้เพื่อสร้างกลุ่มอัลกอริทึมที่ใช้แทนกันได้ซึ่งกระบวนการที่ต้องการจะถูกเลือกในขณะรันไทม์”.
ในกรณีที่คุณเป็นไม่เข้าใจไม่ต้องกังวลเราจะอธิบายเป็นง่ายกว่าทางเพื่อที่คุณจะเข้าใจ.
print_r ()
มาทำความเข้าใจกับปัญหาก่อนแล้วเราจะมาดูกันว่ารูปแบบกลยุทธ์สามารถแก้ปัญหานั้นได้อย่างไร
ในแผนภาพ UML ด้านบนเรามีคลาส Animal abstract และคลาสคอนกรีต 2 คลาส Dog and Bird ขยายจากคลาส Animal super
ลองกำหนดคลาสนามธรรมของสัตว์และคลาสที่เป็นรูปธรรม 2 คลาสคือ Dog and Bird
คุณคิดอย่างไรเกี่ยวกับการออกแบบข้างต้น? มีข้อผิดพลาดใหญ่อย่างหนึ่งในการออกแบบของเรา
สัตว์ทุกตัวบินไม่ได้เช่นในกรณีข้างต้นสุนัขบินไม่ได้ แต่ก็ยังมีพฤติกรรม 'บิน'
เราทำผิดพลาดโดยเขียนเมธอด abstract fly () ในคลาส Animal การออกแบบนี้จะบังคับให้สุนัข, นก, เพนกวิน, จระเข้, ห่านและอื่น ๆ แต่ละคลาสย่อยใช้วิธีการบิน ()
เราควรเข้าใจว่าการบินเป็นความสามารถที่ไม่ใช่สัตว์ทุกตัวจะมี ด้วยการให้วิธีการบิน () ในคลาส Animal abstract เราได้ตั้งค่าความสามารถในการบินในคลาสย่อยทั้งหมดซึ่งไม่ถูกต้องสำหรับคลาสย่อยทั้งหมดของสัตว์
คุณอาจคิดว่าอะไรคือปัญหาในการนำวิธีบินไปใช้ในคลาสย่อย แม้ว่าคุณจะสามารถใช้เมธอด fly () ในคลาสย่อย Animal ที่ไม่บินได้เพื่อเพียงแค่พิมพ์“ ฉันบินไม่ได้” แต่ปัญหาคือคุณยังคงให้พฤติกรรมการบินกับสัตว์ที่ไม่บิน สิ่งนี้ไม่ถูกต้อง
รู้สึกอย่างไรที่เรียก dog.fly () หรือจระเข้แมลงวัน ()
ดังนั้นตอนนี้เราเข้าใจแล้วว่าการออกแบบของเราไม่ถูกต้องและเราควรลบเมธอด fly () ออกจากคลาสย่อย Animal
วิธีอื่นในการออกแบบคลาสของเราในลักษณะที่การออกแบบของเราไม่ได้บังคับให้คลาสย่อยของ Animal ทั้งหมดมีพฤติกรรมการบิน
วิธีแก้ปัญหาอย่างหนึ่งที่คิดได้ทันทีคือเราสามารถสร้างส่วนต่อประสานการบินโดยใช้วิธีการบินและมีเพียงสัตว์ที่บินได้เท่านั้นที่จะใช้ส่วนต่อประสานการบินนั้นได้ วิธีนี้เราจะไม่บังคับให้คลาสย่อย Animal ทั้งหมดกำหนดพฤติกรรมการบิน ลองเขียนโค้ดแนวทางการออกแบบนี้
ตอนนี้คลาส Animal ของเราจะมีลักษณะเหมือนโค้ดด้านล่างหลังจากลบวิธีการบินออกจากคลาส Animal
ตอนนี้เรามากำหนดอินเทอร์เฟซ Flying
ข้อดีและข้อเสียของ python
ตอนนี้คลาส Dog จะเปลี่ยนไปเช่นรหัสด้านล่างและไม่จำเป็นต้องมีพฤติกรรมการบิน
มาดูคลาสย่อย Animal ของเราที่จะมีพฤติกรรมการบิน
เราได้แก้ไขปัญหาก่อนหน้านี้แล้ว แต่เราพบปัญหาใหม่นั่นคือ 'การทำสำเนาโค้ด'
สมมติว่าเราจะมีคลาสย่อยสัตว์บินที่แตกต่างกัน 100 คลาส เราต้องทำซ้ำรหัสสำหรับพฤติกรรมการบินเนื่องจากอินเทอร์เฟซการบินไม่สามารถให้การใช้งานสำหรับพฤติกรรมการบินใด ๆ และในภายหลังหากเราต้องการเปลี่ยนการใช้วิธีการบิน () ในคลาสย่อยใด ๆ เราจะต้องเปิดคลาสนั้นและเปลี่ยนรหัส ซึ่งไม่ดี เราขาดบางสิ่งที่ยิ่งใหญ่และนั่นคือเราไม่สามารถเปลี่ยนพฤติกรรมการบินของชั้นเรียนในเวลาวิ่งได้
แต่ไม่ต้องกังวลรูปแบบกลยุทธ์พร้อมให้คุณออกจากปัญหานี้
มาปรับโครงสร้างโค้ดของเราใหม่เพื่อใช้รูปแบบกลยุทธ์
ส่วนต่อประสานการบินจะยังคงเหมือนเดิม ตอนนี้แทนที่จะเป็นคลาสย่อยที่บินแต่ละคลาสที่ใช้อินเทอร์เฟซการบินด้วยตัวเองเราจะกำหนดคลาสคอนกรีตแยกต่างหากที่จะใช้พฤติกรรมการบินที่แตกต่างกัน มาดูวิธีทำกัน
ดังนั้นวิธีการทำงานทั้งหมดมาดู TestClass กัน
ด้วยการใช้รูปแบบกลยุทธ์ตอนนี้เราสามารถเปลี่ยนพฤติกรรมการบินของสัตว์ใด ๆ ในเวลาวิ่งได้และนั่นก็คือโดยไม่ต้องบังคับคลาสย่อยใด ๆ เพื่อระบุพฤติกรรมการบิน
ควรใช้รูปแบบกลยุทธ์เมื่อใด
เมื่อคุณต้องการที่จะสามารถเปลี่ยนแปลงพฤติกรรมในขณะทำงานแบบไดนามิก
เพื่อให้แน่ใจว่าคุณเข้าใจรูปแบบกลยุทธ์อย่างชัดเจนเรามาดูอีกตัวอย่างหนึ่ง
ในระดับพนักงานข้างต้นเรากำลังกำหนดค่าจ้างของพนักงานขึ้นอยู่กับการกำหนดของเขา / เธอ หากพนักงานเป็น“ นักศึกษาฝึกงาน” เราจะเพิ่มโบนัส 10% ในเงินเดือนขั้นพื้นฐานเพื่อคำนวณการจ่ายจริง
หากพนักงานเป็น“ นักพัฒนาเว็บ” เราจะเพิ่มโบนัส 20% ในเงินเดือนขั้นพื้นฐานเพื่อคำนวณการจ่ายจริงและกระบวนการที่คล้ายกันจะตามมาสำหรับพนักงานประเภทอื่น ๆ แม้ว่าอัลกอริทึมของเราในการคำนวณการจ่ายจริงจะง่ายมากเพื่อให้เข้าใจง่ายขึ้น แต่โดยส่วนใหญ่แล้วจะมีการเปรียบเทียบและการคำนวณมากมาย
รหัสระดับพนักงานมีอะไรผิดปกติ
รหัสสำหรับการคำนวณการจ่าย (getPay ()) เป็นแบบคงที่ สมมติว่าฉันต้องการเปลี่ยนโบนัสสำหรับ“ นักศึกษาฝึกงาน” จาก 10% เป็น 14% ฉันจะต้องเปิดรหัสระดับพนักงานและเปลี่ยนรหัส
และปัญหาอีกประการหนึ่งคือฉันไม่สามารถเปลี่ยนอัลกอริทึมการจ่ายเงินของพนักงานในขณะทำงานได้ แล้วจะทำอย่างไร? รูปแบบกลยุทธ์ใช้สำหรับจัดการปัญหาประเภทนี้โดยเฉพาะ
มาเปลี่ยนรหัสใหม่เพื่อใช้รูปแบบกลยุทธ์
วิธีใช้ java swing
ฉันจะกำหนดอัลกอริทึมต่างๆเพื่อคำนวณการจ่ายเงิน จากนั้นฉันจะสามารถใช้อัลกอริทึมใด ๆ เหล่านี้เพื่อคำนวณการจ่ายเงิน ณ รันไทม์
ตอนนี้เรามาดูกันว่าคลาสพนักงานจะเปลี่ยนไปอย่างไร
บันทึก: ฉันได้ลบตรรกะการคำนวณค่าจ้างออกจากคลาสพนักงานและสร้างชุดวิธีการ PayAlgorithm () ซึ่งฉันจะตั้งค่าอัลกอริทึมการจ่ายเงินที่ฉันต้องการใช้สำหรับการคำนวณค่าจ้าง
สิ่งนี้จะทำให้ฉันมีความยืดหยุ่นในการคำนวณการจ่ายเงินโดยการระบุ PayAlgorithm ใด ๆ แบบไดนามิกในขณะทำงาน นอกจากนี้โปรดทราบว่าในภายหลังหากฉันต้องเปลี่ยนตรรกะการคำนวณการจ่ายฉันสามารถสร้างอัลกอริทึม PayAlgorithm ใหม่และใช้เพื่อคำนวณการจ่ายเงินได้ ฉันไม่จำเป็นต้องเปลี่ยนรหัสก่อนหน้ามันไม่ดีเหรอ?
มาดูกันว่ามันใช้งานได้
ฉันหวังว่าคุณจะเข้าใจรูปแบบกลยุทธ์เป็นอย่างดี วิธีที่ดีที่สุดในการเรียนรู้บางสิ่งคือการฝึกฝน
ในกรณีที่คุณมีข้อสงสัยเกี่ยวกับรูปแบบกลยุทธ์หรือรูปแบบอื่น ๆ โปรดฝากคำถามไว้ด้านล่าง
ระวังโพสต์ถัดไปที่เราจะเปิดเผยรูปแบบการออกแบบที่ได้รับความนิยมมากที่สุดรูปแบบโรงงาน
ถึงตอนนั้นคุณสามารถดาวน์โหลดโค้ดเล่นได้และตรวจสอบให้แน่ใจว่าคุณได้ประสานรูปแบบกลยุทธ์ในหัวของคุณ
มีคำถามสำหรับเรา? พูดถึงพวกเขาในส่วนความคิดเห็นแล้วเราจะติดต่อกลับไป
กระทู้ที่เกี่ยวข้อง: