รูปแบบการออกแบบที่เปิดเผย: รูปแบบกลยุทธ์



ในบล็อกนี้เราจะเปิดเผยรูปแบบการออกแบบกลยุทธ์ซึ่งใช้ในการสร้างกลุ่มอัลกอริทึมที่ใช้แทนกันได้ซึ่งสามารถเลือกได้แบบไดนามิก

'

ยินดีต้อนรับสู่โพสต์แรกของซีรีส์“ 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 ใหม่และใช้เพื่อคำนวณการจ่ายเงินได้ ฉันไม่จำเป็นต้องเปลี่ยนรหัสก่อนหน้ามันไม่ดีเหรอ?

มาดูกันว่ามันใช้งานได้

ฉันหวังว่าคุณจะเข้าใจรูปแบบกลยุทธ์เป็นอย่างดี วิธีที่ดีที่สุดในการเรียนรู้บางสิ่งคือการฝึกฝน

ในกรณีที่คุณมีข้อสงสัยเกี่ยวกับรูปแบบกลยุทธ์หรือรูปแบบอื่น ๆ โปรดฝากคำถามไว้ด้านล่าง

ระวังโพสต์ถัดไปที่เราจะเปิดเผยรูปแบบการออกแบบที่ได้รับความนิยมมากที่สุดรูปแบบโรงงาน

ถึงตอนนั้นคุณสามารถดาวน์โหลดโค้ดเล่นได้และตรวจสอบให้แน่ใจว่าคุณได้ประสานรูปแบบกลยุทธ์ในหัวของคุณ

มีคำถามสำหรับเรา? พูดถึงพวกเขาในส่วนความคิดเห็นแล้วเราจะติดต่อกลับไป

กระทู้ที่เกี่ยวข้อง: