แบบจำลองการออกแบบสำหรับผู้เริ่มต้น

เผยแพร่แล้ว: 2016-01-13

หากคุณเคยเขียนโปรแกรมสำหรับผลิตภัณฑ์หรือซอฟต์แวร์ประยุกต์ ไม่ว่าเล็กหรือใหญ่ คุณมักจะใช้ Design Patterns เป็นจำนวนมาก... แม้ว่าจะเป็นไปได้ว่ารูปแบบเหล่านี้อาจไม่ใช่รูปแบบการออกแบบ/มาตรฐานที่ใช้กันมากที่สุด

แต่ใช่ มีความแตกต่างที่ชัดเจนระหว่างการนำรูปแบบการออกแบบไปใช้และ "การใช้" รูปแบบการออกแบบ… ไม่ว่าจะด้วยวิธีใด บุคคลที่ทำงานกับรูปแบบการออกแบบจะเข้าใจมัน หรือจะเข้าใจได้ง่าย

ประเด็นคือ รูปแบบการออกแบบไม่ใช่เรื่องใหม่สำหรับโปรแกรมเมอร์

ในบทความด้านล่างนี้ ฉันกำลังพยายามอธิบายรูปแบบการออกแบบในพื้นฐาน และเราจะศึกษารายละเอียดของรูปแบบต่างๆ ตัวอย่าง ฯลฯ ในบทความอื่น

รูปแบบการออกแบบคืออะไร?

เพื่อเริ่มต้น…

ฉันคิดว่าวิธีที่ดีที่สุดในการเริ่มต้นด้วยการทำความเข้าใจรูปแบบการออกแบบ คือการทำความเข้าใจรูปแบบที่ไม่ใช่ทางเทคนิคที่เราติดตามในชีวิตประจำวันของเราอย่างรู้เท่าทัน/โดยไม่รู้ตัว

ตัวอย่างเช่น นำ Resumes จำนวนมากที่ส่งเข้ามาเพื่อรับตำแหน่งงานว่าง เรซูเม่ของแต่ละคนไม่เหมือนกัน... แม้ว่าทุกคนมักจะทำแบบเดียวกัน นั่นคือการบอกผู้อ่านว่าพวกเขามีทักษะอะไร หรือเขา/เธอจะเหมาะสมกับงานนี้ได้อย่างไร

ผู้ที่ส่งเรซูเม่ไปยังงานส่วนใหญ่ทราบดีว่าพวกเขาจำเป็นต้องส่งเรซูเม่พร้อมชุดข้อมูลเฉพาะในเอกสาร Word ที่มีรูปแบบ

นี่… เป็นรูปแบบที่ทุกคนส่งประวัติย่อพร้อมชุดข้อมูลเฉพาะที่แสดงอยู่ในนั้น

ถ้าคุณรู้สึกว่า... เรียกมันว่าเทมเพลตแทนรูปแบบ เทมเพลตการออกแบบ

ในชีวิตจริงมีหลายอย่างที่เป็นแบบแผน บางคนชอบตัวอย่างด้านล่าง:

เชฟทุกคนทั่วโลกปรุงพิซซ่าหรือเฟรนช์ฟรายส์ด้วยวิธีเดียวกัน แม้ว่าพวกเขาจะเติมมัน / แต่งรสให้แตกต่างออกไป นั่นคือรูปแบบ

การออกแบบของรถทุกคันเป็นไปตามรูปแบบการออกแบบพื้นฐาน ทั้งสี่ล้อ พวงมาลัย ระบบขับเคลื่อนหลัก เช่น คันเร่ง-เบรก-คลัตช์ เป็นต้น

ทุกสิ่งที่สร้างขึ้น/ผลิตซ้ำๆ จะต้องเป็นไปตามรูปแบบในการออกแบบของมันอย่างหลีกเลี่ยงไม่ได้… ไม่ว่าจะเป็นรถยนต์ พิซซ่า เครื่องเอทีเอ็ม อะไรก็ตาม… แม้แต่แปรงสีฟัน

การออกแบบที่เกือบจะกลายเป็นวิธีมาตรฐานในการเขียนโค้ดลอจิก/กลไก/เทคนิคบางอย่างในซอฟต์แวร์ ดังนั้นจึงเป็นที่รู้จักกันในชื่อ – และด้วยเหตุนี้ – การศึกษาในรูปแบบการออกแบบซอฟต์แวร์

เหตุใดรูปแบบการออกแบบจึงมีความสำคัญ

โดยทั่วไปด้วยเหตุผลสองประการ:

  1. ให้ยึดมั่นในมาตรฐาน
  2. เพื่อเร่งพัฒนา

ฉันจะอธิบายโดยละเอียด

ประการแรก เราเข้าใจแล้วว่าเหตุใดการยึดติดกับรูปแบบมาตรฐานจึงน่าสนใจ

มาดูรายการตัวอย่าง Resumes ที่เราได้พูดคุยกันก่อนหน้านี้

อาจมีผู้สมัครหนึ่งหรือสองคนที่ส่งใบสมัครงานทางข้อความอีเมลโดยไม่มีรูปแบบที่เหมาะสม ไม่มีการแนบไปกับอีเมล ฯลฯ .. ผู้สมัครหนึ่งหรือสองคนนี้ไม่ทำตามแบบ.. และไม่น่าจะจบลง กับงาน…. ทำไม? เพราะพวกเขากำลังเบี่ยงเบนไปจากรูปแบบที่เป็นที่ยอมรับซึ่งอาจไม่เป็นที่พอใจของผู้สมัครงานสั้น ๆ

มีใครบ้างที่เบี่ยงเบนจากรูปแบบและกลายเป็น "เท่ห์" หรือไม่? นั่นไม่ใช่นวัตกรรมเหรอ?

ใช่ มีบางครั้งที่เรซูเม่ที่นำเสนอแตกต่างไปจากเดิมอย่างสิ้นเชิงทำให้งานแตกต่างจากที่อื่น โดยปกติ ฉันเคยได้ยินเกี่ยวกับนักออกแบบเว็บไซต์ที่เริ่มงานสำคัญเพราะพวกเขารวบรวมและนำเสนอภาพยนตร์ซีดีของงานของพวกเขา หรือสร้างตัวละครแอนิเมชั่นที่อธิบายงานของพวกเขา ได้โพสต์ไว้ในบล็อกของพวกเขา และสิ่งต่างๆ เช่นนั้น

แต่..นี่คือการทดลอง ( นวัตกรรมมาจากการทดลองที่ประสบความสำเร็จ )

ส่วนใหญ่ในการพัฒนาซอฟต์แวร์ คุณไม่สามารถทดลองได้ เนื่องจากความกดดันของไทม์ไลน์ ความคาดหวัง ฯลฯ แต่ใช่ บางครั้ง โครงการที่น่าสนใจบางโครงการก็อนุญาตให้ทำการทดลองได้

ในซอฟต์แวร์ เราไม่สามารถทำสิ่งพื้นฐานเช่นการฝากเงินผ่านธนาคารได้… ใน 101 วิธี… จะมีเพียงไม่กี่วิธีในการประมวลผลการฝากเงินผ่านธนาคาร.. ดังนั้นจึงควรปฏิบัติตามรูปแบบที่กำหนดไว้และทดสอบแล้ว

นอกจากนี้ รูปแบบการออกแบบส่วนใหญ่ยังมีรูปแบบต่างๆ อีกด้วย... รูปแบบบางส่วนได้รับความนิยมอย่างมากจนรูปแบบต่างๆ จะเป็นรูปแบบมาตรฐานใหม่ของรูปแบบด้วย

คาดว่าโครงการซอฟต์แวร์ในปัจจุบัน (อย่างน้อยโดยปริยาย) จะเป็นไปตามการออกแบบผลิตภัณฑ์/ซอฟต์แวร์ที่คล้ายคลึงกันในตลาดที่กำหนดไว้แล้ว

นี่คือจุดที่การยึดมั่นในสไตล์การเข้ารหัสหรือรูปแบบการออกแบบมาตรฐานช่วยให้การพัฒนาซอฟต์แวร์… เร่งการพัฒนา ขจัดค่าใช้จ่ายในการกังวลเกี่ยวกับการใช้งานใหม่ที่ยังไม่ได้ทดสอบ ฯลฯ

เร่งเวลาในการพัฒนา

การปฏิบัติตามรูปแบบการออกแบบมาตรฐานยังมีข้อได้เปรียบในการสื่อสารอย่างง่ายดายผ่านแผนผัง / ลำดับชั้นของสถาปนิกซอฟต์แวร์, หัวหน้าโมดูล, หัวหน้าทีม, นักพัฒนา ฯลฯ เกี่ยวกับ "วิธี" บางอย่างที่ต้องพัฒนา ไม่ใช่แค่ "อะไร" จะต้องเป็น ที่พัฒนา.

บางครั้งก็ช่วยทีมทดสอบได้ด้วยซ้ำ เพราะผู้ทดสอบจะทราบจากประสบการณ์ว่าโค้ดที่ตามรูปแบบการออกแบบเฉพาะนั้นอาจทดสอบด้วยวิธีเฉพาะด้วยชุดเครื่องมือทดสอบในช่วงเวลาหนึ่ง และการออกแบบที่รู้จักดังกล่าวอาจไม่มีข้อบกพร่อง หรือมีข้อบกพร่อง 'ที่ทราบ' บางอย่าง

ไม่ใช้ Design Patterns เพื่อสร้างความรู้สึกส่วนตัวใช่หรือไม่

ไม่ ประการแรกเพราะเราไม่ได้บอกว่าคุณทำตามรูปแบบการออกแบบและไม่มีอะไรเกิดขึ้นอีก การดำเนินโครงการส่วนใหญ่ใช้ข้อกำหนดพื้นฐานร่วมกับโครงการอื่นๆ เท่านั้น และมีแนวโน้มว่าจะมีความคลาดเคลื่อน การสร้างความเบี่ยงเบนเหล่านี้จะต้องมีการงอและยืดรูปแบบมาตรฐานที่ใช้ในการนำไปใช้

มันเหมือนกับการทำพิซซ่าด้วยวิธีมาตรฐาน แล้วปรุงแต่ง/นำเสนอตามความต้องการที่แตกต่างกัน ไม่ว่าจะเป็นพิซซ่าแบบพายเต็ม พายแบบคัทพาย หรืออะไรก็ตาม

ในการทำความเข้าใจถึงความสำคัญของรูปแบบการออกแบบ สิ่งหนึ่งที่ **สำคัญมาก :

Design Patterns ไม่ใช่เทคโนโลยีหรือเฟรมเวิร์กใดๆ ที่บริษัทหรือภาษาโปรแกรมใดบังคับใช้กับเรา นั่นหมายความว่า มันเหมือนกับแนวคิดที่เปิดกว้าง.. คุณมีอิสระที่จะนำไปใช้ ใช้งาน ปรับเปลี่ยนตามความต้องการของคุณ และที่สำคัญ... รู้สึกว่ามันเป็นของคุณเอง

รูปแบบการออกแบบมาตรฐานหรือที่นิยมทั้งหมด จริง ๆ แล้วขยายได้ค่อนข้างมาก. พวกเขากลายเป็นที่นิยมในตอนแรกเพียงเพราะหลายคนใช้.. และหลายคนใช้เพียงเพราะยืดหยุ่นตามความต้องการ

หรือคุณคิดว่ารูปแบบการออกแบบมาตรฐานจะเข้ากับโครงการในรัฐนิวเจอร์ซีย์สำหรับบริษัทแห่งหนึ่งและในบังกาลอร์สำหรับบริษัทอื่นและโครงการประเภทอื่นได้อย่างไร

นั่นนำเราไปสู่ ​​" รูปแบบการออกแบบส่วนใหญ่เป็นแบบทั่วไป " ... หมายความว่าพวกเขาไม่ได้ใช้สำหรับการสร้างซอฟต์แวร์ประเภทเดียวกันเสมอไป คุณอาจไม่ได้ยินสิ่งต่างๆ เช่น “รูปแบบการออกแบบซอฟต์แวร์การธนาคาร” หรือ “รูปแบบการออกแบบซอฟต์แวร์เครือข่ายสังคม” ที่ใช้ในการสนทนาทั่วไป… แต่มีเพียง “รูปแบบการออกแบบ” เท่านั้น

ใครควรกังวลเกี่ยวกับรูปแบบการออกแบบ?

  1. เช่นเดียวกับการที่สถาปนิกอาคารที่ดีพัฒนาทักษะในการออกแบบอาคาร โดยการศึกษาสถาปัตยกรรมและการออกแบบอาคารและรูปทรงจำนวนมากตลอดชีวิตของเขา/เธอ สถาปนิกซอฟต์แวร์ควรศึกษาและจินตนาการว่าระบบซอฟต์แวร์/เทคโนโลยีทั่วโลกได้รับการออกแบบหรือ สถาปนิก
  2. และเช่นเดียวกับที่คนงานก่อสร้างในอาคารควรตระหนักถึงวิธีต่างๆ ในการใช้งานการออกแบบอาคาร ไม่ว่าจะจากประสบการณ์ของตนเองหรือจากการทำความเข้าใจจากสถาปนิกของอาคาร

นักพัฒนาซอฟต์แวร์/โปรแกรมเมอร์ควรเข้าใจรูปแบบการออกแบบซอฟต์แวร์พื้นฐานและรหัสการใช้งาน...ไม่ว่าจะด้วยตนเองหรือจากสถาปนิกซอฟต์แวร์ที่แนะนำให้ทีมพัฒนาตามรูปแบบเฉพาะ

รูปแบบรหัสพื้นฐาน

ในบรรทัดเริ่มต้นของบทความนี้ ฉันกล่าวว่าโปรแกรมเมอร์ทุกคนคงเคยใช้รูปแบบการออกแบบ ต่อไปนี้คือตัวอย่างพื้นฐานของโค้ดที่ตามรูปแบบ

  1. ต่อไปนี้เป็นรูปแบบการออกแบบ ตัวกรองการสกัดกั้น พื้นฐาน
  2. ซ่อนรหัสคัดลอก
  3. [รหัส]
    สวิตช์ (เงื่อนไข){
    กรณีมูลค่า1:
    กรณีมูลค่า2:
    ค่าเริ่มต้น:
    }
    [/รหัส]
  4. ทริกเกอร์เหตุการณ์ ตัวจัดการเหตุการณ์ .. อยู่ภายใต้รูปแบบการออกแบบ Subject-Observer พื้นฐาน เราจะหารือเกี่ยวกับมาตรฐานแต่ละรูปแบบ รูปแบบยอดนิยม พร้อมตัวอย่าง..เร็วๆ นี้
  5. หากคุณเคยใช้คอลเลกชันบางประเภท เช่น Arraylist ใน C# และวนซ้ำผ่านอาร์เรย์ แสดงว่าคุณได้ใช้รูปแบบการออกแบบ Iterator พื้นฐาน
  6. โค้ดด้านล่างเป็นตัวอย่างของการจัดการข้อยกเว้นพื้นฐาน / รูปแบบ ห่วงโซ่ความรับผิดชอบ
  7. ซ่อนรหัสคัดลอก
  8. [รหัส]
    พยายาม{
    }จับ (เช่นข้อยกเว้น){
    }
    ในที่สุด{
    }
    [/รหัส]

รูปแบบการออกแบบพื้นที่ต่างๆ

มีคำศัพท์เฉพาะที่แตกต่างกันในซอฟต์แวร์นอกเหนือจาก Design Patterns.. บางคำมักเกี่ยวข้องกับ Design Patterns ที่เราได้กล่าวถึงไปแล้ว.. และบางคำก็ไม่เกี่ยวข้องกันเลย

สิ่งที่เราได้กล่าวถึงข้างต้นบางครั้งเรียกว่า " Implementation Design Patterns "

มีรูปแบบอื่นๆ เช่น รูปแบบสถาปัตยกรรม รูปแบบกรอบงาน รูปแบบภาษา (ส่วนใหญ่เรียกว่าโครงสร้างภาษา)

พวกมันคือรูปแบบที่วางในระดับต่างๆ... เช่น รูปแบบภาษา เป็นรูปแบบที่นำไปใช้เป็นส่วนหนึ่งของภาษาการเขียนโปรแกรม เช่น C# / Java เนื่องจากคุณลักษณะ/โครงสร้างของภาษา.. เราเคยเห็นมาแล้วบางส่วน

ตัวอย่างข้างต้นทั้งหมดของผู้สังเกตการณ์ ตัวกรองการสกัดกั้น ฯลฯ ถูกดูดซึมเป็นโครงสร้างภาษาในภาษาการเขียนโปรแกรมระดับสูงยอดนิยมทั้งหมดซึ่งมาหลังจาก C

รูปแบบสถาปัตยกรรม คือโมเดลมาตรฐานของสถาปัตยกรรมซอฟต์แวร์ โดยทั่วไปหมายถึงวิธีการต่างๆ ในการวางหรือเชื่อมโยงโมดูล หรือเลเยอร์หรือระดับ ประกอบเป็นแอปพลิเคชันเต็มรูปแบบ

สิ่งนี้ไม่เกี่ยวข้องกับรูปแบบการออกแบบในแง่ของการเขียนโค้ด/การเขียนโปรแกรมที่... แต่พวกเขาแบ่งปันคำตอบเดียวกันกับที่กล่าวถึงในบทความนี้

รูปแบบกรอบงาน ไม่เกี่ยวข้องกับการอภิปรายรูปแบบการออกแบบของเรา เมื่อเฟรมเวิร์กอย่าง .NET ใช้วิธีการพิเศษสำหรับข้อผิดพลาดในการบันทึกหรือติดตามการเรียกใช้โค้ดอย่างง่ายดายผ่านเมธอดหรืออ็อบเจ็กต์ในตัวของเฟรมเวิร์ก กลไกดังกล่าวจะเรียกว่ารูปแบบเฟรมเวิร์ก

ตัวอย่างบางส่วนใน .NET Framework รวมถึงฟีเจอร์ stackTrace คุณลักษณะแอตทริบิวต์คลาสที่มีเครื่องหมายปีกกา [] เครื่องหมายปีกกาที่ด้านบนของคำจำกัดความคลาส/เมธอด ฯลฯ เมื่อใช้คุณสมบัติดังกล่าว เรากำลังเข้ารหัสด้วยรูปแบบที่สร้างขึ้นภายในของ Framework

ฉันหวังว่าบทความนี้จะช่วยให้ภาพรวมของรูปแบบการออกแบบและคำศัพท์ที่เกี่ยวข้อง

จนถึงตอนนี้ เราคุยกันแค่ว่ามาตรฐานคืออะไรและสำคัญแค่ไหน.. แต่เราไม่ได้พูดถึงว่าตัวแบบมาตรฐานคืออะไร

ใบอนุญาต

บทความนี้ พร้อมด้วยซอร์สโค้ดและไฟล์ที่เกี่ยวข้อง ได้รับอนุญาตภายใต้ The Code Project Open License (CPOL)