สถาปัตยกรรมที่ดี (เรียบร้อย) คืออะไรในการเขียนโปรแกรมเว็บไซต์อย่างง่ายเช่นสมุดติดต่อ


28

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

ฉันมีสองไฟล์:

  1. ตัวแรก ( contacts.php) คือรหัส HTML ที่จะแสดง เหนือรหัส HTML ฉันรวมไฟล์ที่สองและสร้างคลาส
  2. ที่สอง ( contacts_class.php) มีวิธีการทั้งหมดสำหรับการเพิ่มการลบและการปรับปรุง

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

คำตอบ:


67

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

ทุกวันนี้วิธีการทั่วไปในการสร้างสถาปัตยกรรมเฟรมเวิร์ก CMS คือการใช้รูปแบบ MVC มีบางบทความที่ดีเกี่ยวกับการสร้างกรอบ MVC ของคุณเองเป็นหนึ่งในนั้นคือสร้างกรอบ MVC กับ PHP

MVC ย่อมาจาก Model, View, Controller คุณอาจเรียกวิธีการเหล่านี้ได้ตามต้องการ - MVC, HMVC, MVP สิ่งสำคัญคือการแยกส่วนประกอบแต่ละส่วนของระบบของคุณ "Controller" ดึงข้อมูลจาก "Model" และส่งไปยัง "View" ซึ่งแสดงผล HTML ขั้นสุดท้าย คุณได้ติดตั้ง "V" ในcontacts.php"MC" ของคุณcontacts_class.phpแล้ว ดังนั้นคุณได้แยกมุมมองจากรูปแบบและตัวควบคุม ตอนนี้คุณสามารถเปลี่ยน "มุมมอง" ของคุณได้โดยไม่ทำให้ส่วนอื่นเสียหาย

ฉันไม่แนะนำให้คุณติดตาม MVC, MVP หรือรูปแบบ "MV" อย่างอื่น มันเป็นเรื่องของความเหมาะสมประสิทธิภาพและรสชาติ

แอปพลิเคชันเว็บไซต์แบบไดนามิกทั่วไปอาจรวมถึงส่วนประกอบเช่น:

  • จุดเข้าพูด index.php
  • ไลบรารี / คลาสผู้ช่วย
  • คำขอเราเตอร์
  • โมดูลส่วนประกอบหรือตัวควบคุม
  • เครื่องมือเทมเพลตหรือมุมมองเดียว

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

แผนภาพประจำการดำเนินงาน

เฟรมเวิร์กการดำเนินการทั่วไปของเฟรมเวิร์กมีดังนี้:

  1. คำขอของเบราว์เซอร์จะถูกส่งโดยตรงไปยังจุดปฏิบัติการที่เรียกใช้ / สคริปต์ ( index.php)
  2. สคริปต์จุดเริ่มต้นโหลดไลบรารีตัวช่วยคลาสและดำเนินการเริ่มต้นเพิ่มเติมของสภาพแวดล้อมการเขียนโปรแกรมของเรา
  3. URL ถูกส่งผ่านไปยังอินสแตนซ์เราเตอร์ที่ร้องขอ ขั้นตอนนี้สามารถเป็นส่วนหนึ่งของขั้นตอนที่ 2
  4. เราเตอร์ที่ร้องขอแยกวิเคราะห์ URL และส่งการดำเนินการไปยังส่วนประกอบโมดูลหรือตัวควบคุมเฉพาะ
  5. ส่วนประกอบ (หรือตัวควบคุม) ประมวลผลคำขอเส้นทางและส่งข้อมูลไปยังมุมมองที่จะแสดงผล

โครงสร้างโฟลเดอร์โครงการที่สอดคล้องกันจะแสดงในแผนภาพ

ฉันขอแนะนำให้คุณตรวจสอบว่ามีการนำกรอบงานอื่นมาใช้อย่างไร CMS / เฟรมเวิร์กที่แนะนำให้เริ่มด้วยคือ CodeIgniter, OpenCart, Joomla 1.5 และ Tango CMS


3
คุณใช้ภาพอะไรในการสร้างภาพ คำตอบที่ดี!
Mark Tomlin

3
ขอบคุณสำหรับการประเมินผลในเชิงบวกของคำตอบของฉัน! ฉันซาบซึ้งจริงๆ! คำตอบนี้เป็นผลมาจากการวิเคราะห์กรอบโอเพนซอร์สเว็บแอพพลิเคชั่นต่าง ๆ ทั้งหมดซึ่งฉันได้ดำเนินการมาก่อนหน้านี้เพื่อตัวเอง สำหรับผู้ที่สนใจในการสร้างภาพและซอฟต์แวร์ที่ใช้งานภาพที่สร้างขึ้นโดยใช้ Inkscape 0.48 และ GIMP 2.6.10 ไม่มีปัญหากับเรื่องนั้น เพียงใช้สองเลเยอร์: หนึ่งสำหรับสี่เหลี่ยมที่มีข้อความหนึ่งสำหรับเงา (สี่เหลี่ยมสีดำเบลอ) ฉันเดาว่าคุณเข้าใจส่วนที่เหลือเหรอ?

คำถามหนึ่งทำไมคุณต้องแยกตัวควบคุม 'ผู้ติดต่อ' ออกเป็น 3 ไฟล์ จะเป็นการดีกว่าไหมถ้าจะรวมเข้าไว้ในรายชื่อติดต่อหนึ่งคน สิ่งที่คุณต้องทำคือส่งพารามิเตอร์การดำเนินการจากเราเตอร์ สามารถพูดได้เหมือนกันสำหรับมุมมอง 'ผู้ติดต่อ' เว้นแต่ว่ามุมมองของคุณจะเป็นการรวมเทมเพลตและตรรกะไว้ในไฟล์เดียวสำหรับแต่ละการกระทำ ฉันไม่ค่อยได้พัฒนา dev ใน PHP (ฉันทำงานส่วนใหญ่ใน Python) แต่ฉันหวังว่าไม่ใช่ทุกเฟรมเวิร์คที่ใช้วิธีการนี้ มิฉะนั้น +1 สำหรับการเขียนที่ดี
Evan Plaice

2

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

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

(ซอฟต์แวร์) สถาปัตยกรรมเป็นวิชาที่กว้างมากอย่าคาดหวังว่าจะมีกระสุนเงิน แต่มักมีคำถามและข้อสงสัยมากขึ้นเรื่อย ๆ จนกระทั่งเวลาและเงินหมดและคุณต้องติดตั้งทางออกที่ดีที่สุด


2

ก่อนอื่นลองดูการพัฒนาโครงการที่ดี Wordpress เป็นตัวอย่างโครงสร้างของโค้ดที่เข้าใจง่าย แต่มี "plug" มากมาย ดังนั้นเวิร์ดเพรสจึงง่ายต่อการยกย่องผ่าน "ปลั๊กอิน"

ประการที่สองวิธีที่ง่ายมากในการตรวจสอบสถาปัตยกรรมของคุณคือการพยายามเขียนการทดสอบหน่วย ตัวอย่างเช่นหากคลาส "สำรับไพ่" มีวิธี "สับเปลี่ยน ()" คุณจะต้องสามารถสร้างช่องใส่การ์ดขนาดที่กำหนดไว้ล่วงหน้า (เช่น 5 ใบ 1,2,3,4,5) เรียกสับเปลี่ยนและยืนยันใน วิธีง่ายๆในการรับผล (id 1,4,2,5,3)

คุณจะต้องสามารถทำมันได้โดยไม่ต้องเรียนทั้งคลาสโปรเจ็กต์ทันทีและการทดสอบจะต้องอ่านให้สะอาด

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

จากนั้นกำหนดขั้นตอนนี้ใหม่สำหรับคลาสหลักทั้งหมดของโครงการของคุณ

สุดท้าย แต่ไม่ท้ายสุด: การออกแบบที่ดีอาจเป็น "ขี้เกียจ" ในชั้นเรียนที่ไม่ได้ให้ความสำคัญ (เป็นเรื่องของเศรษฐกิจ: สิ่งที่ออกแบบมาเป็นอย่างดีเสียค่าใช้จ่ายมากเกินไปในโลกแห่งความเป็นจริง)


1

สถาปัตยกรรมที่ดีสำหรับโครงการขนาดใหญ่คือ MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

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


นั่นเป็นรูปแบบไม่ใช่สถาปัตยกรรม
halfdan

ฉันขอยืนยันว่าพวกเขาเป็นหนึ่งเดียวกันในกรณีนี้ คุณจะแยกความแตกต่างของทั้งสองได้อย่างไร นอกจากนี้อ่านบรรทัดแรกของหน้า Wikipedia ที่ฉันโพสต์
Chris Laplante

1
จากประสบการณ์ของฉัน MVC ไม่ซับซ้อนและมีประโยชน์มากในโครงการขนาดเล็กเช่นกัน ฉันเห็นด้วย แต่เป็นรูปแบบและไม่ใช่สถาปัตยกรรมทั้งหมด
Danny Varod

MVC เป็นรูปแบบไม่ใช่สถาปัตยกรรมต่อ se แต่ถือได้ว่าเป็นส่วนหนึ่งของสถาปัตยกรรม และมันก็ไม่ได้ซับซ้อนอะไรเลย

1

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

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

เมื่อจำแนกองค์ประกอบแล้วเราต้องระบุการจำแนกประเภทตามเทียร์ เว็บแอปพลิเคชันทั่วไปจะมี View Tier, Model Tier และ Controller Tier (MVC) แน่นอนว่าอาจมีการใช้งานที่ซับซ้อนมากขึ้นเช่นกัน (แอปพลิเคชันในโลกแห่งความเป็นจริงส่วนใหญ่มีความซับซ้อนมากขึ้นซึ่งตรงไปตรงมานี้)

หลังจากการระบุ taxonomies ทั้งสองนี้ฉันจะสร้างโฟลเดอร์ระดับบนสุดที่ระบุแต่ละระดับ (UI, ตัวควบคุม, บริการ, ประโยชน์ ฯลฯ ) ภายใต้โฟลเดอร์ระดับสูงแต่ละโฟลเดอร์ฉันจะสร้างโฟลเดอร์ลูกตามฟังก์ชั่นหรือทรัพยากร (โครงการ - / EditProject - / SearchProject ฯลฯ ) การจำแนกการทำงานตามอุดมคติจะเป็นหลายระดับ


ฉันไม่ได้ลึกลงไปในความแตกต่างระหว่างการวางทรัพยากรและการออกแบบเชิงกิจกรรม นอกจากการพูดนอกเรื่องฉันไม่แน่ใจในคำถาม แต่โดยส่วนตัวเมื่อพูดถึงความชัดเจนของการออกแบบ (ความง่ายในการพัฒนาของผู้พัฒนาชิ้นใหม่สามารถเข้าใจองค์ประกอบและการออกแบบพื้นฐาน) Resource Oriented Architecture ดีกว่า เพียงแค่มองไปที่ลำดับชั้นของโฟลเดอร์นักพัฒนาสามารถเข้าใจทรัพยากรที่เข้าร่วมทั้งหมดและทรัพยากรย่อยและการดำเนินการในแต่ละทรัพยากรก็เหมือนกัน

1

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

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


1

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

เพื่อรับความรู้สึกที่ดีสำหรับตำแหน่งสุดโต่งอื่น ๆ ให้ดูที่ซีไซด์


1

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

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


0

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

  1. มันสามารถทดสอบหน่วย
  2. แยกความกังวล
  3. หลายคนจะสามารถทำงานได้โดยไม่มีการชนกัน
  4. มันสามารถขยายได้โดยไม่มีปัญหามาก
  5. มันสามารถปรับขนาดได้ เมื่อพูดถึงการขยายโครงการขนาดใหญ่จะเป็นข้อกังวลหลัก กรอบชำระเงินKohanaซึ่งเขียนได้ดีและสามารถปรับขนาดได้เป็นอย่างดี

0

ก่อนที่คุณจะเขียนรหัสการผลิตจะใช้เวลา 2 สัปดาห์ (คืน :) และอ่านหนังสือเล่มนี้ มันจะเปลี่ยนความคิดของคุณเป็นเวลานานเกี่ยวกับสถาปัตยกรรมการเขียนโปรแกรม pratices และการบรรจุ

หลักการรูปแบบและการปฏิบัติที่คล่องตัว C # โดย Prentice Hall

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

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

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