อะไรทำให้การเขียนโปรแกรมเชิงวัตถุประสบความสำเร็จ [ปิด]


17

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

  1. การส่งข้อความ
  2. มรดก
  3. ความแตกต่าง
  4. encapsulation

หรือคุณสมบัติอื่น ๆ ที่คุณอาจต้องการแนะนำ

นอกจากนี้ฉันต้องการทราบว่าการเชื่อมต่อระหว่างประเภทข้อมูลนามธรรมและการเขียนโปรแกรมเชิงวัตถุคืออะไร?


ยอดนิยมและประสบความสำเร็จนั้นไม่ได้มีความหมายเหมือนกัน
kevin cline

คำตอบ:


76

ผมขอแนะนำว่าลักษณะที่สำคัญที่สุดของการเขียนโปรแกรมเชิงวัตถุเป็นที่ของการจัดการความซับซ้อน

สมองของมนุษย์สามารถมีแนวความคิดได้จำนวนมากในคราวเดียว - ขีด จำกัด ที่ยกมาของการจดจำรายการอิสระ 7 +/- 2 มาถึงใจ

เมื่อฉันทำงานกับระบบ 600kloc ในที่ทำงานฉันไม่สามารถถือสิ่งทั้งหมดไว้ในหัวของฉันได้ในครั้งเดียว ถ้าผมจะทำอย่างนั้นฉันจะ จำกัด อยู่ที่การทำงานในมากระบบที่มีขนาดเล็ก

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

แนวคิด OO ที่สำคัญทั้งหมดให้วิธีการจัดการความซับซ้อน

Encapsulation - ให้ฉันจัดการกับ API ภายนอกที่ให้บริการที่หลากหลายแก่ฉันโดยไม่ต้องกังวลว่าจะใช้บริการเหล่านั้นอย่างไร

สิ่งที่เป็นนามธรรม - ขอให้ฉันมุ่งเน้นไปที่ลักษณะสำคัญและไม่สนใจสิ่งที่ไม่เกี่ยวข้อง

องค์ประกอบ - ขอผมใช้ส่วนประกอบที่สร้างขึ้นใหม่ด้วยชุดค่าผสมใหม่

ความแตกต่าง - ให้ฉันถามบริการโดยไม่ต้องกังวลว่าวัตถุต่าง ๆ อาจให้บริการในวิธีที่แตกต่างกัน

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

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

Liskov Substit Prinicple - อย่าวางกับดักให้กันและกันโดยแนะนำการพึ่งพาแปลก ๆ

หลักการเปิด / ปิด - อนุญาตการขยายและการดัดแปลงในแบบที่ไม่ต้องการให้เราเสี่ยงต่อการทำลายโค้ดที่มีอยู่

Dependency Injection - เราจะทำการจัดองค์ประกอบไปอีกระดับแล้วประกอบเข้าด้วยกันในภายหลัง

การพัฒนาอินเตอร์เฟสที่มุ่งเน้น - เราจะนำเอานามธรรมไปสู่ระดับต่อไปและขึ้นอยู่กับสิ่งที่เป็นนามธรรมเท่านั้น


6
+1 ฉันสามารถลงคะแนนได้เพียงครั้งเดียวเท่านั้นซึ่งเป็นความอัปยศที่สมควรได้รับมากกว่านี้
ริชาร์ด

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

5
นี่อาจเป็นคำตอบที่สมบูรณ์แบบ - ข้อมูลเต็ม แต่สั้นพอที่ผู้อ่านไม่จำเป็นต้องอ่านนิยาย Bravo
Tim Claason

@ Graham Lee: ฉันสนใจที่จะอ่านการศึกษานั้น
Frank Shearar


13

ส่วนต่อประสานกราฟิกกับผู้ใช้ ในช่วงปลายทศวรรษที่แปดสิบต้น ๆ เมื่อ Macs, Amigas, Atari STs, Windows และ GEM เริ่มแทนที่ส่วนติดต่อผู้ใช้แบบตัวอักษรก็เห็นได้ชัดว่าภาษาเช่น C ไม่เหมาะที่จะเขียนโปรแกรม GUI ในขณะที่การประมวลผลข้อมูลแบบดั้งเดิมนั้นถือเป็นสคีมา "อินพุตข้อมูล -> การประมวลผล -> ข้อมูลเอาท์พุต" ซึ่งสามารถทำได้ในภาษาขั้นตอนเช่นกันคุณสมบัติ OOs เพิ่งจะมีประโยชน์ในการจัดการกับความซับซ้อนโดยธรรมชาติของ GUI


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

7

การซ่อนข้อมูลที่จัดทำโดย Encapsulation


นี่คือคำตอบ? ADT จัดเตรียมการซ่อนข้อมูล (ซึ่งเป็นสาเหตุที่เรียกว่า "data abstractions")
Frank Shearar

@ Frank, เขาถามคุณสมบัติที่เฉพาะเจาะจงและเมื่อฉันเขียนคำตอบนี้มีเพียงคนเดียวและฉันพยายามที่จะไม่ทำซ้ำ

ยุติธรรมเพียงพอ แต่การห่อหุ้มนั้นไม่เฉพาะเจาะจงกับ OO เท่านั้น ฉันควรตรวจสอบสิ่งนี้ด้วยตัวเอง แต่ฉันค่อนข้างแน่ใจว่าเรากำลังทำ encapsulation มานานก่อนที่ OO
Frank Shearar

1
@ Frank ฉันยอมรับว่ามันไม่เฉพาะเจาะจงกับ OO มันเป็นเพียงหนึ่งในคุณสมบัติหลัก

นั่นเป็นความจริงของOOPL ส่วนใหญ่แต่ไม่ใช่ทั้งหมด CLOS เป็นข้อยกเว้นที่น่าสังเกต
Frank Shearar

7

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


6

ฉันคิดว่าการสืบทอดเป็นจุดสำคัญที่สุดของ OOP

[จากการพัฒนาเกม] คุณสามารถสร้างบางสิ่งเช่นคลาส Drawable ด้วยวิธีการเรนเดอร์และคุณลักษณะและสร้างคลาส Spaceship และ Planet ซึ่งสืบทอดมาจาก Drawable นำวัตถุทั้งหมดจาก [และลูกเทพดาอื่น ๆ ], โยนใน drawableObjArray และเพียงแค่เรียกวิธีการวาดสำหรับทุกวัตถุ คุณเพียงแค่ต้องรู้ว่ามันเป็น Drawable


2
จริงๆ?? ความแตกต่างเป็นวิธีที่สำคัญกว่าและไม่ต้องการการสืบทอด (จากมุมมองเชิงทฤษฎี)
Thomas Eding

ไม่จำเป็นต้องมีฟังก์ชั่นเสมือนเพียงใช้ตัวชี้ฟังก์ชั่น
Calmarius

1
แนวคิดดั้งเดิมของ Alan Kay เรื่อง OO ไม่ได้รวมถึงการสืบทอดเพราะเขาไม่ชอบวิธีการนำไปใช้ในระบบก่อนหน้านี้
Michael Borgwardt


2

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

การพัฒนาซอฟต์แวร์คล้ายกับวิธีที่เรามองโลกทำให้จิตใจของเราจัดการกับความซับซ้อนได้ง่ายขึ้น


อาจเป็นเพราะประสบการณ์มากขึ้นกับขั้นตอน แต่หลังจากใช้ทั้งสองวิธีฉันยังคงพบว่าขั้นตอนที่ใช้งานง่ายกว่า OOP ฉันยังคงชอบส่วนที่ดีของทั้งสองสไตล์แม้ว่า
Juha Untinen

1

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

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

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


1
การส่งข้อความอาจเป็นคำตอบได้ยากเนื่องจากภาษา OOP ที่ประสบความสำเร็จไม่ได้ใช้
Jonas

OO ของคุณไม่จำเป็นต้องเป็น OO ของฉัน และภาษาส่วนใหญ่ที่เรียกว่า OO ไม่ใช่ด้วยคำจำกัดความของ Alan Kay ฉันลืมคำพูดที่ถูกต้อง แต่เคย์บอกว่าวัตถุไม่ใช่สิ่งที่มีความสำคัญเกี่ยวกับสมอลทอล์ค แต่เป็นการส่งข้อความ (และนั่นทำให้พลาดจุดนี้มากที่สุด)
Frank Shearar

@ โจนาสฉันเดาว่าเมื่ออ่านคำถามและคำตอบของฉันอีกครั้งฉันกำลังพูดว่า "OO ไม่ประสบความสำเร็จเนื่องจากมีภาษาเพียงไม่กี่ภาษาที่ถูกต้อง" แต่ฉันก็แค่พูดแบบนั้นเมื่อฉันใส่สูทกันไฟ
Frank Shearar

0

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

ADT - คุณสามารถมีสิ่งนั้นได้แม้ในภาษาที่ไม่ใช่เชิงวัตถุเช่น Pascal สแต็กหรือคิวเป็นตัวอย่างของ ADT


"ADT - คุณสามารถมีสิ่งนั้นได้แม้ในภาษาที่ไม่ใช่เชิงวัตถุเช่น Pascal สแต็กหรือคิวเป็นตัวอย่างของ ADT": จริง แต่ OOP ทำให้การกำหนดอินเทอร์เฟซของ ADT ง่ายขึ้นและให้การใช้งานที่แตกต่างและใช้แทนกันได้ (อินเตอร์เฟส / นามธรรมคลาส <---> คลาสย่อย / คลาสคอนกรีต) เท่าที่ฉันรู้ว่ามันไม่ง่ายเท่าปาสกาล
Giorgio

0

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

ตามคำถามของคุณเป็นเรื่องเกี่ยวกับ 4 คุณสมบัติของ OOP เพื่อให้คุณสามารถพูดได้

  1. การสืบทอดและ 4 การห่อหุ้มเป็นคุณสมบัติที่สำคัญที่สุดและอีกสองสิ่งจำเป็นอย่างยิ่งในการบรรลุเป้าหมายสองประการแรก

ดังนั้น 1. Message Passing และ 3. Polymorphism นั้นรองรับ 2. Inheritance และ 4. Encapsulation

  1. การสืบทอดและ 4 การห่อหุ้มเป็นกุญแจสู่ความสำเร็จสำหรับ OOP

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

-1

ในความคิดของฉันคุณสมบัติสามประการสุดท้ายมีความสำคัญที่สุดเมื่อกระทบกับการใช้ OOP อย่างกว้างขวาง:

2. Inheritance
3. Polymorphism
4. Encapsulation

แก้ไข:จุดอื่นจะเป็นIDEและสภาพแวดล้อมการพัฒนาส่วนต่อประสานกราฟิกเช่น Visual studio และ Eclipse เนื่องจากพวกเขาใช้ภาษา OOP ดังนั้นการออกแบบจึงมีแนวโน้มมากขึ้นที่มีต่อ OOP

และแน่นอนว่าSOLID Principlesนั้นเป็นผลิตภัณฑ์ที่ทำให้ ROCK นั้นสามารถส่งมอบได้จริง :)

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