1.1 รู้เบื้องต้นเกี่ยวกับรูปแบบ
ดังที่ได้กล่าวไว้ก่อนหน้านี้ โปรแกรมเมอร์เริ่มทำงานกับโปรแกรมโดยการออกแบบแบบจำลอง: รวบรวมรายชื่อเอนทิตีที่โปรแกรมจะดำเนินการ และยิ่งมีเอนทิตีในโปรแกรมมากเท่าไหร่ โปรแกรมก็ยิ่งซับซ้อนมากขึ้นเท่านั้น
ดังนั้นเพื่อลดความซับซ้อนของโปรแกรม พวกเขาจึงพยายามสร้างมาตรฐานการโต้ตอบของวัตถุ และนี่คือจุดที่ รูปแบบการออกแบบหรือรูปแบบ การออกแบบ ช่วยโปรแกรมเมอร์ได้มาก จากรูปแบบ การออกแบบ ภาษา อังกฤษ
สำคัญ! ในภาษารัสเซีย คำว่า design มักหมายถึงการออกแบบกราฟิก ซึ่งไม่ใช่ในภาษาอังกฤษ การออกแบบคำในภาษาอังกฤษมีความหมายใกล้เคียงกับคำว่า "การออกแบบ" และ / หรือ "อุปกรณ์" ตัวอย่างเช่น การออกแบบเครื่องยนต์ไม่ใช่รูปร่างหน้าตา แต่เป็นโครงสร้างภายใน
ดังนั้น รูปแบบการออกแบบจึงเป็นรูปแบบ/รูปแบบการออกแบบ ฉันขอแนะนำให้คุณหยุดใช้คำว่าการออกแบบในแง่ของ "รูปลักษณ์" โดยสิ้นเชิง คุณคือวิศวกรซอฟต์แวร์ในอนาคต และสำหรับคุณ การออกแบบก็คือการออกแบบอย่างแท้จริง
รูปแบบการออกแบบนี้คืออะไร? ประการแรก รูปแบบการออกแบบเป็นวิธีแก้ปัญหามาตรฐาน โซลูชันที่ดี มีประสิทธิภาพและผ่านการทดสอบตามเวลา
สมมติว่าคุณถูกขอให้ออกแบบจักรยาน คุณสามารถทำให้เป็นสองล้อ สามหรือห้าล้อก็ได้ อย่างไรก็ตาม ในช่วงเริ่มต้นของการออกแบบ มันคือ แต่วิธีการทดสอบตามเวลาคือสองล้อ แต่วิธีการที่ชัดเจนในปัจจุบันต้องผ่านความเจ็บปวดและความผิดพลาด:

โดยทั่วไปแล้ว เทมเพลตไม่ใช่โซลูชันที่สมบูรณ์ที่สามารถแปลงเป็นโค้ดได้โดยตรง แต่เป็นเพียงตัวอย่างโซลูชันที่ดีสำหรับปัญหาที่สามารถใช้ได้ในสถานการณ์ต่างๆ
รูปแบบเชิงวัตถุแสดงความสัมพันธ์และการโต้ตอบระหว่างคลาสหรือวัตถุโดยไม่ระบุว่าจะใช้คลาสสุดท้ายหรือวัตถุแอปพลิเคชันใด
1.2 ประวัติการออกแบบลวดลาย
ย้อนกลับไปในทศวรรษที่ 70 โปรแกรมเมอร์ต้องเผชิญกับความจำเป็นในการพัฒนาโปรแกรมขนาดใหญ่ที่ต้องทำงานโดยทีมพัฒนาทั้งหมด มีการลองใช้วิธีการต่างๆ ในการจัดงาน แต่อุตสาหกรรมการก่อสร้างมีอิทธิพลต่อการพัฒนามากที่สุด
เพื่อจัดระเบียบการทำงานของคนกลุ่มใหญ่ แนวทางปฏิบัติและแนวทางจากอุตสาหกรรมการก่อสร้างถูกนำมาใช้ โดยวิธีการจากที่นั่นคำศัพท์เช่นการประกอบ (สร้าง) นักพัฒนาซอฟต์แวร์ (ผู้สร้าง) และแนวคิดของสถาปัตยกรรมเข้ามาในการเขียนโปรแกรม
และอย่างที่คุณคาดเดา แนวคิดรูปแบบการออกแบบก็นำมาจากอุตสาหกรรมการก่อสร้างเช่นกัน คริสโตเฟอร์ อเล็กซานเดอร์ อธิบายแนวคิดของรูปแบบเป็นครั้งแรกใน The Pattern Language เมือง อาคาร. การก่อสร้าง". ในหนังสือเล่มนี้ มีการใช้ภาษารูปแบบพิเศษเพื่ออธิบายกระบวนการออกแบบเมือง
รูปแบบในการก่อสร้างอธิบายถึงการตัดสินใจที่ผ่านการทดสอบตามเวลาโดยทั่วไป: หน้าต่างควรสูงเท่าใด ควรมีกี่ชั้นในอาคาร ควรจัดสรรพื้นที่เท่าใดในไมโครดิสทริกต์สำหรับต้นไม้และสนามหญ้า
ดังนั้นจึงไม่น่าแปลกใจที่ในปี 1994 หนังสือ "เทคนิคการออกแบบเชิงวัตถุ Design Patterns” ซึ่งมี 23 รูปแบบที่ช่วยแก้ปัญหาต่างๆ ของการออกแบบเชิงวัตถุ
หนังสือเล่มนี้เขียนโดยผู้เขียน 4 คน ได้แก่ Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides ชื่อหนังสือยาวเกินกว่าใครจะจำได้ ดังนั้นในไม่ช้าทุกคนก็เริ่มเรียกมันว่า "หนังสือโดยแก๊งสี่คน" นั่นคือ"หนังสือจากแก๊งสี่คน"แล้วก็แม้แต่ "หนังสือ GoF"
และตั้งแต่นั้นมาก็มีการค้นพบรูปแบบการออกแบบอื่นๆ แนวทาง "รูปแบบ" ได้รับความนิยมในทุกด้านของการเขียนโปรแกรม ดังนั้นตอนนี้คุณสามารถค้นหารูปแบบได้ทุกประเภทนอกเหนือจากการออกแบบวัตถุ
สำคัญ! รูปแบบไม่ใช่วิธีแก้ปัญหาแบบพิเศษ แต่ในทางกลับกัน วิธีแก้ปัญหาทั่วไปที่พบได้บ่อยสำหรับปัญหาเดียวกัน โซลูชันที่ได้รับการพิสูจน์แล้วอย่างดี
1.3 รายการรูปแบบ
โปรแกรมเมอร์หลายคนไม่ได้เรียนรู้รูปแบบใดรูปแบบหนึ่งมาทั้งชีวิต ซึ่งไม่ได้ป้องกันพวกเขาจากการใช้งาน ดังที่เราได้กล่าวไว้ก่อนหน้านี้รูปแบบเป็นวิธีแก้ปัญหาที่ดีในการทดสอบตามเวลาและหากโปรแกรมเมอร์ไม่ใช่คนโง่เขาก็พบวิธีแก้ปัญหาดังกล่าวด้วยประสบการณ์
แต่ทำไมต้องผ่านการลองผิดลองถูกนับสิบครั้ง จึงพบทางออกที่ดีที่สุด ในเมื่อยังมีคนที่ไปแนวทางนี้แล้วและได้เขียนหนังสือด้วยแก่นแท้ของประสบการณ์และภูมิปัญญาชีวิตของพวกเขา
คุณสามารถตอกตะปูด้วยประแจได้ แต่ทำไมล่ะ? คุณสามารถใช้สว่านได้หากคุณพยายามอย่างหนัก แต่การมีเครื่องดนตรีไว้ในครอบครองอย่างมีสติคือสิ่งที่ทำให้มืออาชีพแตกต่างจากมือสมัครเล่น และมืออาชีพรู้ดีว่าคุณสมบัติหลักของสว่านไม่ได้อยู่ในสิ่งนี้ แล้วทำไมคุณต้องรู้รูปแบบ?
- โซลูชั่นที่ได้รับการพิสูจน์แล้ว คุณใช้เวลาน้อยลงโดยใช้โซลูชันที่หาซื้อได้ทั่วไป แทนที่จะต้องประดิษฐ์ล้อขึ้นมาใหม่ การตัดสินใจบางอย่างคุณอาจคิดได้เอง แต่หลายๆ อย่างอาจเป็นการค้นพบสำหรับคุณ
- การกำหนดมาตรฐานรหัส คุณคำนวณผิดพลาดน้อยลงเมื่อออกแบบโดยใช้โซลูชันแบบรวมศูนย์ทั่วไป เนื่องจากพบปัญหาที่ซ่อนอยู่ในปัญหาเหล่านั้นมานานแล้ว
- พจนานุกรมโปรแกรมทั่วไป คุณพูดชื่อรูปแบบแทนที่จะใช้เวลาหนึ่งชั่วโมงอธิบายให้โปรแกรมเมอร์คนอื่นๆ ทราบว่าคุณคิดการออกแบบเจ๋งๆ ออกมาได้อย่างไร และคลาสใดที่จำเป็นสำหรับสิ่งนี้
มีรูปแบบอะไรบ้าง?
รูปแบบจะแตกต่างกันในระดับความซับซ้อน รายละเอียด และความครอบคลุมของระบบที่ออกแบบ เมื่อเปรียบเทียบกับการก่อสร้าง คุณสามารถเพิ่มความปลอดภัยให้กับทางแยกได้โดยการติดตั้งสัญญาณไฟจราจร หรือคุณสามารถแทนที่ทางแยกด้วยทางแยกรถทั้งหมดด้วยทางลอด
รูปแบบระดับต่ำและเรียบง่ายที่สุดคือสำนวน ไม่เป็นสากลเนื่องจากใช้งานได้เฉพาะในกรอบของภาษาโปรแกรมเดียว
ความหลากหลายที่สุดคือรูปแบบสถาปัตยกรรมที่สามารถนำไปใช้ในเกือบทุกภาษา พวกเขาจำเป็นในการออกแบบโปรแกรมทั้งหมด ไม่ใช่องค์ประกอบเดี่ยวๆ
แต่สิ่งสำคัญคือรูปแบบแตกต่างกันในวัตถุประสงค์ รูปแบบที่เราจะทำความคุ้นเคยสามารถแบ่งออกเป็นสามกลุ่มหลัก:
- รูปแบบการสร้างจะดูแลการสร้างออบเจกต์ที่ยืดหยุ่นโดยไม่ต้องเพิ่มการพึ่งพาที่ไม่จำเป็นเข้ามาในโปรแกรม
- รูปแบบโครงสร้างแสดงวิธีต่างๆ ในการสร้างความสัมพันธ์ระหว่างวัตถุ
- รูปแบบพฤติกรรมช่วยดูแลการสื่อสารที่มีประสิทธิภาพระหว่างวัตถุต่างๆ
1.4 รู้เบื้องต้นเกี่ยวกับ UML
เริ่มต้นด้วยการดูรูปแบบ 23 แบบเดียวกับที่อธิบายไว้ในหนังสือ Gang of Four ทั้งรูปแบบและชื่อเป็นสิ่งที่คุ้นเคยแม้กระทั่งสำหรับโปรแกรมเมอร์มือใหม่ ฉันจะแนะนำคุณให้รู้จัก แต่ฉันขอแนะนำให้อ่านหนังสือเกี่ยวกับรูปแบบ
รูปแบบการออกแบบไม่ได้เชื่อมโยงกับภาษาการเขียนโปรแกรมเฉพาะ ดังนั้น UML มักจะใช้เพื่ออธิบาย เป็นที่นิยมมากเมื่อ 20 ปีที่แล้ว แต่บางครั้งก็ใช้ อย่างไรก็ตาม คำอธิบายของรูปแบบเป็นเพียงสถานที่ที่ใช้ UML เป็นมาตรฐาน
ด้วย UML คุณสามารถอธิบายความสัมพันธ์ระหว่างเอนทิตีต่างๆ ในกรณีของเรา สิ่งเหล่านี้คือวัตถุและคลาส
ความสัมพันธ์ระหว่างคลาสอธิบายด้วยลูกศรสี่ประเภท:
![]() |
องค์ประกอบ (องค์ประกอบ) - ชนิดย่อยของการรวมซึ่ง "ส่วน" ไม่สามารถแยกจาก "ทั้งหมด" |
![]() |
การรวม - อธิบายความสัมพันธ์ "ส่วน" - "ทั้งหมด" ซึ่ง "ส่วน" สามารถอยู่แยกต่างหากจาก "ทั้งหมด" รูปสี่เหลี่ยมขนมเปียกปูนจะแสดงจากด้าน "ทั้งหมด" |
![]() |
การพึ่งพา - การเปลี่ยนแปลงในเอนทิตีหนึ่ง (อิสระ) อาจส่งผลต่อสถานะหรือพฤติกรรมของเอนทิตีอื่น (ขึ้นอยู่กับ) เอนทิตีอิสระจะแสดงอยู่ที่ด้านข้างของลูกศร |
![]() |
ลักษณะทั่วไป - ความสัมพันธ์ของการสืบทอดหรือการใช้งานอินเทอร์เฟซ ที่ด้านข้างของลูกศรคือซูเปอร์คลาสหรืออินเทอร์เฟซ |
ในความเป็นจริงทุกอย่างง่ายมากที่นี่ ลูกศรสุดท้ายหมายความว่าคลาสหนึ่งสืบทอดมาจากคลาสอื่น และลูกศรที่หนึ่งและสองคือวัตถุหนึ่งเก็บลิงก์ไปยังวัตถุที่สอง และมันคือทั้งหมด
หากเพชรลิงค์เป็นสีดำแสดงว่าลิงค์นั้นอ่อนแอ: วัตถุสามารถอยู่ได้โดยไม่มีกันและกัน หากเพชรเป็นสีขาว แสดงว่าวัตถุนั้นมีความ สัมพันธ์กันอย่างมาก เช่น คลาสHttpRequest
และคลาสรองHttpRequest.Builder
1.5 รายการรูปแบบ
ประเภทของรูปแบบจะแสดงด้วยสีและตัวอักษรต่างๆ:
ข- พฤติกรรม (พฤติกรรม);
ค- การสร้าง (สร้างสรรค์);
ส- โครงสร้าง (โครงสร้าง)
และสุดท้ายคือรายการรูปแบบการออกแบบ 23 รูปแบบ:
ค- โรงงานนามธรรม ส- อแดปเตอร์ ส- สะพาน ค- ช่างก่อสร้าง ข- ห่วงโซ่ความรับผิดชอบ ข- ทีม ส- ตัวเชื่อมโยง ส- มัณฑนากร |
ส– ซุ้ม ค- วิธีการโรงงาน ส- นักฉวยโอกาส ข- ล่าม ข- ตัวทำซ้ำ ข- ตัวกลาง ข- ผู้รักษาประตู ค- ต้นแบบ |
ส- หนังสือมอบฉันทะ ข— ผู้สังเกตการณ์ ค— โดดเดี่ยว ข- สถานะ ข- กลยุทธ์ ข— วิธีแม่แบบ ข- ผู้เยี่ยมชม |
GO TO FULL VERSION