การเขียนโปรแกรมที่มีโครงสร้างกับการเขียนโปรแกรม OO


11

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

ความคิดใด ๆ ??


2
ถามคำถามนี้ใน programmers.stackexchange.com จะให้คำตอบเพิ่มเติม
reggie

2
ผู้ชมของคุณคืออะไร? โปรแกรมเมอร์ที่ไม่มีประสบการณ์ OO (cobol, etc)? โปรแกรมเมอร์ที่มีประสบการณ์ต่ำ (นักเรียน ฯลฯ )? ผู้บริหาร (ไม่ใช่โปรแกรมเมอร์เลย)?

ก่อนหน้านี้ฉันไม่เคยได้ยินเรื่องนี้มาก่อน แต่ฉันอ่านคำถามที่พบบ่อยและฉันเดาว่าควรถามที่นี่ดีกว่า
Ahmed

มีประสบการณ์ต่ำ
Ahmed

4
ฉันหวังว่าโปรแกรม OO บางโปรแกรมจะมีโครงสร้างที่ดีขึ้น
Scott Whitlock

คำตอบ:


17

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

  • การเขียนโปรแกรมที่มีโครงสร้างเป็นวินัยที่กำหนดเมื่อข้ามไป (โอนโดยตรงของการควบคุม)

  • การเขียนโปรแกรม OO เป็นวินัยที่กำหนดตามตัวชี้ไปยังฟังก์ชัน (การถ่ายโอนการควบคุมทางอ้อม)

  • ฟังก์ชั่นการเขียนโปรแกรมเป็นวินัยที่กำหนดเมื่อได้รับมอบหมาย

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

มันยากกว่าที่จะเข้าใจ OO เล็กน้อย เรามักจะนิยาม OO เป็น encapsulation การสืบทอดและ polymorphism อะไรคือสิ่งที่น้อยคนรู้ก็คือว่าทั้งสามของแอตทริบิวต์เหล่านี้จะทำได้และมักได้รับการประสบความสำเร็จใน C. แท้จริง c ++ เริ่มต้นเป็นเพียง preprocessor ที่รวบรวมลงไปซีมันไม่ได้เป็นจริงยากที่จะแค็ปซูลใน C. หรือมันยากที่จะสร้าง โครงสร้างข้อมูลที่เป็นส่วนย่อยของกันและกันจำลองการสืบทอด อย่างไรก็ตามความแตกต่างนั้นค่อนข้างยาก มันต้องการตัวชี้ไปยังฟังก์ชั่นซึ่งใน C เป็นเรื่องยากที่จะจัดการได้ดี ภาษาใดที่ C ++ ให้เราคือวินัยที่บังคับให้พอยน์เตอร์เหล่านั้นทำงาน คอมไพเลอร์ C ++ สร้าง vtables สำหรับเราและเริ่มต้นพอยน์เตอร์ภายในพวกมันตามระเบียบที่เคร่งครัด ดังนั้นในความรู้สึกที่แท้จริง OO เป็นเพียงการกำหนดวินัยการถ่ายโอนการควบคุมทางอ้อมเช่นตัวชี้ไปยังฟังก์ชัน

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

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

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


@Ahmed: +1 สำหรับ "TL; DR, ขอบคุณสำหรับวิดีโอ" - ความคิดเห็นที่เป็นมงคล (ล้อเล่น)
n611x007

link rot ... ลิงค์ตาย
slashdottir

7

มีวิธีพื้นฐาน 3 วิธีในการเขียนโปรแกรมคอมพิวเตอร์:

  1. การเขียนโปรแกรมที่ไม่มีโครงสร้าง - ด้วยgotos เช่นในล่าม BASIC เก่าหรือในภาษาแอสเซมบลี มีคนไม่กี่คนที่ตั้งโปรแกรมด้วยวิธีนี้อีกต่อไป
  2. การเขียนโปรแกรมจำเป็นเชิงโครงสร้าง - เช่นใน C หรือ PASCAL
  3. การเขียนโปรแกรมเชิงโครงสร้าง - เช่นใน Haskell, ML หรือ Lisp

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


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

คุณไม่สามารถโปรแกรมได้โดยไม่ต้องเรียนรู้การเขียนโปรแกรมเชิงโครงสร้างหรือการเขียนโปรแกรมเชิงโครงสร้าง กระบวนทัศน์ทั้งสองนั้นเกี่ยวกับการทำให้สิ่งต่างๆสำเร็จ ในทางกลับกัน OOP นั้นเกี่ยวกับการทำให้เป็นโมดุลของโปรแกรมที่เข้ามาเล่นเมื่อโปรแกรมของคุณถึงขนาดที่แน่นอน แม้ว่าจะปรากฏอย่างแน่นอนในไลบรารีที่คุณใช้เมื่อเขียนโปรแกรมตลอดเวลา แต่สามารถมีไลบรารีคลาสที่ดีอย่างสมบูรณ์แบบโดยไม่มีคุณสมบัติ OO เช่นการสืบทอดเช่นไลบรารีคลาสของ Haskell, LISP หรือ Standard ML
Ken Bloom

4

ทุกอย่างเกี่ยวกับวิธีที่คุณคาดหวังการเปลี่ยนแปลง

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

คุณสามารถพูดได้ว่า OOP สืบทอดการทำงานทั้งหมดของการเขียนโปรแกรมโครงสร้างด้วยฟังก์ชันเพิ่มเติมของการสืบทอด! :-D


ฉันไม่ชอบมรดกในขณะนี้

4
ไม่ใช่ฉัน แต่เป็นเพราะรัฐบาลเขี่ยเงินออกจากบำนาญของเขา ในแง่ของ OOP อย่างไรก็ตามการรับมรดกทำให้ฉันค่อนข้างดี!
corsiKa

จากประสบการณ์ของฉันการหลีกเลี่ยงการสืบทอดใน OOP ที่ดีที่สุด คุณสร้างซูเปอร์คลาสบ่อยเพียงใดเมื่อเทียบกับอินเทอร์เฟซ ชอบองค์ประกอบเป็นกฎทั่วไป
Janx

1
@Janx: "คุณสร้างซูเปอร์คลาสบ่อยแค่ไหนเมื่อเทียบกับอินเทอร์เฟซ" ฮะ? คุณไม่ได้ "สร้างซูเปอร์คลาส"; คุณใช้คลาสที่มีอยู่และสร้างคลาสย่อยจากพวกเขาและคุณทำเช่นนั้นตลอดเวลา หากคุณไม่ได้ใช้การสืบทอดคุณจะไม่ได้รับประโยชน์จากการทดแทน Liskov และความหลากหลายดังนั้นคุณจะทำอะไรในการเขียนโปรแกรมเชิงวัตถุตั้งแต่แรก องค์ประกอบเป็นเครื่องมือที่แตกต่างกับกรณีการใช้ที่แตกต่างกันไม่ใช่การทดแทนสำหรับการสืบทอด คุณไม่ควร "โปรดปราน" อย่างใดอย่างหนึ่ง คุณควรใช้ทั้งสองอย่างสำหรับสิ่งที่มีประโยชน์
Mason Wheeler

1
@ Mason - น่าสังเกตว่า Barbara Liskov (จากหลักการเปลี่ยนตัว Liskov) จริง ๆ แล้วพูดว่า (วิดีโอยาว) เธอไม่ชอบมรดกโดยเฉพาะ
Aidan Cully

2

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


1

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

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

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


0

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

OOP ออกแบบมาเพื่อให้ง่ายต่อการเปลี่ยนแปลง การเปลี่ยนแปลงโครงสร้างของโปรแกรมสามารถทำได้ แต่ต้องอธิบายด้วยรหัส การเปลี่ยนแปลงในโปรแกรม OO สามารถอธิบายได้ด้วยการเปลี่ยนรูปแบบนามธรรม


0

ขอบเขตตัวแปร:

ฉันคิดว่าหลักการของภาษาเพื่อให้แน่ใจว่าการเขียนโปรแกรมที่ดีคือการจำกัดขอบเขตของตัวแปร ในภาษาที่มีโครงสร้างเช่น C ขอบเขตเป็นส่วนใหญ่สองประเภท -

  • ขอบเขตทั่วโลก
  • ขอบเขตท้องถิ่น / ฟังก์ชั่น / วิธีการ

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

ภาษา OOP เช่น C ++ เพิ่มขอบเขตขอบเขตคลาส / วัตถุชนิดใหม่ผ่านการห่อหุ้ม การกำหนดขอบเขตนี้ได้รับการปรับปรุงเพิ่มเติมโดยรูปแบบส่วนตัว / สาธารณะ และนี่ช่วยแก้ปัญหามากมายของการกำหนดขอบเขตตัวแปร ขอบเขตถูกกำหนดเพิ่มเติมใน OOP และตัวชี้มีความต้องการน้อยกว่า

นี่เป็นหนึ่งในคุณสมบัติที่ยอดเยี่ยมของ OOP

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