อะไรคือความแตกต่างระหว่างกระบวนทัศน์การเขียนโปรแกรมเหล่านี้และพวกเขาเหมาะสมกับปัญหาเฉพาะหรือการใช้ประโยชน์จากกรณีอื่น ๆ ดีกว่ากันหรือไม่?
ตัวอย่างสถาปัตยกรรมชื่นชม!
อะไรคือความแตกต่างระหว่างกระบวนทัศน์การเขียนโปรแกรมเหล่านี้และพวกเขาเหมาะสมกับปัญหาเฉพาะหรือการใช้ประโยชน์จากกรณีอื่น ๆ ดีกว่ากันหรือไม่?
ตัวอย่างสถาปัตยกรรมชื่นชม!
คำตอบ:
พวกเขาทั้งหมดเป็นคนดีในแบบของพวกเขา - พวกเขาแตกต่างกันเพียงวิธีการในปัญหาเดียวกัน
ในรูปแบบขั้นตอนอย่างหมดจดข้อมูลมีแนวโน้มที่จะแยกจากฟังก์ชันที่ใช้งาน
ในรูปแบบวัตถุที่มุ่งเน้นข้อมูลมีแนวโน้มที่จะดำเนินการกับคอลเลกชันของฟังก์ชั่น
ในรูปแบบการทำงานข้อมูลและฟังก์ชั่นมีแนวโน้มที่จะมีความเหมือนกันมากขึ้น (เช่นใน Lisp และ Scheme) ในขณะที่ให้ความยืดหยุ่นมากขึ้นในแง่ของวิธีการใช้ฟังก์ชั่นจริง ๆ อัลกอริทึมมีแนวโน้มที่จะถูกกำหนดในแง่ของการเรียกซ้ำและองค์ประกอบมากกว่าวนซ้ำและซ้ำ
แน่นอนว่าภาษานั้นมีอิทธิพลต่อรูปแบบที่ต้องการเท่านั้น แม้ในภาษาบริสุทธิ์ที่ใช้งานได้เช่น Haskell คุณสามารถเขียนในรูปแบบขั้นตอน (แม้ว่าจะเป็นกำลังใจอย่างมาก) และแม้แต่ในภาษาขั้นตอนเช่น C คุณสามารถเขียนโปรแกรมในลักษณะเชิงวัตถุ (เช่นใน GTK + และ EFL API)
เพื่อความชัดเจน "ข้อได้เปรียบ" ของกระบวนทัศน์แต่ละอันนั้นง่าย ๆ ในการสร้างแบบจำลองอัลกอริธึมและโครงสร้างข้อมูลของคุณ ตัวอย่างเช่นหากอัลกอริทึมของคุณเกี่ยวข้องกับรายการและต้นไม้อัลกอริทึมที่ใช้งานได้อาจเหมาะสมที่สุด หรือตัวอย่างเช่นถ้าข้อมูลของคุณมีโครงสร้างสูงมันอาจทำให้เข้าใจได้ง่ายขึ้นว่ามันเป็นวัตถุหากนั่นเป็นกระบวนทัศน์ดั้งเดิมของภาษาของคุณ - หรือมันอาจจะเขียนได้อย่างง่ายดายเหมือนกับการใช้งานของพระ เป็นกระบวนทัศน์ดั้งเดิมของภาษาเช่น Haskell หรือ ML
ตัวเลือกที่คุณใช้เป็นเพียงสิ่งที่สมเหตุสมผลสำหรับโครงการของคุณและบทคัดย่อที่ภาษาของคุณรองรับ
ฉันคิดว่าห้องสมุดเครื่องมือตัวอย่างและชุมชนที่มีให้เลือกใช้งานได้อย่างสมบูรณ์ในยุคสมัยนี้ ตัวอย่างเช่น ML (หรืออะไรก็ตาม) อาจเป็นภาษาการเขียนโปรแกรมอเนกประสงค์ขั้นสูงสุดแต่หากคุณไม่สามารถรับไลบรารี่ที่ดีสำหรับสิ่งที่คุณกำลังทำ
ตัวอย่างเช่นหากคุณสร้างวิดีโอเกมมีตัวอย่างโค้ดและ SDK ที่ดีกว่าใน C ++ ดังนั้นคุณน่าจะดีกว่า สำหรับเว็บแอปพลิเคชั่นขนาดเล็กมีกรอบ Python, PHP และ Ruby ที่ยอดเยี่ยมที่จะทำให้คุณทำงานได้อย่างรวดเร็ว Java เป็นตัวเลือกที่ยอดเยี่ยมสำหรับโครงการขนาดใหญ่เนื่องจากการตรวจสอบเวลาคอมไพล์และไลบรารีและแพลตฟอร์มขององค์กร
มันเคยเป็นกรณีที่ห้องสมุดมาตรฐานสำหรับภาษาที่แตกต่างกันมีขนาดค่อนข้างเล็กและลอกเลียนแบบได้ง่าย - C, C ++, Assembler, ML, LISP และอื่น ๆ มาพร้อมกับพื้นฐาน แต่มีแนวโน้มที่จะไก่ออกมา เช่นการสื่อสารเครือข่ายการเข้ารหัสกราฟิกรูปแบบไฟล์ข้อมูล (รวมถึง XML) แม้แต่โครงสร้างข้อมูลพื้นฐานเช่นต้นไม้ที่สมดุลและแฮชเทเบิลก็หมดไป!
ภาษาสมัยใหม่เช่น Python, PHP, Ruby และ Java มาพร้อมกับไลบรารีมาตรฐานที่ดีกว่าและมีไลบรารี่ของบุคคลที่สามมากมายที่คุณสามารถใช้งานได้อย่างง่ายดายขอบคุณส่วนมากในการนำเนมสเปซมาใช้ และการรวบรวมขยะเพื่อสร้างมาตรฐานโครงร่างการจัดการหน่วยความจำของไลบรารี
กระบวนทัศน์เหล่านี้ไม่จำเป็นต้องเกิดขึ้นพร้อมกัน หากคุณดูไพ ธ อนมันรองรับฟังก์ชั่นและคลาส แต่ในเวลาเดียวกันทุกอย่างก็เป็นวัตถุรวมถึงฟังก์ชั่น คุณสามารถผสมและจับคู่ลักษณะการทำงาน / oop / กระบวนงานทั้งหมดในรหัสชิ้นเดียว
สิ่งที่ฉันหมายถึงคือในภาษาที่ใช้งานได้ (อย่างน้อยใน Haskell ที่ฉันเรียนเท่านั้น) ไม่มีข้อความใด ๆ ! อนุญาตให้ฟังก์ชั่นหนึ่งนิพจน์อยู่ภายในพวกเขาเท่านั้น !! แต่ฟังก์ชั่นเป็นพลเมืองชั้นหนึ่งคุณสามารถผ่านมันเป็นพารามิเตอร์พร้อมกับความสามารถอื่น ๆ พวกเขาสามารถทำสิ่งที่ทรงพลังด้วยโค้ดไม่กี่บรรทัด
ในขณะที่อยู่ในภาษาขั้นตอนเช่น C วิธีเดียวที่คุณสามารถส่งผ่านฟังก์ชั่นได้คือการใช้พอยน์เตอร์ของฟังก์ชั่น
ในหลามฟังก์ชั่นเป็นพลเมืองชั้นหนึ่ง แต่มันสามารถมีจำนวนงบโดยพลการ ดังนั้นคุณสามารถมีฟังก์ชั่นที่มีโค้ดโพรซีเดอร์ได้ แต่คุณสามารถผ่านมันได้เหมือนกับภาษาที่ใช้งานได้
กันไปสำหรับ OOP ภาษาอย่าง Java ไม่อนุญาตให้คุณเขียนขั้นตอน / ฟังก์ชั่นนอกห้องเรียน วิธีเดียวที่จะผ่านฟังก์ชั่นรอบ ๆ คือห่อมันในวัตถุที่ใช้ฟังก์ชั่นนั้นแล้วส่งผ่านวัตถุนั้นไปรอบ ๆ
ใน Python คุณไม่มีข้อ จำกัด นี้
สำหรับ GUI ฉันพูดได้ว่ากระบวนทัศน์เชิงวัตถุนั้นเหมาะสมมาก หน้าต่างเป็นวัตถุกล่องข้อความเป็นวัตถุและปุ่มโอเคก็มีเช่นกัน ในทางกลับกันสิ่งต่าง ๆ เช่นการประมวลผลสตริงสามารถทำได้โดยมีค่าใช้จ่ายน้อยกว่ามาก
ฉันไม่คิดว่ามันเป็นคำถามเกี่ยวกับภาษาเลย คุณสามารถเขียนการใช้งานขั้นตอนหรือเชิงวัตถุในภาษายอดนิยมเกือบทุกภาษาแม้ว่าอาจมีความพยายามเพิ่มเติมในบางภาษา
ในการตอบคำถามของคุณเราจำเป็นต้องมีองค์ประกอบสองประการ:
รายการรูปแบบ / รูปแบบสถาปัตยกรรมซอฟต์แวร์จะแสดงในบทความสถาปัตยกรรมซอฟต์แวร์บน Wikipeida และคุณสามารถค้นคว้าได้อย่างง่ายดายบนเว็บ
ในระยะสั้นและทั่วไปขั้นตอนเป็นสิ่งที่ดีสำหรับแบบจำลองที่ตามขั้นตอน OOP นั้นดีสำหรับการออกแบบและ Function นั้นดีสำหรับการเขียนโปรแกรมระดับสูง
ฉันคิดว่าคุณควรลองอ่านประวัติในแต่ละกระบวนทัศน์และดูว่าทำไมผู้คนจึงสร้างมันขึ้นมาและคุณสามารถเข้าใจได้อย่างง่ายดาย
หลังจากทำความเข้าใจกับทั้งคู่แล้วคุณสามารถเชื่อมโยงไอเท็มของสไตล์ / รูปแบบสถาปัตยกรรมกับกระบวนทัศน์การเขียนโปรแกรม
ฉันคิดว่าพวกเขามักจะไม่ใช่ "กับ" แต่คุณสามารถรวมพวกเขาได้ ฉันคิดว่าบ่อยครั้งคำที่คุณพูดถึงนั้นเป็นเพียงแค่ buzzwords มีคนไม่กี่คนที่รู้ว่า "เชิงวัตถุ" หมายถึงอะไรแม้ว่าพวกเขาจะเป็นผู้ประกาศข่าวประเสริฐที่สุดก็ตาม
หนึ่งในเพื่อนของฉันคือการเขียนแอพพลิเคกราฟิกโดยใช้NVIDIA CUDA แอปพลิเคชั่นเหมาะสมอย่างยิ่งกับกระบวนทัศน์ OOP และปัญหาสามารถแยกย่อยเป็นโมดูลได้อย่างเรียบร้อย อย่างไรก็ตามเพื่อให้การใช้ CUDA คุณจำเป็นต้องใช้ซีซึ่งไม่สนับสนุนการถ่ายทอดทางพันธุกรรม ดังนั้นคุณต้องฉลาด
ก) คุณประดิษฐ์ระบบที่ชาญฉลาดซึ่งจะเลียนแบบการสืบทอดในระดับหนึ่ง มันสามารถทำได้!
i) คุณสามารถใช้ระบบเบ็ดซึ่งคาดว่าลูกทุกคนของผู้ปกครอง P จะมีการแทนที่ที่แน่นอนสำหรับฟังก์ชั่น F คุณสามารถทำให้เด็กลงทะเบียนแทนที่ของพวกเขาซึ่งจะถูกเก็บไว้และเรียกเมื่อจำเป็น
ii) คุณสามารถใช้คุณสมบัติการจัดตำแหน่งหน่วยความจำ struct เพื่อส่งเด็ก ๆ ไปยังผู้ปกครอง
สิ่งนี้อาจเป็นระเบียบ แต่ไม่ใช่เรื่องง่ายที่จะหาวิธีแก้ปัญหาที่เชื่อถือได้ในอนาคต คุณจะใช้เวลามากมายในการออกแบบระบบและไม่มีการรับประกันว่าคุณจะไม่ประสบปัญหาระหว่างทางโครงการ การใช้หลายมรดกนั้นยิ่งยากกว่าหากเป็นไปไม่ได้
b) คุณสามารถใช้นโยบายการตั้งชื่อที่สอดคล้องกันและใช้วิธีการแบ่งและพิชิตเพื่อสร้างโปรแกรม มันจะไม่ได้รับมรดก แต่เนื่องจากฟังก์ชั่นของคุณมีขนาดเล็กง่ายต่อการเข้าใจและจัดรูปแบบอย่างสม่ำเสมอคุณไม่ต้องการมัน จำนวนโค้ดที่คุณต้องเขียนเพิ่มขึ้นมันยากมากที่จะจดจ่อและไม่ยอมแพ้กับวิธีแก้ปัญหาที่ง่าย (แฮ็ก) อย่างไรก็ตามวิธีการเข้ารหัสของนินจานี้เป็นวิธีการเข้ารหัสของ C อยู่ในสมดุลระหว่างเสรีภาพในระดับต่ำและการเขียนรหัสที่ดี วิธีที่ดีในการบรรลุเป้าหมายนี้คือการเขียนต้นแบบโดยใช้ภาษาที่ใช้งานได้ ตัวอย่างเช่นHaskellนั้นดีมากสำหรับอัลกอริทึมต้นแบบ
ฉันมักจะเข้าหาแนวทางข ฉันเขียนวิธีแก้ปัญหาที่เป็นไปได้โดยใช้แนวทาง a และฉันจะซื่อสัตย์ฉันรู้สึกผิดปกติมากเมื่อใช้รหัสนั้น