รูปแบบการออกแบบมีความสำคัญในการเขียนโปรแกรมอย่างไร


19

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

จุดประสงค์ของพวกเขาคืออะไรและพวกเขาสำคัญต่อการเรียนรู้หรือไม่


7
พวกเขารู้ดีสำหรับการสัมภาษณ์งาน!
Wim

5
รูปแบบการออกแบบเป็นเพียงชื่อที่ใช้กันทั่วไปในการแก้ปัญหา มักจะเกิดจากความบกพร่องในภาษา
Jon Purdy

7
การทำความเข้าใจกับวัตถุประสงค์ของรูปแบบการออกแบบนั้นจำเป็นต้องเข้าใจถึงปัญหาที่พวกเขาแก้ไข ทำความเข้าใจเกี่ยวกับปัญหาเหล่านี้ต้องมีประสบการณ์การทำวิธีที่ยาก :)
MattDavey

คำตอบ:


36

รูปแบบการออกแบบนั้นยอดเยี่ยมสำหรับการสื่อสารความตั้งใจของคุณอย่างรวดเร็ว - ทุกคนรู้ว่าโรงงานคืออะไร

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


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

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

1
ทุกรหัสมีรูปแบบบางอย่างแม้ว่าคุณจะไม่ทราบ รูปแบบการออกแบบที่คุณกำลังพูดถึงเพียงจัดกลุ่มใหม่และตั้งชื่อชุดรูปแบบที่ใช้กันอย่างแพร่หลายและมีประโยชน์ เมื่อคุณรู้จักพวกเขาคุณสามารถคิดเกี่ยวกับพวกเขาอย่างมีสติ ถ้าคุณเรียกหนึ่งในคลาสของคุณ "ControlDispenser" คงไม่มีใครรู้ว่ามันควรจะทำอะไร อย่างไรก็ตามถ้าคุณรู้รูปแบบของโรงงานคุณจะเรียกมันว่า "ControlFactory" และคนอื่น ๆ จะเข้าใจทันที
Olivier Jacot-Descombes

4
ถ้ามันใช้เพื่อจุดประสงค์อื่นมันควรจะเป็นอีกชั้นหนึ่ง ... แยกความกังวล
เนท

2
@ เนท: จุดประสงค์เดียวอาจมีหลายรูปแบบ ไม่มีเหตุผลที่คลาสหนึ่งควรเกี่ยวข้องกับรูปแบบเดียวเท่านั้น รูปแบบไม่ใช่ความรับผิดชอบ "อะตอม" ความรับผิดชอบเดียวอาจต้องใช้หลายรูปแบบ
DeadMG

26

จากบทความวิกิพีเดียเกี่ยวกับรูปแบบการออกแบบ :

ประโยชน์ของการพูดรูปแบบคือการมีคำศัพท์ทั่วไปสำหรับการพูดคุยเกี่ยวกับสถานการณ์ที่ผู้ออกแบบได้เห็นอยู่แล้ว

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


3
การเปรียบเทียบการพัฒนาซอฟต์แวร์กับวิศวกรรมไฟฟ้านั้นแม่นยำพอ ๆ กับการเปรียบเทียบจรวดแซทเทิร์นกับจักรยาน วิธีการขนส่งทั้งสอง (รับจากจุด A ไปยังจุด B) แต่ไปต่างกันโดยสิ้นเชิงและไม่เข้ากันได้
jer

3
@ jer Hmmm การเปรียบเทียบของคุณไม่ดี ทั้งสองเป็นสาขาวิชาวิศวกรรม แม้ว่าความคล้ายคลึงกันของพวกเขาจะสิ้นสุดลงที่นั่นพวกเขายังคงมีความหมายที่เหมือนกัน เราไม่ได้หวังที่จะเทียบมัน แต่มีหลายอย่างที่ต้องเรียนรู้จากที่อื่น
Mike Nakis

6
@ ไมค์: มีคือความแตกต่างพื้นฐาน: วงจรไฟฟ้าจะถูก จำกัด ด้วยข้อ จำกัด ทางกายภาพอย่างหนัก ระบบซอฟต์แวร์ถูก จำกัด ด้วยข้อ จำกัด ที่คลุมเครือของสติปัญญาของมนุษย์
วินไคลน์

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

3
เนื่องจากซอฟแวร์นั้นเกี่ยวกับการออกแบบการเปรียบเทียบทางวิศวกรรมไฟฟ้าแบบเดียวกันจึงเป็นการอภิปรายเรื่อง "current mirror" และ "feedback feedback" ในวงจรขยาย สิ่งเหล่านี้ไม่ใช่องค์ประกอบที่ไม่ต่อเนื่องบนแผนผัง แต่เป็นการจัดเรียงของส่วนประกอบหลายอย่างที่ตอบสนองวัตถุประสงค์ที่แน่นอน การรู้วิธีเชื่อมต่อส่วนประกอบโดยไม่ทราบจุดประสงค์จะไม่อนุญาตให้บุคคลใหม่ทำการออกแบบใหม่ (คือมันเป็นก้าวไปข้างหน้าในการทำความเข้าใจ.)
rwong

9

มีสองเหตุผลที่แตกต่างกันมากสำหรับการดำรงอยู่ของรูปแบบ

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

ประโยชน์ที่สองของรูปแบบคือพวกเขาอยู่นอกรูปแบบการแก้ปัญหาสำหรับแบบฟอร์มปัญหาทั่วไป หากคุณรู้จักรูปแบบของคุณและตัวอย่างเช่นคุณพบปัญหาที่คุณต้องหาวิธีที่ดีในการรับข้อมูลจากวัตถุผู้ผลิต (อาจมีหลายรายการ) ไปยังวัตถุผู้บริโภคจำนวนมากโดยไม่ต้องแนะนำการเชื่อมต่อระหว่างชั้นเรียนที่ไม่จำเป็น เป็นงานสำหรับผู้สังเกตการณ์! " และคุณจะรู้วิธีแก้ปัญหาของคุณทันที

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

ตัดกับโลกที่รูปแบบ "ไม่มี" คุณพบปัญหาเหล่านี้ซึ่งโดยทั่วไปแล้วไม่ใช่ปัญหาการออกแบบเล็กน้อยและคุณใช้เวลาพอสมควรในการหาคำตอบที่ดี (ซึ่งบังเอิญจะมีลักษณะคล้ายกับรูปแบบที่เหมาะสม) จากนั้นเพื่อนร่วมงานของคุณก็ขึ้นมาและอยากรู้ว่าคุณจะแก้ปัญหาอย่างไรและคุณใช้เวลาหนึ่งชั่วโมงเพื่ออภิปรายถึงวิธีการและสาเหตุ

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


2
มันเป็นความเข้าใจผิดที่รูปแบบการออกแบบเป็นทางออกของชั้นวาง พวกเขาคือ "รูปแบบ" ซึ่งไม่ได้แปลเป็นรหัสเสมอไป
Martin York

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

5

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

เราทุกคนต่างเห็นพ้องกัน (!) ว่าในทางทฤษฎีการนำโค้ดกลับมาใช้ใหม่นั้นเป็นสิ่งที่ดี - แต่มันกลับกลายเป็นว่าหนักกว่าที่เราต้องการทำเช่นนั้นในทางปฏิบัติ (ในบางประเด็นที่มีการเปลี่ยนแปลง ) แต่ในความเป็นจริงสิ่งที่เราต้องการนำกลับมาใช้ใหม่เป็นวิธีการทำสิ่งต่าง ๆ เพื่อใช้แม่แบบในการสร้างวิธีแก้ไขปัญหาเฉพาะ - เหล่านี้คือรูปแบบ ดังนั้นคุณจะไปถึงกรณีที่คุณบอกว่าแนวทางที่ดีในการแก้ปัญหา X คือใช้ Pattern Y และเรารู้ว่าองค์ประกอบของรูปแบบ Y คือ a, b และ c และนอกเราไป เนื่องจากรูปแบบมีความเข้าใจอย่างกว้างขวางคุณไม่จำเป็นต้องอธิบายในเชิงลึกซึ่งเป็นประโยชน์ในการสื่อสาร

สิ่งที่สนุกสนานเกี่ยวกับรูปแบบคือภาษาและกรอบการทำงานมีการพัฒนาเพื่อให้การสนับสนุนที่ดีขึ้นสำหรับรูปแบบทั่วไปโดยมีผลกระทบสุทธิที่เราได้รับการนำรหัสมาใช้มากขึ้นและดีขึ้น (อิฐเลโก้มากขึ้นและดีขึ้น!) ) อำนวยความสะดวกในการใช้ซ้ำ


4

รูปแบบการออกแบบเป็นที่รู้จักกันในชื่ออิฐโซลูชั่นซอฟต์แวร์ใดสร้างขึ้น มีความสำคัญเนื่องจากเหตุผลดังต่อไปนี้:

  1. พวกเขาเป็นผู้ไม่เชื่อเรื่องภาษา เมื่อคุณรู้ว่ารูปแบบการออกแบบใดที่เหมาะสมสำหรับปัญหา / สถาปัตยกรรม / ภารกิจที่กำหนดคุณสามารถนำไปใช้ในหลายกระบวนทัศน์ภาษาใดก็ได้ - ให้เป็น C #, Java หรือ Python - การแก้ปัญหาส่วนใหญ่จะเหมือนกันคุณเพียงแค่มี เพื่อปรับไวยากรณ์ ซึ่งหมายความว่าคุณสามารถถ่ายโอนประสบการณ์ของคุณจากการเขียนโปรแกรมในภาษาหนึ่งเป็นภาษาอื่นตราบใดที่คุณอยู่ในโดเมนปัญหาเดียวกัน (และอาจข้ามโดเมน)

  2. แม้จะมีความจริงที่ว่ารูปแบบการออกแบบไม่ได้ผูกพันกับการเขียนโปรแกรมกระบวนทัศน์หมายความว่ารูปแบบการออกแบบสำหรับการเขียนโปรแกรมเชิงวัตถุ (คนที่มีชื่อเสียงมากที่สุดยังเป็นที่รู้จัก"แก๊งสี่" รูปแบบ ) รูปแบบช่วยให้คุณเข้าใจว่ากระบวนทัศน์ใดที่ดีที่สุดและช่วยให้คุณก้าวไปไกลกว่าเพียงแค่ไวยากรณ์ตัวอย่างเช่นฉันเห็นการใช้งานจำนวนมากใน C # และ Java ที่ผู้คนเพิ่งตั้งโปรแกรมในแบบพื้นฐานหรือ Fortran - พวกเขามีความคิดที่สมบูรณ์แบบสำหรับการแก้ปัญหาและพวกเขาใช้ OOP เพียงเพื่อแสดงวิธีนี้ - ไม่มีการสืบทอด ไม่มีความหลากหลายวิธีการทั้งหมดเป็นแบบสาธารณะ ฯลฯ รูปแบบการออกแบบช่วยให้คุณมองแนวคิดเหล่านี้และดูว่าพวกเขาทำงานอย่างไรในชีวิตจริง เช่นเดียวกับรูปแบบการออกแบบในกระบวนทัศน์อื่น ๆ เช่นการเขียนโปรแกรมการทำงาน

  3. รูปแบบโดยทั่วไปเป็นวิธีที่สะดวกในการแสดงความคิดเห็นและมาถึงวิทยาการคอมพิวเตอร์จากสถาปัตยกรรม เมื่อคุณเข้าใจแนวคิดเบื้องหลัง "รูปแบบ" บางอย่างคุณสามารถจดจำรูปแบบนี้ในปัญหาอื่น ๆ ได้อย่างง่ายดายและแก้ปัญหาโดยใช้รูปแบบนี้ (อาจแก้ไขเล็กน้อยเพื่อแก้ไขปัญหาของคุณได้ดีขึ้น) มีรูปแบบที่แตกต่างกันมากมาย: ในการรวมซอฟต์แวร์ขององค์กรในการทดสอบซอร์สโค้ดเป็นต้นเพียงมองหารูปแบบในหนังสือสำหรับวิทยาการคอมพิวเตอร์

  4. นอกเหนือจากการแสวงหาแนวทางปฏิบัติที่ดีโดยรูปแบบการเรียนรู้ที่คุณสามารถเรียนรู้วิธีการหลีกเลี่ยงความผิดพลาดโง่ในรหัสของคุณโดยการศึกษาต่อต้านรูปแบบ- มีหนังสือมากมายที่มีข้อผิดพลาดทั่วไปในโดเมนที่แตกต่างกันในรูปแบบของรูปแบบการต่อต้านที่ให้ความบันเทิงและให้ความรู้ในเวลาเดียวกัน ฉันชอบชื่อของรูปแบบการต่อต้านเหล่านี้โดยวิธี!


2

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


1

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


1

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

Joe Gregorio พูดคุยอย่างยอดเยี่ยมเกี่ยวกับการขาดรูปแบบการออกแบบใน Python


ขอบคุณสำหรับลิงค์เกี่ยวกับการขาดรูปแบบการออกแบบใน Python แก้ไข: โอ๊ะโอ !! วิดีโอถูกลบออกจากตำแหน่งนั้น !! :(
Saurabh Patil

0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.