OOP คืออะไร?


126

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

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

ในหลาย ๆ เรื่องสิ่งนี้ไม่ได้ทำให้ฉันประหลาดใจ โลกแห่งความเป็นจริงไม่ใช่ "OO" และความคิดนี้มีนัยใน OO - ที่เราสามารถจำลองสิ่งต่าง ๆ ด้วยอนุกรมวิธานของคลาส - ดูเหมือนว่าฉันจะมีข้อบกพร่องโดยพื้นฐานมาก (ฉันสามารถนั่งบนโต๊ะตอต้นไม้ฝากระโปรงรถ ตักของใครบางคน - แต่ไม่ใช่หนึ่งในนั้นคือเก้าอี้) แม้ว่าเราจะย้ายไปยังโดเมนที่เป็นนามธรรมมากขึ้น แต่การสร้างแบบจำลอง OO ก็มักจะยากไม่ตรงประเด็นและไม่เป็นประโยชน์ในที่สุด (ลองดูตัวอย่างวงกลม / จุดไข่ปลาหรือสี่เหลี่ยม / สี่เหลี่ยมผืนผ้า)

แล้วฉันพลาดอะไรไปที่นี่? มูลค่าของ OOP อยู่ที่ไหนและทำไมเวลาและเงินทั้งหมดถึงล้มเหลวในการทำให้ซอฟต์แวร์ดีขึ้น?


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

38
ไม่ว่าเธรดเดียวกันนี้จะเริ่มต้นกี่ครั้งก็มักจะได้รับความสนใจเป็นอย่างมาก (แม้ว่าจะมีการทำซ้ำที่นี่) และแน่นอนคำตอบที่เลือกมักจะเห็นด้วยกับความเห็นเริ่มต้นของผู้ถามเสมอ
TM.

4
ปัญหาเกี่ยวกับ OOP คือความล้มเหลวในการวางไว้ในบริบท เหมาะสำหรับวัตถุประสงค์บางอย่างไม่ใช่ทุกวัตถุประสงค์ เป็นเครื่องมือที่ยอดเยี่ยม เป็นข่าวประเสริฐที่มีหมัด
Mike Dunlavey

16
ฉันขอโทษ แต่ฉันไม่สามารถสั่นคลอนความรู้สึกที่คุณไม่เคยตั้งโปรแกรมโดยใช้ภาษาใด ๆ นี่คือเหตุผล: OOP เป็นฐานของการดำเนินการสำหรับไลบรารีคอมโพเนนต์ฐานในสภาพแวดล้อมสมัยใหม่ทั้งหมด (Java, .NET, Python, Ruby - เพียงเพื่อตั้งชื่อสตรีมหลักสองสามรายการ) ไลบรารีฐานทั้งหมดเหล่านั้นถูกนำมาใช้ซ้ำทุกวันดังนั้นหากไม่นับว่าฉันไม่รู้ว่าจะทำอย่างไร ดังนั้นอย่าเข้าใจฉันผิดที่นี่ แต่ใช้รหัสซ้ำถ้าเป็นความจริง - และเป็นเรื่องธรรมดามาก! ฉันไม่ต้องการให้เรื่องนี้ฟังดูไม่เหมาะสม แต่อย่างใด - แค่ชี้ให้เห็นที่นี่
Matthias Hryniszak

2
@ George Jempty: เป็น Joel Spolsky ใน "How Microsoft แพ้สงคราม API" ( joelonsoftware.com/articles/APIWar.html ) บรรทัดแรกของข้อความคือ "การส่งอัตโนมัติชนะวัน"
GodsBoss

คำตอบ:


24

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

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

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

ซึ่งมาจาก "On the Usability of OO Representations" จาก Communications of the ACM ต.ค. 2543 บทความส่วนใหญ่เปรียบเทียบ OO กับแนวทางที่มุ่งเน้นกระบวนการ มีการศึกษามากมายว่าคนที่ทำงานด้วยวิธี OO "คิด" (Int. J. of Human-Computer Studies 2001, issue 54, or Human-Computer Interaction 1995, vol. 10 มีเนื้อหาเกี่ยวกับการศึกษา OO ทั้งหมด) และจากสิ่งที่ฉันอ่านไม่มีอะไรที่บ่งบอกถึงความเป็นธรรมชาติบางอย่างกับแนวทาง OO ที่ทำให้มันเหมาะสมกว่าวิธีการดำเนินการแบบเดิม ๆ


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

6
@melaos: สรุปอยู่ตรงกลาง OOP เป็นเครื่องมือหนึ่งในชุดเครื่องมือไม่ใช่เครื่องมือเดียวและไม่มีสิ่งใดทดแทนการฝึกอบรมประสบการณ์และการตัดสิน
Mike Dunlavey

44
ฉันคิดว่ามันน่าขบขันเมื่อมีคนโพสต์ "คำถาม" เพื่อโต้แย้งประเด็นหนึ่งแล้วยอมรับคำตอบแรกที่สนับสนุนประเด็นของเขาแม้ว่าจะมีคำถามที่ได้คะแนนสูงกว่าสนับสนุนสิ่งที่ตรงกันข้ามก็ตาม ธรรมชาติของมนุษย์นั้นเจ๋ง
Bill K

3
@melaos บทสรุป (อย่างน้อยบทความเหล่านั้น) ก็คือไม่มีอะไรแนะนำให้ OO เป็นวิธีคิดที่เป็นธรรมชาติสำหรับผู้คนและด้วยเหตุนี้จึงไม่เหนือกว่าวิธีอื่นใดที่อาจสร้างโปรแกรมได้
Svend

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

119

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

แม้ว่าสิ่งนี้จะเป็นความจริงและถูกสังเกตโดยคนอื่น ๆ (รับ Stepanov ผู้ประดิษฐ์ STL) ส่วนที่เหลือเป็นเรื่องไร้สาระ OOP อาจมีข้อบกพร่องและแน่นอนว่าไม่ใช่กระสุนเงิน แต่ทำให้การใช้งานขนาดใหญ่ง่ายขึ้นมากเพราะเป็นวิธีที่ดีในการลดการพึ่งพา แน่นอนว่านี่เป็นเรื่องจริงสำหรับการออกแบบ OOP ที่“ ดี” เท่านั้น การออกแบบที่เลอะเทอะจะไม่ให้ประโยชน์ใด ๆ แต่ที่ดีการออกแบบที่แยกส่วนสามารถจำลองได้ดีมากโดยใช้ OOP และใช้เทคนิคอื่น ๆ ได้ไม่ดี

มีโมเดลที่เป็นสากลและดีกว่ามาก (แบบจำลองประเภทของ Haskellอยู่ในใจ) แต่สิ่งเหล่านี้มักจะซับซ้อนกว่าและ / หรือยากที่จะนำไปใช้อย่างมีประสิทธิภาพ OOP เป็นการแลกเปลี่ยนที่ดีระหว่างสุดขั้ว


10
ฉันคิดว่ามันน่าสนใจที่มีคะแนนโหวตมากกว่าคำถามและคำตอบที่ได้รับอนุมัติรวมกัน
Brad Gilbert

15
ฉันพบว่าระบบประเภทของ Haskell ใช้งานง่ายกว่า OO มาก
axblount

4
@Konrad: "แต่มันทำให้การใช้งานขนาดใหญ่ง่ายขึ้นมาก" - อืมฉันไม่แน่ใจว่าเป็นเรื่องจริง ทำให้ดูแลรักษาได้ง่ายขึ้นในแง่ที่ว่า chnaging สิ่งหนึ่งไม่ควรทำลายอีกสิ่งหนึ่ง แต่ง่ายกว่า? นั่นเป็นเรื่องยากที่จะกลืน ...
Mitch Wheat

2
@BradGilbert: แน่นอนว่าผู้ถามเลือกคำตอบที่สอดคล้องกับความคิดเห็นในคำถามเริ่มต้นของเขา ซึ่งทำให้เกิดคำถามทำไมต้องถามคำถามถ้าคุณได้ตัดสินใจในคำตอบของคุณแล้ว?
TM.

2
@ มิทช์: ฉันจะไปไกลถึงการอ้างว่าคุณไม่สามารถ (ณ วันนี้) เขียนแอปพลิเคชันขนาดใหญ่โดยไม่มีการวางแนววัตถุบางประเภท ขนาดใหญ่นี่คือ> 1M LOC
Konrad Rudolph

45

OOP ไม่ได้เกี่ยวกับการสร้างคลาสที่ใช้ซ้ำได้ แต่เป็นการสร้างคลาสที่ใช้งานได้


7
ทำได้ดีนี่! และเป็นจริง
Toon Krijthe

1
พอใช้. แต่มันก็ไม่ได้ช่วยแก้ปัญหา "การสร้างวงล้อใหม่" ซึ่งเป็นปัญหาที่ร้ายแรงในการพัฒนาซอฟต์แวร์แทนที่จะมีไลบรารีเดียวที่มีดวงตา N คู่มองหาข้อบกพร่องเรามี N ไลบรารีที่มีตาคู่หนึ่งทำ ดังนั้น. มีคลาสที่ใช้งานได้มากมายที่คุณสามารถสร้างได้ก่อนที่คุณจะต้องเริ่มใช้ซ้ำ และ OOP ในความเห็นที่มีการศึกษาของฉันมีข้อบกพร่องโดยพื้นฐานในพื้นที่นั้น - การใช้รหัสซ้ำ มันซ่อนข้อมูลและ "แต่งงาน" กับวิธีการทำให้ข้อมูลดังกล่าวไม่สามารถเข้าถึงได้อย่างมีประสิทธิภาพ
AMN

42

บ่อยครั้งที่คลาสนี้ใช้สำหรับน้ำตาลที่เป็นประโยคเท่านั้น มันทำให้ฟังก์ชันสำหรับประเภทเรกคอร์ดเป็นเนมสเปซเล็ก ๆ ของตัวเอง

ใช่ฉันพบว่าสิ่งนี้แพร่หลายเกินไปเช่นกัน นี่ไม่ใช่การเขียนโปรแกรมเชิงวัตถุ เป็นการเขียนโปรแกรมตามวัตถุและการเขียนโปรแกรมโดยใช้ข้อมูลเป็นศูนย์กลาง ใน 10 ปีของการทำงานกับ OO Languages ​​ฉันเห็นคนส่วนใหญ่ทำ Object Based Programming OBP แบ่ง IMHO ออกอย่างรวดเร็วเนื่องจากคุณได้รับสิ่งที่เลวร้ายที่สุดจากทั้งสองคำ: 1) การเขียนโปรแกรมขั้นตอนโดยไม่ยึดติดกับวิธีการเขียนโปรแกรมแบบมีโครงสร้างที่พิสูจน์แล้วและ 2) OOP โดยไม่ยึดติดกับวิธีการ OOP ที่พิสูจน์แล้ว

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

นักพัฒนาส่วนใหญ่ที่ทำงานในภาษา OOP กำลังใช้ตัวอย่างของ OOP ที่ทำถูกต้องในกรอบและประเภทที่พวกเขาใช้วันต่อวัน แต่พวกเขาไม่รู้ นี่คือตัวอย่างง่ายๆบางส่วน: ADO.NET, Hibernate / NHibernate, Logging Frameworks, ประเภทคอลเลกชันภาษาต่างๆ, ASP.NET stack, The JSP stack เป็นต้นสิ่งเหล่านี้ล้วนต้องพึ่งพา OOP อย่างมากใน codebases


32

การใช้ซ้ำไม่ควรเป็นเป้าหมายของ OOP - หรือกระบวนทัศน์อื่น ๆ สำหรับเรื่องนั้น

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

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

เมื่อใช้สิ่งนี้ฉันแน่ใจว่าคุณจะเห็นด้วยช่วยให้เราสร้างและดูแลระบบที่ซับซ้อนอย่างมาก มีคุณค่ามากมายในนั้นและไม่ใช่เรื่องง่ายที่จะทำในกระบวนทัศน์อื่น ๆ


3
จริงเกี่ยวกับการใช้ซ้ำและ OO เป็นข้อกังวลที่แยกจากกัน
Dan Rosenstark

28

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

ฉันนึกถึงห้องสมุดหลายสิบแห่งที่สามารถนำกลับมาใช้ใหม่ได้อย่างสวยงามและช่วยประหยัดเวลาและเงินที่ไม่สามารถคำนวณได้

แต่ในกรณีที่ OOP เสียเวลาฉันจะบอกว่าเป็นเพราะขาดการฝึกอบรมโปรแกรมเมอร์ประกอบกับช่วงการเรียนรู้ที่สูงชันของการเรียนรู้การทำแผนที่ OOP เฉพาะภาษา บางคน "ได้รับ" OOP และคนอื่น ๆ จะไม่ทำ


2
ฉันเพิ่งให้คะแนนโหวตที่ทำให้คุณสูงกว่า 2,000 คะแนนหวังว่ามันจะติด : P
Jason Bunting

5
เป็นเรื่องยากที่จะเห็น OOP ได้รับการสอนอย่างมีประสิทธิภาพ
Jon W

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

21

ฉันคิดว่าการใช้อ็อบเจ็กต์บริบททึบแสง (HANDLEs ใน Win32, FILE * s ใน C เพื่อตั้งชื่อสองตัวอย่างที่รู้จักกันดี - hell, HANDLEs อาศัยอยู่อีกด้านหนึ่งของอุปสรรคโหมดเคอร์เนลและมันไม่ได้รับ มีการห่อหุ้มมากกว่านั้นมาก) พบได้ในรหัสขั้นตอนด้วยเช่นกัน ฉันกำลังดิ้นรนเพื่อดูว่านี่เป็นสิ่งเฉพาะสำหรับ OOP อย่างไร

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

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


1
ฉันกำลังจะโพสต์สิ่งที่คล้ายกันมาก
Brad Gilbert

ฉันยอมรับว่าคุณสามารถใช้แนวคิด OOP ได้โดยไม่ต้องใช้ไวยากรณ์พิเศษ แต่ในทางกลับกันฉันไม่คิดว่า WinAPI เป็นตัวอย่างที่ดีของแนวคิด OOP
Lena Schimmel

14

มันเป็นกระบวนทัศน์ในการเขียนโปรแกรม .. ออกแบบมาเพื่อให้มนุษย์เราสามารถแบ่งปัญหาออกเป็นชิ้นเล็ก ๆ และใช้การได้ง่ายขึ้น ..

ถ้าคุณไม่พบว่ามันมีประโยชน์ .. อย่าใช้มันอย่าจ่ายเงินเพื่อการฝึกอบรม

ในทางกลับกันฉันพบว่ามันมีประโยชน์ดังนั้นฉันจะ :)


14

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

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

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


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

"ความคิดของคลาสที่แยกอินเทอร์เฟซออกจากการนำไปใช้งาน" --- ฉันคิดว่าอินเทอร์เฟซเป็นอินเทอร์เฟซและคลาสเป็นการใช้งาน? บางทีฉันอาจจะเป็นแค่นักคิดที่เน้นกระบวนการมากเกินไป แต่ฉันคิดว่ามันเป็นความหลากหลายของรหัสที่มีความสม่ำเสมอในการใช้งานนั่นคือตัวกระตุ้นของ OOP ฉันคิดว่า "ฟังก์ชัน C จำนวนมาก" แยกอินเทอร์เฟซออกจากการใช้งานเช่นเดียวกับ "คลาสจาวา" บางทีฉันผิดทั้งหมด?
Jonas Kölker

2
@Jonas - สำหรับ "ฟังก์ชัน C มากมาย" ของคุณ --- ฉันยอมรับว่าพวกเขาสามารถแยกอินเทอร์เฟซออกจากการนำไปใช้งานได้และ ณ จุดนั้นก็เริ่มเป็น OOP หากตัวอย่างยังคงกำหนดโครงสร้าง C ที่ API ทำงานอยู่แสดงว่าคุณได้สร้างการห่อหุ้มโดยพื้นฐานแล้ว (โดยเฉพาะอย่างยิ่งถ้า API ทำงานบนโครงสร้างอย่างเหมาะสม) ... จากนั้นก็เป็น OOP ใน C
Tall Jeff

12

ปัญหาของ OOP คือการขายเกินขนาด

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

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

ตอนนี้พวกเขาเหมือนไม้ลอยหลังจากความคิดดีๆอื่น ๆ ถูกขายไปมากเกินไปเช่นการเขียนโปรแกรมเชิงฟังก์ชัน

แล้วฉันจะทำอะไรที่แตกต่างออกไป? มากมายและฉันเขียนหนังสือเกี่ยวกับเรื่องนี้ (พิมพ์หมด - ฉันไม่ได้เงินสักบาท แต่คุณยังสามารถรับสำเนาได้) Amazon

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

ซึ่งแตกต่างกันมากและเป็นไปตามทฤษฎีข้อมูล (ในระดับที่ใคร ๆ ก็เข้าใจได้) กล่าวว่าการเขียนโปรแกรมสามารถมองว่าเป็นกระบวนการในการกำหนดภาษาและทักษะในการทำเช่นนั้นเป็นสิ่งจำเป็นสำหรับการเขียนโปรแกรมที่ดี

เป็นการยกระดับแนวคิดของภาษาเฉพาะโดเมน (DSL) เห็นด้วยอย่างชัดเจนกับดราย (อย่าพูดซ้ำตัวเอง) ยกนิ้วให้กับการสร้างรหัส ส่งผลให้ซอฟต์แวร์มีโครงสร้างข้อมูลจำนวนมากน้อยกว่าปกติสำหรับแอปพลิเคชันสมัยใหม่

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


เย็น. เนื่องจากหนังสือไม่มีการพิมพ์คุณจึงไม่ต้องการให้ PDF ใช่ไหม Amazon ส่งช้าไปอาร์เจนตินา ...
Dan Rosenstark

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

@ Daniel: ข้อเสนอแนะที่ดี ฉันจะแก้ไขและดูว่าสามารถแนบไปกับบล็อกสปอตได้หรือไม่ คุณจะพบว่ามันดูล้าสมัยไปหน่อยเพราะมันเป็นปี 94 แต่หลักการไม่ได้เปลี่ยนไป
Mike Dunlavey

1
@ Mike Dunlavey ท่านที่รักฉันขอสนับสนุนความอยากรู้อยากเห็นของ @yar ได้หรือไม่ว่าจะมีโอกาสอ่าน / ซื้อหนังสือของคุณผ่านทางอินเทอร์เน็ต [อย่างน้อยบางส่วน] หรือไม่? เนื่องจากดูเหมือนว่าวิธีการของซอฟต์แวร์ [ส่วนประกอบ] ที่มีประสิทธิภาพข้อกำหนด / การนำไปใช้งานที่คุณเสนอ / พัฒนานั้นตรงกับข้อตกลงที่ [ฉันเพิ่งรู้จัก] ฉันจึงต้องการเรียนรู้หรือได้รับการสอน (ซึ่งตรงข้ามกับวิธี 'ขนส่งสินค้า' ที่แนะนำโดยดี เขียน แต่หนังสือ OO หลักที่คลุมเครืออย่างเจ็บปวด) ขอบคุณล่วงหน้า [และเสียงเชียร์จากรัสเซีย :)]
mlvljr

1
@mlvljr: ตกลง วิธีที่เร็วที่สุดคือสแกนและสร้างไฟล์ pdf ขนาดใหญ่ ฉันจะดูว่าฉันจะไปได้ในอีกไม่กี่วันข้างหน้า อย่าปล่อยให้ฉันลืม [ขอแสดงความเสียใจอย่างจริงใจต่อเหตุการณ์ที่เกิดขึ้นล่าสุดในมอสโกวและเสียงเชียร์จากแมสซาชูเซตส์ที่เปียกโชก]
Mike Dunlavey

11

จัดการ (และ WinAPI ที่เหลือ) คือ OOP!

พวกเขาเป็นอย่างไร พวกเขาไม่สามารถสืบทอดได้พวกเขาไม่สามารถทดแทนได้อย่างแน่นอนพวกเขาขาดคลาสที่กำหนดไว้อย่างดี ... ฉันคิดว่าพวกเขาขาด "OOP" ไปไกล

คุณเคยสร้างหน้าต่างโดยใช้ WinAPI หรือไม่? จากนั้นคุณควรรู้ว่าคุณกำหนดคลาส ( RegisterClass) สร้างอินสแตนซ์ของมัน ( CreateWindow) เรียกใช้เมธอดเสมือน ( WndProc) และเมธอดเบสคลาส ( DefWindowProc) เป็นต้น WinAPI ยังใช้ระบบการตั้งชื่อจาก SmallTalk OOP โดยเรียกวิธีการว่า "ข้อความ" (Window Messages)

แฮนเดิลอาจไม่สามารถสืบทอดได้ แต่มีfinalใน Java พวกเขาไม่ได้ขาดระดับที่พวกเขามีตัวยึดสำหรับชั้นเรียน: นั่นคือสิ่งที่คำว่า“จับ” หมายถึง เมื่อดูที่สถาปัตยกรรมเช่น MFC หรือ. NET WinForms จะเห็นได้ชัดทันทีว่ายกเว้นไวยากรณ์ไม่มีอะไรแตกต่างจาก WinAPI มากนัก


WINAPI ไม่ใช่ OOP มันแสดงวิธีการเขียนโค้ดขั้นตอนที่ขยายได้ เทคนิคดีๆก็ดีไม่ว่าจะ OOP หรือไม่ก็ตาม ฉันสามารถเขียนโปรแกรม WINAPI ด้วยภาษา C และใช้เทคนิคเดียวกันนี้ในโค้ดของฉันเองดังนั้นฉันจึงเดาว่า C คือ OOP
bruceatk

3
มันอาจไม่ใช่สิ่งที่ Alan Kay คิดไว้ (google it!) แต่มันก็ไม่ใช่ OOP
Konrad Rudolph

11

ใช่ OOP ไม่สามารถแก้ปัญหาของเราได้ทั้งหมดขออภัยด้วย อย่างไรก็ตามเรากำลังดำเนินการกับ SOA ซึ่งจะแก้ไขปัญหาเหล่านั้นทั้งหมด


4
คุณไม่ได้ยินเหรอ? SOA คืออดีต วันนี้ระบบคลาวด์คอมพิวติ้งจะเป็นผู้กอบกู้ของเรา
DrPizza

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

ฉันคิดว่านี่เป็นเรื่องน่าขันและฉันจะไม่ลงคะแนน แต่ฉันจะไม่โหวตด้วย! :-)
Yarik

คำถามนี้ค่อนข้างมีวาทศิลป์ดังนั้นนี่จึงเป็นคำตอบที่ถูกต้อง (และเป็นคำตอบที่ดีที่สุด)
Jeff Davis

10

OOP ช่วยให้สามารถเขียนโปรแกรมโครงสร้างคอมพิวเตอร์ภายในเช่น "วิดเจ็ต" GUI ได้โดยที่ตัวอย่างเช่น SelectList และ TextBox อาจเป็นประเภทย่อยของ Item ซึ่งมีวิธีการทั่วไปเช่น "move" และ "resize"

ปัญหาคือ 90% ของเราทำงานในโลกของธุรกิจที่เราทำงานกับแนวคิดทางธุรกิจเช่นใบแจ้งหนี้พนักงานงานการสั่งซื้อ สิ่งเหล่านี้ไม่สามารถให้ OOP ยืมตัวเองได้ดีนักเนื่องจาก "วัตถุ" มีความคลุมเครือมากกว่าอาจมีการเปลี่ยนแปลงได้ตามการปรับโครงสร้างทางธุรกิจเป็นต้น

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


นั่นเป็นความจริงทั้งหมด แต่ ... บางทีความจริงที่ว่า OOP สามารถลดความซับซ้อนของแอปพลิเคชันที่ไม่เกี่ยวข้องกับธุรกิจบางส่วน (เช่นการใช้งาน UI) เป็นหนึ่งในสาเหตุหลักที่ทำให้นักพัฒนา (ในที่สุด!) สามารถใช้เวลาในการทำงานธุรกิจได้มากขึ้น - ด้านที่เกี่ยวข้อง?
Yarik

10

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

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

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

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


1
ฉันไม่เคยบรรลุขั้นตอนความสุขที่แท้จริงหรือ OOP ในขณะที่อ่านรหัส :)
bruceatk

1
ความสุขที่แท้จริงไม่ แต่ยิ้มเล็กน้อยบางที?
Dan Rosenstark

9

บางทีฝากระโปรงตักหรือต้นไม้อาจไม่ใช่เก้าอี้ แต่ทั้งหมดนี้สามารถทำได้


2
คุณไม่เคยต้องใช้ภาษา OO โดยไม่มีอินเทอร์เฟซใช่หรือไม่? คุณโชคดี.
finnw

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

8

ฉันคิดว่าสิ่งเหล่านั้นในโลกแห่งความเป็นจริงคือวัตถุ

คุณทำ?

ใบแจ้งหนี้มีวิธีการใดบ้าง? โอ้เดี๋ยวก่อน มันจ่ายเองไม่ได้ส่งเองเทียบของที่แม่ค้าส่งจริงไม่ได้ มันไม่มีวิธีการใด ๆ เลย มันเฉื่อยและใช้งานไม่ได้โดยสิ้นเชิง เป็นประเภทระเบียน (โครงสร้างถ้าคุณต้องการ) ไม่ใช่วัตถุ

ในทำนองเดียวกันสิ่งอื่น ๆ ที่คุณพูดถึง

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


2
ใช้เครื่องจักรอุปกรณ์อิเล็กทรอนิกส์หรือสิ่งมีชีวิตใด ๆ สิ่งเหล่านี้ล้วนเป็น "ข้อต่อของสถานะและพฤติกรรม"
TM.

1
ฉันยอมรับว่าวิธีการเช่น Send () หรือ Pay () นั้น "ผิดปกติ" สำหรับใบแจ้งหนี้ แต่ตัวอย่างเช่นจำนวนเงินรวมเป็นแอตทริบิวต์ที่ได้รับ แต่อยู่ในใบแจ้งหนี้ล่ะ นี่ไม่ใช่ตัวอย่างของสิ่งที่ OOP ช่วยในการสร้างแบบจำลองในลักษณะที่ "เป็นธรรมชาติ" แม้แต่กับเอนทิตีในชีวิตจริงที่เฉื่อยโดยสิ้นเชิงหรือไม่? ไม่ใช่ความสำเร็จที่ยิ่งใหญ่ด้วยตัวมันเอง แต่ก็ยัง ...
Yarik

@Yarik: เอนทิตี "เฉื่อย" เหล่านี้นำไปสู่การออกแบบตามวัตถุ สำหรับฉัน OO ที่เหมาะสมเพียงอย่างเดียวคือการจำลองซึ่งวัตถุ"สามารถกระทำตามความสอดคล้องของตัวเอง"ดังที่คำตอบนี้ระบุ ถ้า OO เป็นวิธีเดียวที่จะทำบางสิ่งให้สำเร็จก็ดี แต่อย่างอื่นเราไม่สามารถยึดติดกับสิ่งที่ง่ายกว่าและมากกว่าเช่นปัญหาที่กำลังแก้ไขได้หรือไม่?

7

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

ฉันคิดว่าจุดที่ OO แยกย่อยคือเมื่อผู้คนสร้างมรดกชั้นสูงที่ซ้อนกันอย่างลึกซึ้ง สิ่งนี้สามารถนำไปสู่ความซับซ้อน อย่างไรก็ตามการแยกความคิดสุดท้ายออกเป็นชั้นพื้นฐานจากนั้นการนำกลับมาใช้ใหม่ในชั้นเรียนอื่น ๆ เป็นสิ่งที่สง่างามอย่างยิ่ง IMHO!


7

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

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

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

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

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


ฉันชอบย่อหน้าสุดท้ายของคุณที่สุด
Mike Dunlavey

6

@Sean

อย่างไรก็ตามการแยกความคิดสุดท้ายออกเป็นชั้นพื้นฐานจากนั้นการนำกลับมาใช้ใหม่ในชั้นเรียนอื่น ๆ เป็นสิ่งที่สง่างามอย่างยิ่ง IMHO!

แต่นักพัฒนา "ขั้นตอน" ก็ทำเช่นนั้นมานานหลายทศวรรษแล้ว ไวยากรณ์และคำศัพท์อาจแตกต่างกัน แต่ผลกระทบจะเหมือนกัน OOP มีอะไรมากกว่า "การนำฟังก์ชันทั่วไปมาใช้ซ้ำในคลาสพื้นฐาน" และฉันอาจจะบอกได้ว่านั่นยากที่จะอธิบายว่าเป็น OOP เลยก็ได้ การเรียกใช้ฟังก์ชันเดียวกันจากรหัสที่ต่างกันเป็นเทคนิคที่เก่าพอ ๆ กับขั้นตอนย่อยเอง


6

@Konrad

OOP อาจมีข้อบกพร่องและแน่นอนว่าไม่ใช่กระสุนเงิน แต่ทำให้การใช้งานขนาดใหญ่ง่ายขึ้นมากเพราะเป็นวิธีที่ดีในการลดการพึ่งพา

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


6

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

ไม่จำเป็นว่าใบแจ้งหนี้จะไม่ใช่ "ออบเจ็กต์" จริงๆที่มีฟังก์ชันที่สามารถดำเนินการได้เองอินสแตนซ์ออบเจ็กต์สามารถมีอยู่เพื่อทำหน้าที่กับข้อมูลโดยไม่ต้องรู้ว่ามีข้อมูลประเภทใดอยู่จริง ฟังก์ชัน "invoice.toJson ()" สามารถเรียกได้สำเร็จโดยไม่ต้องรู้ว่า "ใบแจ้งหนี้" คือข้อมูลประเภทใด - ผลลัพธ์จะเป็น Json ไม่ว่าจะมาจากฐานข้อมูล XML CSV หรือแม้แต่ออบเจ็กต์ JSON อื่นก็ตาม . ด้วยฟังก์ชันขั้นตอนคุณจะต้องรู้ข้อมูลของคุณมากขึ้นในทันทีและท้ายที่สุดด้วยฟังก์ชันเช่น "xmlToJson ()", "csvToJson ()", "dbToJson ()" ฯลฯ ในที่สุดมันก็กลายเป็นความยุ่งเหยิงโดยสมบูรณ์และ ปวดหัวอย่างมากหากคุณเคยเปลี่ยนประเภทข้อมูลพื้นฐาน

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

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


5

@CodingTheWheel

แต่ในกรณีที่ OOP เสียเวลาฉันจะบอกว่าเป็นเพราะขาดการฝึกอบรมโปรแกรมเมอร์ประกอบกับช่วงการเรียนรู้ที่สูงชันของการเรียนรู้การทำแผนที่ OOP เฉพาะภาษา บางคน "ได้รับ" OOP และคนอื่น ๆ จะไม่ทำ

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

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


"การฝึกอบรมที่เหมาะสม" ต้องมีความยาวเป็นนามธรรมและซับซ้อนในปัจจุบัน ฉันรู้: ฉันสอนการเขียนโปรแกรม ทศวรรษที่ผ่านมาหลายคนสามารถเรียนรู้การเขียนโปรแกรมบางประเภทได้ ผมคิดว่าไม่จริงอีกต่อไป

5

@ Jeff

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

ซึ่งมีการใช้งานที่ซ่อนอยู่มากกว่า: iostreams ของ C ++ หรือ FILE * s ของ C?

ฉันคิดว่าการใช้อ็อบเจ็กต์บริบททึบแสง (HANDLEs ใน Win32, FILE * s ใน C เพื่อตั้งชื่อสองตัวอย่างที่รู้จักกันดี - hell, HANDLEs อาศัยอยู่อีกด้านหนึ่งของอุปสรรคโหมดเคอร์เนลและมันไม่ได้รับ มีการห่อหุ้มมากกว่านั้นมาก) พบได้ในรหัสขั้นตอนด้วยเช่นกัน ฉันกำลังดิ้นรนเพื่อดูว่านี่เป็นสิ่งเฉพาะสำหรับ OOP อย่างไร

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


5

ในบล็อก dev เดียวที่ฉันอ่านโดย Joel-On-Software-Founder-of-SO คนนั้นฉันอ่านมานานแล้วว่า OO ไม่ได้นำไปสู่การเพิ่มผลผลิต การจัดการหน่วยความจำอัตโนมัติทำได้ เย็น. ใครสามารถปฏิเสธข้อมูลได้

ฉันยังเชื่อว่า OO นั้นไม่ใช่ OO การเขียนโปรแกรมด้วยฟังก์ชันคือการเขียนโปรแกรมทุกอย่างแบบอินไลน์

(และฉันควรรู้เมื่อฉันเริ่มต้นด้วย GWBasic) เมื่อคุณ refactor โค้ดเพื่อใช้ฟังก์ชันvariable2654จะกลายเป็นvariable3เมธอดที่คุณใช้อยู่หรือยังดีกว่ามันมีชื่อที่คุณสามารถเข้าใจได้และถ้าฟังก์ชันนั้นสั้น ,ก็เรียกว่าvalue และที่เพียงพอสำหรับความเข้าใจอย่างเต็มรูปแบบ

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

เมื่อคุณ refactor รหัสอย่างแท้จริง OO, b, c, qและZกลายเป็นthis, this, และthis thisและเนื่องจากฉันไม่เชื่อในการใช้thisคีย์เวิร์ดคุณจึงต้องลบไมล์ของรหัส thisที่จริงคุณจะได้รับที่จะทำแม้ว่าคุณจะใช้



ฉันไม่คิดว่า OO เป็นอุปมาตามธรรมชาติ

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

ตัวอย่างเช่นเมื่อคุณทำระบบการจองสายการบินสิ่งที่คุณเรียกว่าการจองอาจไม่ตรงกับการจองทางกฎหมาย / ธุรกิจเลย



แนวคิดพื้นฐานบางอย่างเป็นเครื่องมือที่ยอดเยี่ยมจริงๆ

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



OOP คืออะไร?

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

OOP ถูกกำหนดให้เกิดความเข้าใจผิดโดยนักพัฒนาซอฟต์แวร์ส่วนใหญ่

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



เกี่ยวกับมินิเรียงความ / คำถามของคุณ

ฉันอยากจะบอกว่าคุณพูดถูก การนำกลับมาใช้ใหม่เป็นความฝันส่วนใหญ่ นี่คือคำพูดจาก Anders Hejilsberg เกี่ยวกับหัวข้อนั้น (ยอดเยี่ยม) จากที่นี่ :

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

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


4

คุณเคยสร้างหน้าต่างโดยใช้ WinAPI หรือไม่?

หลายครั้งมากกว่าที่ฉันสนใจที่จะจำ

จากนั้นคุณควรทราบว่าคุณกำหนดคลาส (RegisterClass) สร้างอินสแตนซ์ของมัน (CreateWindow) เรียกวิธีการเสมือน (WndProc) และเมธอดเบสคลาส (DefWindowProc) เป็นต้น WinAPI ยังใช้ระบบการตั้งชื่อจาก SmallTalk OOP โดยเรียกวิธีการว่า "ข้อความ" (Window Messages)

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

แฮนเดิลอาจไม่สามารถสืบทอดได้ แต่สุดท้ายก็มีใน Java พวกเขาไม่ได้ขาดชั้นเรียน แต่เป็นตัวยึดสำหรับชั้นเรียนนั่นคือสิ่งที่คำว่า "จัดการ" หมายถึง เมื่อดูที่สถาปัตยกรรมเช่น MFC หรือ. NET WinForms จะเห็นได้ชัดทันทีว่ายกเว้นไวยากรณ์ไม่มีอะไรแตกต่างจาก WinAPI มากนัก

ไม่สามารถสืบทอดได้ทั้งในอินเทอร์เฟซหรือการนำไปใช้งานทดแทนได้น้อยที่สุดและไม่แตกต่างอย่างมีนัยสำคัญจากสิ่งที่ coders ขั้นตอนดำเนินการมาตลอด

นี่มันจริงๆเหรอ? บิตที่ดีที่สุดของ OOP เป็นเพียง ... รหัสขั้นตอนดั้งเดิม? นั่นคือเรื่องใหญ่?


คุณต้องจำไว้ว่าอินเทอร์เฟซ Win32 นั้นเป็นการนำ Win16 มาใช้ใหม่ ซึ่งได้รับการออกแบบเมื่อสองทศวรรษที่แล้ว.
Brad Gilbert

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

4

ฉันเห็นด้วยอย่างสมบูรณ์กับคำตอบของInSciTek Jeffฉันจะเพิ่มการปรับแต่งต่อไปนี้:

  • การซ่อนและการห่อหุ้มข้อมูล: สำคัญสำหรับรหัสที่ดูแลรักษาได้ สามารถทำได้โดยระมัดระวังในภาษาโปรแกรมใด ๆ ไม่จำเป็นต้องมีคุณสมบัติ OO แต่การทำเช่นนี้จะทำให้โค้ดของคุณคล้าย OO เล็กน้อย
  • การสืบทอด: มีโดเมนแอปพลิเคชันที่สำคัญอย่างหนึ่งที่ OO เหล่านี้เป็นแบบเดียวกันและมีความสัมพันธ์ที่ลงตัว: ส่วนติดต่อผู้ใช้แบบกราฟิก หากคุณพยายามสร้าง GUI โดยไม่รองรับภาษา OO คุณจะต้องสร้างคุณสมบัติเหมือน OO อยู่ดีและมันยากขึ้นและเกิดข้อผิดพลาดได้ง่ายขึ้นโดยไม่ต้องรองรับภาษา ตัวอย่างเช่น Glade (เมื่อเร็ว ๆ นี้) และ X11 Xt (ในอดีต)

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


ใช่ฉันคิดว่าคุณควรใช้ OOP สำหรับวัตถุการเขียนโปรแกรมเชิงฟังก์ชันสำหรับฟังก์ชัน ...
Svante

4

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

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

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

นอกจากนี้การแนบฟังก์ชั่นเข้ากับหน้าเหล่านั้นจะสะอาดกว่ามาก ฉันสามารถทำ proCurrentPage-> CleanCache (); ตามด้วย proDisplayItem-> RenderPromo (); ถ้าฉันเพิ่งเรียกใช้ฟังก์ชันเหล่านั้นและสมมติว่ามีข้อมูลปัจจุบันใครจะรู้ว่าจะเกิดความชั่วร้ายแบบไหน นอกจากนี้หากฉันต้องส่งผ่านตัวแปรที่ถูกต้องไปยังฟังก์ชันเหล่านั้นฉันกลับไปที่ปัญหาในการมีตัวแปรทุกชนิดสำหรับผลิตภัณฑ์ต่างๆที่วางอยู่รอบ ๆ

การใช้ออบเจ็กต์ข้อมูลและฟังก์ชันทั้งหมดของผลิตภัณฑ์ของฉันดีและสะอาดและเข้าใจง่าย

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

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


3

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

และ OO เป็นวิธีที่มีประสิทธิภาพในการทำให้โปรแกรมของคุณอ่านง่าย ใช้ซ้ำหรือไม่ใช้ซ้ำ


2

"โลกแห่งความจริงไม่ใช่" OO ","

จริงๆ? โลกของฉันเต็มไปด้วยวัตถุ ตอนนี้ฉันใช้อยู่ ฉันคิดว่าการมีซอฟต์แวร์ "วัตถุ" จำลองวัตถุจริงอาจไม่ใช่เรื่องเลวร้าย

การออกแบบ OO สำหรับสิ่งที่เป็นแนวคิด (เช่น Windows ไม่ใช่หน้าต่างโลกแห่งความจริง แต่เป็นแผงแสดงผลบนหน้าจอคอมพิวเตอร์ของฉัน) มักจะเป็นที่ต้องการมากมาย แต่สำหรับสิ่งต่างๆในโลกแห่งความเป็นจริงเช่นใบแจ้งหนี้ใบสั่งส่งสินค้าการเคลมประกันและสิ่งที่ไม่ใช่ฉันคิดว่าสิ่งต่างๆในโลกแห่งความเป็นจริงเป็นวัตถุ ฉันมีกองอยู่บนโต๊ะทำงานดังนั้นมันต้องเป็นของจริง


2

จุดประสงค์ของ OOP คือการให้โปรแกรมเมอร์อีกวิธีหนึ่งในการอธิบายและสื่อสารวิธีแก้ปัญหาในรหัสไปยังเครื่องและผู้คน ส่วนที่สำคัญที่สุดคือการสื่อสารกับผู้คน OOP อนุญาตให้โปรแกรมเมอร์ประกาศความหมายของโค้ดผ่านกฎที่บังคับใช้ในภาษา OO

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

การมี OO ในภาษาเป็นเพียงการให้โปรแกรมเมอร์อีกวิธีหนึ่งในการแสดงออก

ส่วนที่ใหญ่ที่สุดในการเขียนโค้ดไม่ใช่การสื่อสารกับเครื่องส่วนนั้นเป็นเรื่องง่ายส่วนที่ใหญ่ที่สุดคือการสื่อสารกับโปรแกรมเมอร์ที่เป็นมนุษย์

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