รูปแบบการออกแบบและรูปแบบสถาปัตยกรรมแตกต่างกันอย่างไร?


119

เมื่อเราอ่านเกี่ยวกับรูปแบบการออกแบบบนอินเทอร์เน็ตเราทราบว่ามี 3 ประเภท:

  • Creational
  • โครงสร้าง
  • เกี่ยวกับพฤติกรรม

แต่เมื่อเราสร้างสถาปัตยกรรมของซอฟต์แวร์แล้วเราจะคิดถึง MVP, MVC หรือ MVVM

ตัวอย่างเช่นในรูปแบบการสร้างสรรค์ฉันพบรูปแบบซิงเกิลตันแต่ฉันยังใช้ซิงเกิลตันใน MPV ด้วย

คำถามของฉันคือรูปแบบการออกแบบเป็นโครงสร้างทั้งหมดของผลิตภัณฑ์หรือไม่?

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

  • ถ้าไม่เช่นนั้น MVP, MVC และ MVVM อยู่ที่ไหนในสามประเภทของรูปแบบ? และอะไรคือความแตกต่างระหว่างการออกแบบและสถาปัตยกรรมของซอฟต์แวร์?



2
ตรวจสอบรายชื่อรูปแบบการออกแบบและแหล่งข้อมูลรูปแบบสถาปัตยกรรมgithub.com/DovAmir/awesome-design-patterns
dov.amir

คำตอบ:


174

มันต้องมีคำอธิบายโดยละเอียด แต่ฉันจะพยายามร่างความแตกต่างอย่างสุดความสามารถ

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

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

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

สำหรับมุมมองที่ง่ายที่สุด:

  • กระบวนทัศน์การเขียนโปรแกรม - เฉพาะสำหรับภาษาโปรแกรม
  • รูปแบบการออกแบบ - แก้ปัญหาที่เกิดซ้ำในการสร้างซอฟต์แวร์
  • รูปแบบสถาปัตยกรรม - โครงสร้างพื้นฐานสำหรับระบบซอฟต์แวร์

สำนวนเป็นเทคนิคการเขียนโปรแกรมเฉพาะกระบวนทัศน์และภาษาเฉพาะที่กรอกรายละเอียดระดับต่ำ

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

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

รูปแบบได้มาอย่างไร? ผ่าน:

  1. กลับมาใช้
  2. การจัดหมวดหมู่
  3. และในที่สุดสิ่งที่เป็นนามธรรมเพื่อกลั่นความเป็นธรรมดา

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

ลองอ่านต่อ:

  1. http://en.wikipedia.org/wiki/Architectural_pattern_(computer_science)
  2. http://en.wikipedia.org/wiki/Design_pattern
  3. http://en.wikipedia.org/wiki/Anti-pattern

14
ทำได้ดีและละเอียดมาก ตอนนี้ฉันแค่อยากให้ทุกคนใช้คำศัพท์ที่แตกต่างออกไปตามที่คุณใส่ไว้ที่นี่ ฉันขอปักหมุดคำตอบของคุณที่ผนังเหนือตู้กาแฟของฝ่ายการตลาดของเราได้ไหม สักวันพวกเขาอาจจะเข้าใจ ;-)
OFI

@ofi: ขอบคุณ! การใช้โครงสร้างภาษาอาจทำให้เราเข้าใจผิดและแนะนำเราได้ นี่เป็นสิ่งที่ฉันพบว่ามีพลังมาก
pyfunc

+3 เพื่อช่วยเราจากคำถามสัมภาษณ์ :)
RAJESH KUMAR ARUMUGAM

คำตอบที่ดีขอบคุณ !! ตามที่ @ofi กล่าวไว้ฉันจะพิมพ์และปักหมุดที่วอลล์ทีมออกแบบ
ม้วน

11

รูปแบบการออกแบบเป็นรูปแบบที่รู้จักกันดีในการแก้ปัญหาทางเทคนิคในลักษณะที่พิสูจน์ตัวเองมาแล้วหลายครั้ง รูปแบบการออกแบบเป็นโครงสร้างการออกแบบทั่วไปและแนวทางปฏิบัติที่ใช้สำหรับสร้างซอฟต์แวร์เชิงวัตถุที่ใช้ซ้ำได้ ตัวอย่างรูปแบบการออกแบบ ได้แก่ Factory Pattern, Singleton, Facade, State และอื่น ๆ รูปแบบการออกแบบสามารถใช้เพื่อแก้ปัญหาเล็ก ๆ ได้ตลอดทั้งแอปพลิเคชันและง่ายต่อการฉีดเปลี่ยนแปลงเพิ่มเติมมากกว่าสถาปัตยกรรมโดยรวม

รูปแบบสถาปัตยกรรมเป็นรูปแบบที่รู้จักกันดีในการแก้ปัญหาสถาปัตยกรรมแอปพลิเคชันซอฟต์แวร์ สถาปัตยกรรมแอปพลิเคชันซอฟต์แวร์เป็นกระบวนการกำหนดโซลูชันที่มีโครงสร้างซึ่งตรงตามข้อกำหนดทางเทคนิคและการปฏิบัติงานทั้งหมด สถาปัตยกรรมของแอปพลิเคชันคือ 'องค์กร' โดยรวมของโค้ด ตัวอย่างสถาปัตยกรรมที่แตกต่างกันอาจเป็น MVC, MVVM, MVP, n-layer (เช่น UI-BLL-DAL) เป็นต้นโดยทั่วไปสถาปัตยกรรมจะต้องได้รับการตัดสินใจล่วงหน้าและมักจะเปลี่ยนแปลงได้ยากเมื่อสร้างแอปพลิเคชันแล้ว


1

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

สำหรับข้อมูลเพิ่มเติม: https://www.oreilly.com/ideas/contrasting-architecture-patterns-with-design-patterns


0

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


0

รูปแบบการออกแบบแตกต่างจากรูปแบบสถาปัตยกรรมในขอบเขตของพวกเขาพวกเขามีการแปลเป็นภาษาท้องถิ่นมากขึ้นพวกเขามีผลกระทบน้อยกว่าในฐานรหัสพวกเขาส่งผลกระทบต่อส่วนเฉพาะของฐานรหัสตัวอย่างเช่น:

How to instantiate an object when we only know what type needs to be instantiated at run time (maybe a Factory Class?)
How to make an object behave differently according to its state (maybe a state machine, or a Strategy Pattern?)

รูปแบบสถาปัตยกรรมมีผลกระทบอย่างกว้างขวางต่อฐานรหัสโดยส่วนใหญ่มักส่งผลกระทบต่อแอปพลิเคชันทั้งหมดทั้งในแนวนอน (เช่นวิธีการจัดโครงสร้างโค้ดภายในเลเยอร์) หรือแนวตั้ง (กล่าวคือวิธีประมวลผลคำขอจากชั้นนอกไปสู่ชั้นในและ กลับ). ตัวอย่างรูปแบบสถาปัตยกรรม: Model-View-Controller, Model-View-ViewModel

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