C ++ ไม่เหมาะสำหรับ OOP หรือไม่ [ปิด]


12

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

มีความจริงในเรื่องนี้บ้างไหม? ถ้าเป็นเช่นนั้นทำไม


คุณกำลังมองหาสิ่งนี้อยู่ใช่ไหม stackoverflow.com/questions/1635583/… ? หรือนี่javaworld.com/javaworld/jw-04-2001/jw-0406-java101.html ?
S.Lott

5
OOP ไม่ใช่คำที่กำหนดชัดเจนดังนั้นการอภิปรายว่า C ++ นั้นเหมาะสมหรือไม่เหมาะสมนั้นค่อนข้างไร้สาระ
zvrba

คำตอบ:


31

ตามที่อธิบายที่ดังนั้น * Alan Kay หมายถึงอะไรโดยคำว่า "เชิงวัตถุ"? Alan Kay คิดว่าการส่งข้อความเป็นบิตที่สำคัญของ OOP แต่เป็นบิตที่ "C กับคลาส" (ซึ่งต่อมากลายเป็น C ++) ขาด C ++ เป็นเพียงโครงสร้างที่มีพฤติกรรมเล็กน้อยในขณะที่วัตถุใน Smalltalk หรือ Objective-C นั้น "ฉลาด" ในการที่พวกเขาสามารถตัดสินใจว่าพวกเขาทำอะไรกับข้อความที่พวกเขาส่ง ถ้าวัตถุ Smalltalk-esque ได้รับข้อความมันไม่มีการใช้งานมันสามารถเพิ่มหนึ่งอย่างเฉื่อยชาส่งต่อข้อความไปยังวัตถุอื่นหรือทำสิ่งใด ๆ โดยพลการ

สิ่งที่ C ++ เสนอในทางของการวางแนวของวัตถุคือvirtualวิธีการและความหลากหลายที่เกี่ยวข้องกับวิธีการที่เรียกใช้ เมื่อคอมไพเลอร์เห็นชนิดข้อมูล (หรือclass) ที่มีวิธีเสมือนมันจะสร้าง vtable พร้อมช่องสำหรับแต่ละวิธีเสมือน คลาสย่อยที่ใช้เมธอดเสมือนจะวางการประยุกต์ใช้ในสล็อตที่ถูกต้องดังนั้นโค้ดไคลเอ็นต์เพียงต้องการทราบว่าในตารางเสมือนเพื่อค้นหารหัสที่จะทำงาน สิ่งนี้หมายความว่า C ++ จะมีรูปแบบการกระจายหลายแบบอย่างมีประสิทธิภาพแม้ว่าทั้งหมดจะถูกนำไปใช้ในคอมไพเลอร์และไม่สามารถทำได้เหมือนระบบ Smalltalk-esque

ถ้าคุณใช้การส่งข้อความเป็นพื้นฐานของ OOP ในขณะที่คุณสามารถทำได้ด้วย C ++ มันไม่ง่ายเลย OTOH ถ้าคุณใช้ OOP หมายถึงการเชื่อมโยงข้อมูลกับฟังก์ชั่นที่ทำงานกับข้อมูลนั้น C ++ นั้นใช้ได้


8
+1 - แต่ฉันคิดเสมอว่าการเรียกใช้ฟังก์ชันเป็นวิธีที่เหมาะสมในการส่งข้อความอย่างไรก็ตาม จริงมันเป็นรากฐานระดับต่ำมากกว่าการแก้ไขระดับสูงสำหรับทุกอย่าง - แต่รูปแบบวัตถุที่ใช้งานแสดงให้เห็นว่ามันเป็นไปได้ที่จะสร้างขึ้นจากรากฐานนั้น
Steve314

6
ดังนั้นสิ่งนี้ไม่เพียงใช้กับ C ++ แต่สำหรับ Java, C #, Object Pascal และอื่น ๆ และท้ายที่สุดก็คือระบบการส่งข้อความของ Windows API คือสิ่งที่ Alan มีความหมายว่าเป็นสิ่งที่สำคัญที่สุดใน OOP โดยเฉพาะวิธีที่ Delphi จัดการ
ตรินิแดด

@trinidad ถูกต้องยกเว้น C # จริง ๆ แล้วสนับสนุนการแก้ปัญหาแบบไดนามิก ฉันคาดหวังว่ามันยุติธรรมที่จะบอกว่าความคิดของ OOP ของเราเปลี่ยนไปตามกาลเวลาเพื่อหลีกเลี่ยงการส่งข้อความ ช่วยไม่ต้องสงสัยเลยว่าผู้ขายบอกว่าเทคโนโลยีของพวกเขาคือ OOP แน่นอนเมื่อต้องเผชิญกับหลักฐาน ...

@ steve314 ใช่มันเป็น ที่จริงแล้วเป็นวิธีการทำงานของ ObjC การส่งข้อความจะถูกแปลเป็นการเรียกใช้ฟังก์ชันซึ่งค้นหาและเรียกใช้ฟังก์ชันเมธอด ในขณะที่ฉันเข้าใจการส่งข้อความมันเป็นการกระจายสองเท่าที่สำคัญ

1
@Paul: มีประสบการณ์ จำกัด กับ Win32 API ฉันไม่เข้าใจ API ใด ๆ ที่วัตถุมีขนาดผันแปรและในกรณีที่จำเป็นต้องเรียกรูทีนเป็นครั้งแรกเพื่อกำหนดว่าวัตถุจะมีขนาดใหญ่เท่าใดจัดสรรหน่วยความจำและเรียกใช้อีกครั้งไม่สามารถทดสอบความงามได้
David Thornley

27

การอภิปรายแบบนี้ทำให้ฉันรำคาญเพราะฟังดูเหมือนเป็นการตีความผู้คนถกเถียงความหมายของพระคัมภีร์ศักดิ์สิทธิ์หรือรัฐธรรมนูญอเมริกันและความหมายของผู้เขียนต้นฉบับราวกับว่าสิ่งที่เราคิดว่าไม่สำคัญ

อลันเคย์เป็น / เป็นคนที่ฉลาดและเขามีความคิดที่ดีที่ขัดกับความคิดที่ดีอื่น ๆ มากมายและพบว่าสำนึกใน Smalltalk และภาษาอื่น ๆ

เขาไม่ใช่พระเจ้าและ OOP ไม่ใช่กระบวนทัศน์การเขียนโปรแกรมหนึ่งที่แท้จริง

มันเป็นความคิดที่ดีในหมู่คนจำนวนมาก C ++ มีแนวคิดที่ดีมาจาก OOP หรือไม่? แน่นอนมัน


8

C ++ รองรับ OOP หากคุณกำหนด OOP ให้หมายถึงการห่อหุ้มการสืบทอดและการแตกต่างกัน

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

อย่างไรก็ตามที่ C ++ excels อยู่ในการเขียนโปรแกรมทั่วไป C ++ ช่วยให้คุณสร้างโค้ดทั่วไปที่มีประสิทธิภาพสูงได้อย่างง่ายดายผ่านเทคนิคการเขียนโปรแกรมฟังก์ชั่นที่ใช้เทมเพลต


4

C ++ ยืมคุณสมบัติ OOP จาก Simula นักพัฒนา Simula อย่างน้อยหนึ่ง IIRC แสดงความคิดเห็นว่า C ++ ไม่ใช่สิ่งที่พวกเขามีอยู่ในใจ

C ++ มีเครื่องมือที่ดีสำหรับนามธรรม แต่มันเป็นภาษาผสมกระบวนทัศน์มากกว่าภาษาเชิงวัตถุ มีคุณลักษณะเชิงวัตถุ แต่คุณมีตัวเลือกที่ไม่ "เข้มงวด OOP"

หนึ่งใน "การเลือกไม่ใช้" ซุกซนที่คุณได้รับในภาษาซีพลัสพลัสคือการใช้ แต่เนิ่นๆแทนที่จะใช้วิธีผูกมัดช้ากว่า ไม่เพียงเป็นไปได้ - มันเป็นค่าเริ่มต้น ใน Java นั้น "final" มีความเกี่ยวข้อง แต่สะอาดกว่าในบางวิธี (ระบุความตั้งใจในวิธีที่ไม่ได้เกี่ยวกับการหลีกเลี่ยงค่าใช้จ่ายเล็กน้อย) และไม่ใช่ค่าเริ่มต้น

ในบางวิธี C ++ แสดงให้เห็นถึงสัญญาณของการทดลองก่อนหน้านี้ที่ยังคงอยู่ที่นี่ ถึงกระนั้นก็ยังเป็นเครื่องมือที่ดีมีข้อดีมากมายที่คุณไม่ได้รับในภาษา OOP อื่น ๆ


2
C ++ อนุญาตให้ไม่ใช่ OOP และ C ++ อนุญาตให้ OOP สำหรับบางภาษาเป็น OO ต้องอนุญาต OOP ดังนั้น C ++ จึงเป็นภาษา OO
ตรินิแดด

1
ฉันเชื่อว่า Alan Kay จากชื่อเสียง Smalltalk กล่าวว่า C ++ ไม่ใช่สิ่งที่เขามีอยู่ในใจเมื่อเขาประกาศคำว่า "เชิงวัตถุ" ตั้งแต่ C ++ เริ่มต้นเป็น "C กับ Classes" การปลูกถ่ายอวัยวะของ Simula ลงบน C และไม่เคยหยุดพักที่สะอาดเลยไม่น่าแปลกใจเลยที่ดูเหมือนว่าจะเป็นการทดลองขั้นต้น
David Thornley

1
@Trinidad: ภาษาใด ๆ ที่อนุญาตให้ใช้ OOP ผมเคยเห็นค่อนข้างมากรหัส OO มีความสุขในธรรมดาเก่าซีใช่มันเป็นความเจ็บปวดทั้งหมดกำหนดตารางวิธีเสมือนโดยมือ แต่ภาษาอย่างชัดเจนจะช่วยให้มัน
Jan Hudec

4

การบังคับให้ทุกอย่างเป็นส่วนหนึ่งของคลาสไม่จำเป็นต้องให้รหัส OO ที่ยอดเยี่ยม

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

Java มีคำสั่งเปลี่ยน ฉันเห็นswitch( type ) { case typeA: bundles_of_code; break; case typeB: bundles_of_other_code; break }ฯลฯ ทั้งในรหัส C ++ และ Java

C ++ รองรับแนวคิด OO มากมาย แต่มาตรฐานนั้นไม่ได้กำหนดไว้ แต่ฉันคิดว่ามากขึ้นอยู่กับวัตถุประสงค์ของคุณ

ความหมาย "ไม่ดี" หลักใน C ++ อนุญาตให้สร้างคลาสของการคัดลอกโดยที่วัตถุส่งผ่านไปยังอีกคลาสหนึ่ง คุณสามารถปิดใช้งานสิ่งนี้ แต่คุณไม่สามารถส่งคืนได้จากฟังก์ชั่น โชคดีที่มีการแก้ไขใน C ++ 0x


3

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

C ++ ทำงานได้ดีที่สุดด้วยการผสมผสานของสิ่งต่าง ๆ ; สิ่งนี้ไม่น่าแปลกใจเนื่องจากเป็นสิ่งที่ดีที่สุดทำงานได้ดีที่สุด บ่อยครั้งที่ OOP เป็นเครื่องมือที่มีประโยชน์มาก


2

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


2

แม้ว่าฉันจะไม่เห็นด้วยกับความรู้สึกมันเป็นความจริงที่ว่าระบบของ C ++ นั้นไม่ได้เป็น OOP ที่บริสุทธิ์ - ไม่ใช่ "ทุกอย่างเป็นวัตถุ" ตัวเลข (โดยเฉพาะ) ไม่สามารถขยายได้อย่างรวดเร็วเท่าที่จะทำได้พูด Smalltalk คุณไม่สามารถนิยามความหมายของ "2 + 2" ได้อีกครั้ง (แม้ว่าคุณจะสามารถนิยามความหมายของ "สอง + สอง" ได้)

แต่สิ่งที่คนส่วนใหญ่อาจหมายถึงคือคนจำนวนมากเขียนโค้ดที่ไม่ใช่เชิงวัตถุใน C ++ แต่เชื่อว่าเพราะพวกเขาใช้ภาษา "OOP" พวกเขาจึงเป็นแบบเชิงวัตถุ ที่ไม่เป็นความจริง. แต่ในความคิดของฉันคุณสามารถเขียนโค้ดบังคับที่น่าเกลียดใน Smalltalk และไม่ได้เหนือกว่าการออกแบบ OOP ที่เหมาะสมใน C ++


1

คำคัดค้านที่ถูกต้องสมบูรณ์ของ Alan Kay ในภาษา C ++ คือภาษามาโครอยู่เหนือ C

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

เพื่อบอกว่าการส่งข้อความไม่มีอยู่ใน C ++ นั้นไม่ถูกต้องสิ่งที่ถูกต้องมากกว่าคือการส่งผ่านข้อความเป็นส่วนสำคัญของภาษาอื่นเช่น smalltalk และ Java เพราะภาษาไม่ประมวลผลการสร้างจากต่างประเทศและการกราฟบน C โดยตรง

นี่เป็นข้อโต้แย้งด้านการออกแบบภาษาที่มีความหมายสูงซึ่งฉันคิดว่าอยู่ไกลเกินกว่าระดับประสบการณ์ของผู้ถาม

ที่ถูกกล่าวว่ามีหลายพันเหตุผลที่จะเกลียด C ++ และเหตุผลน้อยมากที่จะรักมัน

แทนที่จะมองหาค้อนที่สมบูรณ์แบบและเล็บที่สมบูรณ์แบบค้นหาบ้านที่สมบูรณ์แบบเพื่อสร้างและหาเครื่องมือที่เหมาะสม ... ที่ต้องอาศัยประสบการณ์

สิ่งสำคัญที่ต้องจำไว้คือในการเขียนโปรแกรมระบบสิ่งที่ Alan Kay กลัวไม่ใช่ "pure OOP" นั้นเป็นจุดแข็งของ C ++ ให้แต่ละคน ...


1
Objective C เริ่มต้นเป็นภาษาแมโครด้านบนของ C แต่เป็นภาษาเชิงวัตถุ
Jan Hudec

1

ในมุมมองของฉันมันไม่ได้เป็นปัญหาที่ชัดเจนมากเท่าปัญหาการใช้งาน

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

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

มันเป็นประโยชน์อย่างมากสำหรับผู้ปฏิบัติงานเพื่อทำความคุ้นเคยกับระบบ OO นอกเหนือจาก C ++ และด้วยคำจำกัดความ OO นอกเหนือจาก "encapsulation, inheritance, polymorphism" trinity ตีความในรูปแบบพิเศษที่อนุญาตให้ C ++ ถือเป็น "OO" ตัวอย่างเช่นการอ้างสิทธิ์ว่าสภาพแวดล้อมที่ไม่มีการตรวจสอบขอบเขตหรือการรวบรวมขยะไม่ใช่สภาพแวดล้อม OO ที่ฟังดูน่ากลัวสำหรับผู้ที่คุ้นเคยกับ C ++ แต่จากหลายมุมมองมันทำให้รู้สึกเป็นอย่างมาก หากใครสามารถเขียนทับวัตถุ "encapsulation" อยู่ที่ไหน หากการทิ้งวัตถุสามารถนำไปสู่การอ้างอิงที่ห้อยอยู่หรือการรั่วไหลของหน่วยความจำระบบ "object-oriented" เป็นอย่างไร ? แล้วความสามารถในการบอกว่าวัตถุชนิดใดตั้งอยู่ในสถานที่และเวลาที่กำหนด? คุณบอกว่าซอฟต์แวร์ใช้งานได้กับวัตถุ - พวกมันอยู่ที่ไหน? และหากไม่มีใครรู้ได้ว่าควรแก้ไขข้อบกพร่องของซอฟต์แวร์อย่างไร

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


-1 สำหรับการอ้างอิง FQA ในสิ่งที่ควรเป็นคำตอบที่จริงจัง FQA เป็นรังของการบิดเบือนความจริงครึ่งหนึ่งและความเข้าใจผิด
David Thornley

@DavidThornley มีการอ้างถึงการบิดเบือนครึ่งความจริงหรือความเข้าใจผิดหรือไม่?
อเล็กซ์ P

ที่ไหนสักแห่งในนั้น การอ้างสิทธิ์ว่าภาษา OO ต้องมีการตรวจสอบขอบเขต (บางครั้งสร้างขึ้นในคอนเทนเนอร์มาตรฐาน C ++ ต่อไป) และการรวบรวมขยะ (ตัวชี้สมาร์ทเป็นการรวบรวมขยะแบบดั้งเดิม) ถูกบังคับและไม่ตรงตามความเป็นจริง ประโยคเกี่ยวกับภาษาที่อนุญาตให้มีการอ้างอิงที่ห้อยอยู่ซึ่งไม่เป็นวัตถุนั้นชัดเจนพิสูจน์โดย Blatant Assertion ฉันงุนงงกับ "ความสามารถในการบอกชนิดของวัตถุ"; ชนิดของตัวชี้จะมอบให้กับวัตถุที่ไม่มีพฤติกรรมเสมือนจริงและ RTTI จัดการกับวัตถุที่มีพฤติกรรมเสมือน
David Thornley

@DavidThornley การอ้างสิทธิ์ของ FQA คือภาษา OO ที่มีประโยชน์ควรมีสิ่งเหล่านี้ - ซึ่งสอดคล้องกับคำถามที่ถูกถาม (C ++ "เหมาะสม" หรือไม่) ฉันคิดว่าคำกล่าวอ้างเกี่ยวกับคำจำกัดความของกระดูกเปลือยเปล่าไม่ได้ระบุว่า ... "ความสามารถในการบอก": พฤติกรรมข้อผิดพลาดทั่วไปในการเข้าถึงวัตถุที่ไม่ได้อยู่ที่นั่นจริงๆโดยทำตามตัวชี้ไปยังข้อมูลที่ไม่มีการเตรียมการ และโปรแกรมของคุณจะนำขยะนั้นไปใช้อย่างมีความสุขและตีความว่าเป็นข้อมูลจากนั้นติดตามตัวชี้ขยะไปยังข้อมูลขยะอื่น ๆ จนกว่าจะพบที่อยู่นอกขอบเขตหรือมีข้อผิดพลาดเกิดขึ้น
Alex P

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

-1

มีเหตุผลที่เกรแฮมลีมีผู้โหวตมากที่สุดที่นี่ เมื่อต้องการย้ำอีกครั้งดูเหมือนว่าคลาส C ++ ไม่ใช่วัตถุจริงๆในแง่ที่ว่ามันไม่ได้ส่งข้อความ ฉันคิดว่านี่เป็นสิ่งที่ทำให้ผู้คนเดินทางท่องเที่ยวได้อย่างมากมายเมื่อพวกเขาเรียนรู้ C ++ หรือ oop ผู้คนถูกบอกว่า object oriented คือ 'this' และจากนั้นบอกว่า C ++ ทำแตกต่างกัน C ++ ไม่เคยทำ OOP แตกต่างกัน หากคุณคิดว่าวิธีนี้คุณจะไม่เคยชื่นชมคลาส C ++ สำหรับสิ่งที่พวกเขามีความหมายและนั่นก็คือพวกเขาเป็นเพียงการปรับปรุงกระบวนทัศน์กระบวนงานโดยการรวมเอานามธรรมและพฤติกรรมแบบไดนามิก ดังนั้นคลาส C ++ นั้นเป็นกระบวนงานที่ให้ความสนุกสนานพวกเขาเพิ่งปรับปรุงกระบวนทัศน์กระบวนงานหรือแทนที่จะเป็นคลาส C ขั้นสูงขึ้น


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

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

1
ขอบคุณสำหรับลิงค์ แต่มันอธิบายเฉพาะความหมายของอลันเคย์ ยิ่งไปกว่านั้นฉันไม่เห็นด้วยว่าสมอลทอล์คมักจะถือว่าเป็นภาษา OO แรกและวิกิพีเดียก็เห็นด้วยกับฉันนั่นคือ Simula หนึ่งในสองภาษา Stroustrup รวมกันเป็น C กับคลาส ฉันสนใจในการอ้างสิทธิ์ของคุณว่าคลาส C ++ นั้นเป็นนามธรรมของการเขียนโปรแกรมขั้นตอนที่สูงกว่าเทมเพลตวัตถุ แต่ฉันยังไม่เข้าใจว่าทำไมคุณจึงคิดแบบนั้น
David Thornley

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

-1

Steve Yegge กล่าวว่าดีที่สุด :

C ++ เป็นภาษาที่งี่เง่าที่สุดในโลกในแง่ที่แท้จริงของการเป็นประโยคที่น้อยที่สุด ไม่รู้เกี่ยวกับตัวเอง

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


ภาษา C ++ เป็นภาษาที่มีความเข้าใจน้อยที่สุดในทางใด ภาษามีความหมายอย่างไร? ถ้าคุณหมายถึงว่ามันขาดความสามารถในการสะท้อนซึ่งเป็นเรื่องธรรมดาและแน่นอนว่าจะไม่เลือก C ++ จากฝูงชน
David Thornley

2
คุณบอกได้มั้ยว่าเขาพูดว่า "ดีที่สุด" ฉันไม่รู้ว่าการอ้างอิงแบบสุ่มนั้นหมายถึงอะไร
user16764

+1 ที่บอกว่าสิ่งนี้จะได้รับสะเก็ดระเบิดมากมายจาก C ++ basher bashers แต่ต้องบอกว่า - คุณไม่สามารถ OOP จริงๆได้โดยไม่ต้องไตร่ตรองเพราะคุณไม่มี generics ที่จะดูแลสิ่งต่าง ๆ ในแนวนอน ( แง่มุม) - วงจรชีวิต (การเปิดใช้งาน, การกำจัด), การจัดการข้อผิดพลาดทั่วไป, พร็อกซี่ทั่วไป, การทำให้เป็นอนุกรมทั่วไป, ความเท่าเทียมกันของงานทั่วไป - สิ่งเหล่านี้จบลงด้วยการทำให้รหัสของคุณสกปรก
vski

ขอบคุณ ฉันไม่อยากจะเชื่อเลยว่าฉันจะได้ -3 สำหรับการพูดว่าภาษาที่ไม่มีการสะท้อนกลับไม่ใช่ตัวอย่างที่ดีของ OOP
John Cromartie

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