แบบจำลองการออกแบบสำหรับผู้เริ่มต้น
เผยแพร่แล้ว: 2016-01-13หากคุณเคยเขียนโปรแกรมสำหรับผลิตภัณฑ์หรือซอฟต์แวร์ประยุกต์ ไม่ว่าเล็กหรือใหญ่ คุณมักจะใช้ Design Patterns เป็นจำนวนมาก... แม้ว่าจะเป็นไปได้ว่ารูปแบบเหล่านี้อาจไม่ใช่รูปแบบการออกแบบ/มาตรฐานที่ใช้กันมากที่สุด
แต่ใช่ มีความแตกต่างที่ชัดเจนระหว่างการนำรูปแบบการออกแบบไปใช้และ "การใช้" รูปแบบการออกแบบ… ไม่ว่าจะด้วยวิธีใด บุคคลที่ทำงานกับรูปแบบการออกแบบจะเข้าใจมัน หรือจะเข้าใจได้ง่าย
ประเด็นคือ รูปแบบการออกแบบไม่ใช่เรื่องใหม่สำหรับโปรแกรมเมอร์
ในบทความด้านล่างนี้ ฉันกำลังพยายามอธิบายรูปแบบการออกแบบในพื้นฐาน และเราจะศึกษารายละเอียดของรูปแบบต่างๆ ตัวอย่าง ฯลฯ ในบทความอื่น
รูปแบบการออกแบบคืออะไร?
เพื่อเริ่มต้น…
ฉันคิดว่าวิธีที่ดีที่สุดในการเริ่มต้นด้วยการทำความเข้าใจรูปแบบการออกแบบ คือการทำความเข้าใจรูปแบบที่ไม่ใช่ทางเทคนิคที่เราติดตามในชีวิตประจำวันของเราอย่างรู้เท่าทัน/โดยไม่รู้ตัว
ตัวอย่างเช่น นำ Resumes จำนวนมากที่ส่งเข้ามาเพื่อรับตำแหน่งงานว่าง เรซูเม่ของแต่ละคนไม่เหมือนกัน... แม้ว่าทุกคนมักจะทำแบบเดียวกัน นั่นคือการบอกผู้อ่านว่าพวกเขามีทักษะอะไร หรือเขา/เธอจะเหมาะสมกับงานนี้ได้อย่างไร
ผู้ที่ส่งเรซูเม่ไปยังงานส่วนใหญ่ทราบดีว่าพวกเขาจำเป็นต้องส่งเรซูเม่พร้อมชุดข้อมูลเฉพาะในเอกสาร Word ที่มีรูปแบบ
นี่… เป็นรูปแบบที่ทุกคนส่งประวัติย่อพร้อมชุดข้อมูลเฉพาะที่แสดงอยู่ในนั้น
ถ้าคุณรู้สึกว่า... เรียกมันว่าเทมเพลตแทนรูปแบบ เทมเพลตการออกแบบ
ในชีวิตจริงมีหลายอย่างที่เป็นแบบแผน บางคนชอบตัวอย่างด้านล่าง:
เชฟทุกคนทั่วโลกปรุงพิซซ่าหรือเฟรนช์ฟรายส์ด้วยวิธีเดียวกัน แม้ว่าพวกเขาจะเติมมัน / แต่งรสให้แตกต่างออกไป นั่นคือรูปแบบ
การออกแบบของรถทุกคันเป็นไปตามรูปแบบการออกแบบพื้นฐาน ทั้งสี่ล้อ พวงมาลัย ระบบขับเคลื่อนหลัก เช่น คันเร่ง-เบรก-คลัตช์ เป็นต้น
ทุกสิ่งที่สร้างขึ้น/ผลิตซ้ำๆ จะต้องเป็นไปตามรูปแบบในการออกแบบของมันอย่างหลีกเลี่ยงไม่ได้… ไม่ว่าจะเป็นรถยนต์ พิซซ่า เครื่องเอทีเอ็ม อะไรก็ตาม… แม้แต่แปรงสีฟัน
การออกแบบที่เกือบจะกลายเป็นวิธีมาตรฐานในการเขียนโค้ดลอจิก/กลไก/เทคนิคบางอย่างในซอฟต์แวร์ ดังนั้นจึงเป็นที่รู้จักกันในชื่อ – และด้วยเหตุนี้ – การศึกษาในรูปแบบการออกแบบซอฟต์แวร์
เหตุใดรูปแบบการออกแบบจึงมีความสำคัญ
โดยทั่วไปด้วยเหตุผลสองประการ:
- ให้ยึดมั่นในมาตรฐาน
- เพื่อเร่งพัฒนา
ฉันจะอธิบายโดยละเอียด
ประการแรก เราเข้าใจแล้วว่าเหตุใดการยึดติดกับรูปแบบมาตรฐานจึงน่าสนใจ
มาดูรายการตัวอย่าง Resumes ที่เราได้พูดคุยกันก่อนหน้านี้
อาจมีผู้สมัครหนึ่งหรือสองคนที่ส่งใบสมัครงานทางข้อความอีเมลโดยไม่มีรูปแบบที่เหมาะสม ไม่มีการแนบไปกับอีเมล ฯลฯ .. ผู้สมัครหนึ่งหรือสองคนนี้ไม่ทำตามแบบ.. และไม่น่าจะจบลง กับงาน…. ทำไม? เพราะพวกเขากำลังเบี่ยงเบนไปจากรูปแบบที่เป็นที่ยอมรับซึ่งอาจไม่เป็นที่พอใจของผู้สมัครงานสั้น ๆ
มีใครบ้างที่เบี่ยงเบนจากรูปแบบและกลายเป็น "เท่ห์" หรือไม่? นั่นไม่ใช่นวัตกรรมเหรอ?
ใช่ มีบางครั้งที่เรซูเม่ที่นำเสนอแตกต่างไปจากเดิมอย่างสิ้นเชิงทำให้งานแตกต่างจากที่อื่น โดยปกติ ฉันเคยได้ยินเกี่ยวกับนักออกแบบเว็บไซต์ที่เริ่มงานสำคัญเพราะพวกเขารวบรวมและนำเสนอภาพยนตร์ซีดีของงานของพวกเขา หรือสร้างตัวละครแอนิเมชั่นที่อธิบายงานของพวกเขา ได้โพสต์ไว้ในบล็อกของพวกเขา และสิ่งต่างๆ เช่นนั้น
แต่..นี่คือการทดลอง ( นวัตกรรมมาจากการทดลองที่ประสบความสำเร็จ )
ส่วนใหญ่ในการพัฒนาซอฟต์แวร์ คุณไม่สามารถทดลองได้ เนื่องจากความกดดันของไทม์ไลน์ ความคาดหวัง ฯลฯ แต่ใช่ บางครั้ง โครงการที่น่าสนใจบางโครงการก็อนุญาตให้ทำการทดลองได้
ในซอฟต์แวร์ เราไม่สามารถทำสิ่งพื้นฐานเช่นการฝากเงินผ่านธนาคารได้… ใน 101 วิธี… จะมีเพียงไม่กี่วิธีในการประมวลผลการฝากเงินผ่านธนาคาร.. ดังนั้นจึงควรปฏิบัติตามรูปแบบที่กำหนดไว้และทดสอบแล้ว
นอกจากนี้ รูปแบบการออกแบบส่วนใหญ่ยังมีรูปแบบต่างๆ อีกด้วย... รูปแบบบางส่วนได้รับความนิยมอย่างมากจนรูปแบบต่างๆ จะเป็นรูปแบบมาตรฐานใหม่ของรูปแบบด้วย
คาดว่าโครงการซอฟต์แวร์ในปัจจุบัน (อย่างน้อยโดยปริยาย) จะเป็นไปตามการออกแบบผลิตภัณฑ์/ซอฟต์แวร์ที่คล้ายคลึงกันในตลาดที่กำหนดไว้แล้ว
นี่คือจุดที่การยึดมั่นในสไตล์การเข้ารหัสหรือรูปแบบการออกแบบมาตรฐานช่วยให้การพัฒนาซอฟต์แวร์… เร่งการพัฒนา ขจัดค่าใช้จ่ายในการกังวลเกี่ยวกับการใช้งานใหม่ที่ยังไม่ได้ทดสอบ ฯลฯ
เร่งเวลาในการพัฒนา
การปฏิบัติตามรูปแบบการออกแบบมาตรฐานยังมีข้อได้เปรียบในการสื่อสารอย่างง่ายดายผ่านแผนผัง / ลำดับชั้นของสถาปนิกซอฟต์แวร์, หัวหน้าโมดูล, หัวหน้าทีม, นักพัฒนา ฯลฯ เกี่ยวกับ "วิธี" บางอย่างที่ต้องพัฒนา ไม่ใช่แค่ "อะไร" จะต้องเป็น ที่พัฒนา.
บางครั้งก็ช่วยทีมทดสอบได้ด้วยซ้ำ เพราะผู้ทดสอบจะทราบจากประสบการณ์ว่าโค้ดที่ตามรูปแบบการออกแบบเฉพาะนั้นอาจทดสอบด้วยวิธีเฉพาะด้วยชุดเครื่องมือทดสอบในช่วงเวลาหนึ่ง และการออกแบบที่รู้จักดังกล่าวอาจไม่มีข้อบกพร่อง หรือมีข้อบกพร่อง 'ที่ทราบ' บางอย่าง
ไม่ใช้ Design Patterns เพื่อสร้างความรู้สึกส่วนตัวใช่หรือไม่
ไม่ ประการแรกเพราะเราไม่ได้บอกว่าคุณทำตามรูปแบบการออกแบบและไม่มีอะไรเกิดขึ้นอีก การดำเนินโครงการส่วนใหญ่ใช้ข้อกำหนดพื้นฐานร่วมกับโครงการอื่นๆ เท่านั้น และมีแนวโน้มว่าจะมีความคลาดเคลื่อน การสร้างความเบี่ยงเบนเหล่านี้จะต้องมีการงอและยืดรูปแบบมาตรฐานที่ใช้ในการนำไปใช้

มันเหมือนกับการทำพิซซ่าด้วยวิธีมาตรฐาน แล้วปรุงแต่ง/นำเสนอตามความต้องการที่แตกต่างกัน ไม่ว่าจะเป็นพิซซ่าแบบพายเต็ม พายแบบคัทพาย หรืออะไรก็ตาม
ในการทำความเข้าใจถึงความสำคัญของรูปแบบการออกแบบ สิ่งหนึ่งที่ **สำคัญมาก :
Design Patterns ไม่ใช่เทคโนโลยีหรือเฟรมเวิร์กใดๆ ที่บริษัทหรือภาษาโปรแกรมใดบังคับใช้กับเรา นั่นหมายความว่า มันเหมือนกับแนวคิดที่เปิดกว้าง.. คุณมีอิสระที่จะนำไปใช้ ใช้งาน ปรับเปลี่ยนตามความต้องการของคุณ และที่สำคัญ... รู้สึกว่ามันเป็นของคุณเอง
รูปแบบการออกแบบมาตรฐานหรือที่นิยมทั้งหมด จริง ๆ แล้วขยายได้ค่อนข้างมาก. พวกเขากลายเป็นที่นิยมในตอนแรกเพียงเพราะหลายคนใช้.. และหลายคนใช้เพียงเพราะยืดหยุ่นตามความต้องการ
หรือคุณคิดว่ารูปแบบการออกแบบมาตรฐานจะเข้ากับโครงการในรัฐนิวเจอร์ซีย์สำหรับบริษัทแห่งหนึ่งและในบังกาลอร์สำหรับบริษัทอื่นและโครงการประเภทอื่นได้อย่างไร
นั่นนำเราไปสู่ " รูปแบบการออกแบบส่วนใหญ่เป็นแบบทั่วไป " ... หมายความว่าพวกเขาไม่ได้ใช้สำหรับการสร้างซอฟต์แวร์ประเภทเดียวกันเสมอไป คุณอาจไม่ได้ยินสิ่งต่างๆ เช่น “รูปแบบการออกแบบซอฟต์แวร์การธนาคาร” หรือ “รูปแบบการออกแบบซอฟต์แวร์เครือข่ายสังคม” ที่ใช้ในการสนทนาทั่วไป… แต่มีเพียง “รูปแบบการออกแบบ” เท่านั้น
ใครควรกังวลเกี่ยวกับรูปแบบการออกแบบ?
- เช่นเดียวกับการที่สถาปนิกอาคารที่ดีพัฒนาทักษะในการออกแบบอาคาร โดยการศึกษาสถาปัตยกรรมและการออกแบบอาคารและรูปทรงจำนวนมากตลอดชีวิตของเขา/เธอ สถาปนิกซอฟต์แวร์ควรศึกษาและจินตนาการว่าระบบซอฟต์แวร์/เทคโนโลยีทั่วโลกได้รับการออกแบบหรือ สถาปนิก
- และเช่นเดียวกับที่คนงานก่อสร้างในอาคารควรตระหนักถึงวิธีต่างๆ ในการใช้งานการออกแบบอาคาร ไม่ว่าจะจากประสบการณ์ของตนเองหรือจากการทำความเข้าใจจากสถาปนิกของอาคาร
นักพัฒนาซอฟต์แวร์/โปรแกรมเมอร์ควรเข้าใจรูปแบบการออกแบบซอฟต์แวร์พื้นฐานและรหัสการใช้งาน...ไม่ว่าจะด้วยตนเองหรือจากสถาปนิกซอฟต์แวร์ที่แนะนำให้ทีมพัฒนาตามรูปแบบเฉพาะ
รูปแบบรหัสพื้นฐาน
ในบรรทัดเริ่มต้นของบทความนี้ ฉันกล่าวว่าโปรแกรมเมอร์ทุกคนคงเคยใช้รูปแบบการออกแบบ ต่อไปนี้คือตัวอย่างพื้นฐานของโค้ดที่ตามรูปแบบ
- ต่อไปนี้เป็นรูปแบบการออกแบบ ตัวกรองการสกัดกั้น พื้นฐาน
- ซ่อนรหัสคัดลอก
- [รหัส]
สวิตช์ (เงื่อนไข){
กรณีมูลค่า1:
กรณีมูลค่า2:
ค่าเริ่มต้น:
}
[/รหัส] - ทริกเกอร์เหตุการณ์ ตัวจัดการเหตุการณ์ .. อยู่ภายใต้รูปแบบการออกแบบ Subject-Observer พื้นฐาน เราจะหารือเกี่ยวกับมาตรฐานแต่ละรูปแบบ รูปแบบยอดนิยม พร้อมตัวอย่าง..เร็วๆ นี้
- หากคุณเคยใช้คอลเลกชันบางประเภท เช่น Arraylist ใน C# และวนซ้ำผ่านอาร์เรย์ แสดงว่าคุณได้ใช้รูปแบบการออกแบบ Iterator พื้นฐาน
- โค้ดด้านล่างเป็นตัวอย่างของการจัดการข้อยกเว้นพื้นฐาน / รูปแบบ ห่วงโซ่ความรับผิดชอบ
- ซ่อนรหัสคัดลอก
- [รหัส]
พยายาม{
}จับ (เช่นข้อยกเว้น){
}
ในที่สุด{
}
[/รหัส]
รูปแบบการออกแบบพื้นที่ต่างๆ
มีคำศัพท์เฉพาะที่แตกต่างกันในซอฟต์แวร์นอกเหนือจาก Design Patterns.. บางคำมักเกี่ยวข้องกับ Design Patterns ที่เราได้กล่าวถึงไปแล้ว.. และบางคำก็ไม่เกี่ยวข้องกันเลย
สิ่งที่เราได้กล่าวถึงข้างต้นบางครั้งเรียกว่า " Implementation Design Patterns "
มีรูปแบบอื่นๆ เช่น รูปแบบสถาปัตยกรรม รูปแบบกรอบงาน รูปแบบภาษา (ส่วนใหญ่เรียกว่าโครงสร้างภาษา)
พวกมันคือรูปแบบที่วางในระดับต่างๆ... เช่น รูปแบบภาษา เป็นรูปแบบที่นำไปใช้เป็นส่วนหนึ่งของภาษาการเขียนโปรแกรม เช่น C# / Java เนื่องจากคุณลักษณะ/โครงสร้างของภาษา.. เราเคยเห็นมาแล้วบางส่วน
ตัวอย่างข้างต้นทั้งหมดของผู้สังเกตการณ์ ตัวกรองการสกัดกั้น ฯลฯ ถูกดูดซึมเป็นโครงสร้างภาษาในภาษาการเขียนโปรแกรมระดับสูงยอดนิยมทั้งหมดซึ่งมาหลังจาก C
รูปแบบสถาปัตยกรรม คือโมเดลมาตรฐานของสถาปัตยกรรมซอฟต์แวร์ โดยทั่วไปหมายถึงวิธีการต่างๆ ในการวางหรือเชื่อมโยงโมดูล หรือเลเยอร์หรือระดับ ประกอบเป็นแอปพลิเคชันเต็มรูปแบบ
สิ่งนี้ไม่เกี่ยวข้องกับรูปแบบการออกแบบในแง่ของการเขียนโค้ด/การเขียนโปรแกรมที่... แต่พวกเขาแบ่งปันคำตอบเดียวกันกับที่กล่าวถึงในบทความนี้
รูปแบบกรอบงาน ไม่เกี่ยวข้องกับการอภิปรายรูปแบบการออกแบบของเรา เมื่อเฟรมเวิร์กอย่าง .NET ใช้วิธีการพิเศษสำหรับข้อผิดพลาดในการบันทึกหรือติดตามการเรียกใช้โค้ดอย่างง่ายดายผ่านเมธอดหรืออ็อบเจ็กต์ในตัวของเฟรมเวิร์ก กลไกดังกล่าวจะเรียกว่ารูปแบบเฟรมเวิร์ก
ตัวอย่างบางส่วนใน .NET Framework รวมถึงฟีเจอร์ stackTrace คุณลักษณะแอตทริบิวต์คลาสที่มีเครื่องหมายปีกกา [] เครื่องหมายปีกกาที่ด้านบนของคำจำกัดความคลาส/เมธอด ฯลฯ เมื่อใช้คุณสมบัติดังกล่าว เรากำลังเข้ารหัสด้วยรูปแบบที่สร้างขึ้นภายในของ Framework
ฉันหวังว่าบทความนี้จะช่วยให้ภาพรวมของรูปแบบการออกแบบและคำศัพท์ที่เกี่ยวข้อง
จนถึงตอนนี้ เราคุยกันแค่ว่ามาตรฐานคืออะไรและสำคัญแค่ไหน.. แต่เราไม่ได้พูดถึงว่าตัวแบบมาตรฐานคืออะไร
ใบอนุญาต
บทความนี้ พร้อมด้วยซอร์สโค้ดและไฟล์ที่เกี่ยวข้อง ได้รับอนุญาตภายใต้ The Code Project Open License (CPOL)