คำถามติดแท็ก object-oriented

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

8
C ++ ให้เพื่อนหรือไม่ให้เพื่อน
ฉันมีการเขียนโปรแกรมเชิงวัตถุด้วยหลักสูตร c ++ ภาคการศึกษานี้ที่วิทยาลัยและเราได้เรียนรู้เกี่ยวกับฟังก์ชั่นเพื่อน ฉันไม่ชอบพวกเขาโดยสัญชาตญาณเพราะความสามารถในการหลีกเลี่ยงความปลอดภัยที่ Encapsulation และ Data ซ่อนไว้ฉันอ่านบทความสองสามเรื่องบนอินเทอร์เน็ตและบางคนคิดว่ามันเป็นความคิดที่ดีที่มีการใช้งานที่ถูกกฎหมาย ผู้เชี่ยวชาญ OOP จะพูดอย่างไรเกี่ยวกับเพื่อน fucntions ใน C ++ ฉันควรอ่านอย่างคร่าวๆหรือควรเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้หรือไม่

6
การเขียนโปรแกรมเชิงฟังก์ชั่นช่วยเพิ่มช่องว่างระหว่างปัญหาและแนวทางแก้ไขหรือไม่ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เนื่องจากภาษาเครื่อง (เช่น0110101000110101) ภาษาคอมพิวเตอร์มีวิวัฒนาการโดยทั่วไปในรูปแบบที่เป็นนามธรรมสูงกว่าโดยทั่วไปทำให้ง่ายต่อการเข้าใจรหัสเมื่อมันถูกนำไปใช้กับปัญหา แอสเซมเบลอร์เป็นนามธรรมผ่านรหัสเครื่อง C เป็นนามธรรมเหนือแอสเซมเบลอร์ ฯลฯ การออกแบบเชิงวัตถุดูเหมือนว่าจะดีมากที่ช่วยให้เราสามารถจำลองปัญหาในแง่ของวัตถุเช่นปัญหาของระบบการลงทะเบียนหลักสูตรมหาวิทยาลัยสามารถทำแบบจำลองกับCourseชั้นStudentเรียนคลาส ฯลฯ จากนั้นเมื่อเราเขียนวิธีการแก้ปัญหา ในภาษา OO เรามีคลาสที่คล้ายกันซึ่งได้รับความรับผิดชอบและโดยทั่วไปมีประโยชน์สำหรับการออกแบบโดยเฉพาะอย่างยิ่งสำหรับการทำให้โค้ดเป็นโมดูล ถ้าฉันให้ปัญหานี้แก่ทีมอิสระ 10 คนที่แก้ปัญหาด้วยวิธี OO โดยทั่วไป 10 วิธีแก้ปัญหาจะมีชั้นเรียนที่เกี่ยวข้องกับปัญหาที่เหมือนกัน อาจมีความแตกต่างมากมายเมื่อคุณเริ่มมีเพศสัมพันธ์และการโต้ตอบของคลาสเหล่านั้นดังนั้นจึงไม่มีสิ่งเช่น "ศูนย์ช่องว่างการเป็นตัวแทน" ประสบการณ์การใช้งานฟังก์ชั่นการเขียนโปรแกรมของฉันมี จำกัด มาก (ไม่มีการใช้งานจริงในโลกมีเพียงโปรแกรมประเภท Hello World) ฉันล้มเหลวในการดูว่าภาษาดังกล่าวอนุญาตให้ทำแผนที่โซลูชั่น FP ได้อย่างง่ายดายเพื่อแก้ไขปัญหา (ด้วยช่องว่างที่เป็นตัวแทนต่ำ) ในแบบที่ภาษา OO ทำอย่างไร ฉันเข้าใจถึงข้อดีของ FP ที่เกี่ยวกับการเขียนโปรแกรมพร้อมกัน แต่ฉันขาดอะไรไปหรือ FP ไม่ได้ลดช่องว่างในการเป็นตัวแทน (ทำให้การแก้ปัญหาเข้าใจง่ายขึ้น)? อีกวิธีที่จะถามสิ่งนี้: …

5
อะไรทำให้ JVM มีความหลากหลายในการรองรับภาษา JVM มากมาย
JVM รองรับภาษาอื่น ๆ อีกมากมายนอกเหนือจาก Java เช่นGroovy,Clojure,Scalaetc ซึ่งเป็นภาษาที่ใช้งานได้แตกต่างจาก Java (ฉันหมายถึงJava ก่อนเวอร์ชัน 8ที่Lambda'sไม่รองรับ) ที่ไม่รองรับความสามารถในการทำงานในระดับสูงสิ่งที่ทำให้ JVM อเนกประสงค์นั้น สามารถรองรับทั้ง Object Oriented และ Function Functional ได้หรือไม่

3
มีชื่อเฉพาะสำหรับบุคคลที่ผิดธรรมดา“ Square ที่สืบทอดมาจาก Rectangle” หรือไม่?
ความล้มเหลวบางอย่างของ OOP แสดงขึ้นพร้อมกับคลาส Square ที่สืบทอดมาจาก Rectangle โดยที่ Logical Square เป็นความเชี่ยวชาญเฉพาะของ Rectangle และควรสืบทอดมาจากมัน แต่ทุกอย่างจะแยกจากกันเมื่อคุณพยายามเปลี่ยนความยาวหรือความกว้างของ Square มีคำเฉพาะสำหรับการอธิบายสิ่งที่เกิดขึ้นกับกรณีนี้หรือไม่?

3
เหตุใดจึงไม่ใช้ฐานข้อมูลเชิงวัตถุมากเท่ากับฐานข้อมูลเชิงสัมพันธ์ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงอภิปรายโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันเจอระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) มากมาย แต่เมื่อเร็ว ๆ นี้ฉันใช้โหมดไฮเบอร์เนตทำให้ฉันเริ่มสงสัยว่าทำไมฐานข้อมูล Object Oriented จึงไม่เป็นที่นิยม ถ้าภาษาเชิงวัตถุเช่น Java หรือ C # ได้รับความนิยมดังนั้นทำไมระบบการจัดการฐานข้อมูลเชิงวัตถุ (OODBMS) จึงไม่เป็นที่นิยมเช่นกัน?

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

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

3
คำถามเกี่ยวกับรูปแบบการออกแบบมัณฑนากร Newbie
ฉันอ่านบทความการเขียนโปรแกรมและกล่าวถึงรูปแบบของมัณฑนากร ฉันเขียนโปรแกรมมาซักพัก แต่ไม่มีการศึกษาหรือการฝึกอบรมอย่างเป็นทางการ แต่ฉันพยายามเรียนรู้เกี่ยวกับรูปแบบมาตรฐานและเช่นนั้น ดังนั้นฉันจึงค้นหามัณฑนากรและพบบทความ Wikipediaอยู่ ตอนนี้ฉันเข้าใจแนวคิดของรูปแบบมัณฑนากร แต่ตอนนี้ฉันสับสนเล็กน้อย: ยกตัวอย่างเช่นพิจารณาหน้าต่างในระบบหน้าต่าง ในการอนุญาตให้เลื่อนเนื้อหาของหน้าต่างเราอาจต้องการเพิ่มแถบเลื่อนแนวนอนหรือแนวตั้งลงตามความเหมาะสม สมมติว่าหน้าต่างแสดงโดยอินสแตนซ์ของคลาสหน้าต่างและสมมติว่าคลาสนี้ไม่มีฟังก์ชันการทำงานสำหรับการเพิ่มแถบเลื่อน เราสามารถสร้างคลาสย่อย ScrollingWindow ที่จัดเตรียมไว้หรือเราสามารถสร้าง ScrollingWindowDecorator ที่เพิ่มฟังก์ชันนี้ให้กับวัตถุหน้าต่างที่มีอยู่ ณ จุดนี้การแก้ปัญหาอย่างใดอย่างหนึ่งจะดี ทีนี้สมมติว่าเราต้องการความสามารถในการเพิ่มเส้นขอบให้กับหน้าต่างของเราด้วย คลาส Window ดั้งเดิมของเราไม่สนับสนุน ขณะนี้คลาสย่อย ScrollingWindow มีปัญหาเนื่องจากได้สร้างหน้าต่างชนิดใหม่อย่างมีประสิทธิภาพ หากเราต้องการเพิ่มการรองรับชายแดนให้กับหน้าต่างทั้งหมดเราต้องสร้างคลาสย่อย WindowWithBorder และ ScrollingWindowWithBorder เห็นได้ชัดว่าปัญหานี้แย่ลงเมื่อมีการเพิ่มคุณสมบัติใหม่ทุกอย่าง สำหรับโซลูชันมัณฑนากรเราเพียงสร้าง BorderedWindowDecorator ใหม่ - ที่รันไทม์เราสามารถตกแต่งหน้าต่างที่มีอยู่ด้วย ScrollingWindowDecorator หรือ BorderedWindowDecorator หรือทั้งสองอย่างตามที่เราเห็นสมควร ตกลงเมื่อพวกเขาบอกว่าจะเพิ่มเส้นขอบให้กับหน้าต่างทั้งหมดทำไมไม่เพียงเพิ่มฟังก์ชันการทำงานลงในคลาสหน้าต่างดั้งเดิมเพื่ออนุญาตให้มีตัวเลือก วิธีที่ฉันเห็นคือ subclassing เป็นเพียงการเพิ่มฟังก์ชั่นเฉพาะให้กับคลาสหรือแทนที่เมธอดคลาส หากฉันต้องการเพิ่มฟังก์ชันการทำงานให้กับวัตถุที่มีอยู่ทั้งหมดเหตุใดฉันจึงไม่ปรับเปลี่ยน superclass ให้ทำเช่นนั้น มีอีกบรรทัดในบทความ: รูปแบบมัณฑนากรเป็นอีกทางเลือกหนึ่งของการทำคลาสย่อย การจัดคลาสย่อยเพิ่มลักษณะการทำงาน ณ …

10
ทำไมการสืบทอดและความหลากหลายจึงใช้กันอย่างแพร่หลาย?
ยิ่งฉันเรียนรู้เกี่ยวกับกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันเช่นการเขียนโปรแกรมการทำงานยิ่งฉันเริ่มตั้งคำถามเกี่ยวกับภูมิปัญญาของแนวคิด OOP เช่นการสืบทอดและ polymorphism ครั้งแรกที่ฉันได้เรียนรู้เกี่ยวกับการสืบทอดและ polymorphism ในโรงเรียนและในเวลานั้น polymorphism ดูเหมือนจะเป็นวิธีที่ยอดเยี่ยมในการเขียนรหัสทั่วไปที่อนุญาตให้ขยายได้ง่าย แต่ในการเผชิญกับการพิมพ์เป็ด (ทั้งแบบไดนามิกและแบบคงที่) และฟังก์ชั่นการใช้งานเช่นฟังก์ชั่นการสั่งซื้อที่สูงขึ้นฉันได้เริ่มดูการสืบทอดและความหลากหลายในรูปแบบเพื่อกำหนดข้อ จำกัด ที่ไม่จำเป็น แนวคิดทั่วไปที่อยู่เบื้องหลัง polymorphism คือคุณเขียนฟังก์ชันหนึ่งครั้งและหลังจากนั้นคุณสามารถเพิ่มฟังก์ชันการทำงานใหม่ให้กับโปรแกรมของคุณโดยไม่ต้องเปลี่ยนฟังก์ชั่นดั้งเดิม - สิ่งที่คุณต้องทำคือสร้างคลาสอื่นที่ได้มาซึ่งใช้วิธีการที่จำเป็น แต่วิธีนี้ง่ายกว่ามากในการพิมพ์เป็ดไม่ว่าจะเป็นภาษาแบบไดนามิกเช่น Python หรือภาษาแบบคงที่เช่น C ++ ลองพิจารณาฟังก์ชั่น Python ต่อไปนี้ตามด้วย C ++ แบบคงที่: def foo(obj): obj.doSomething() template <class Obj> void foo(Obj& obj) { obj.doSomething(); } การเทียบเท่า OOP จะเหมือนกับโค้ด Java ต่อไปนี้: public void foo(DoSomethingable …

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

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

2
เป็นความคิดที่ดีหรือไม่ที่จะกำหนดฟังก์ชั่นส่วนตัวขนาดใหญ่หนึ่งตัวในคลาสเพื่อรักษาสถานะที่ถูกต้องนั่นคือเพื่ออัพเดทข้อมูลสมาชิกของวัตถุ?
แม้ว่าในรหัสด้านล่างจะใช้การซื้อรายการเดียวอย่างง่ายในไซต์อีคอมเมิร์ซคำถามทั่วไปของฉันคือการอัปเดตข้อมูลสมาชิกทั้งหมดเพื่อให้ข้อมูลของวัตถุอยู่ในสถานะที่ถูกต้องตลอดเวลา ฉันพบว่า "ความสอดคล้อง" และ "สถานะเป็นสิ่งที่ชั่วร้าย" เป็นวลีที่เกี่ยวข้องซึ่งได้กล่าวถึงที่นี่: https://en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21 <?php class CartItem { private $price = 0; private $shipping = 5; // default private $tax = 0; private $taxPC = 5; // fixed private $totalCost = 0; /* private function to update all relevant data members */ private function updateAllDataMembers() { $this->tax …

5
ควรใช้การสืบทอดเมื่อใดจึงจะใช้ 'เพียงฟิลด์บูลีน'
ในแอปพลิเคชัน Rails ของเราเรากำลังเพิ่มการแจ้งเตือน บางส่วนของสิ่งเหล่านี้คือblockingพวกเขาหยุดความคืบหน้าของทรัพยากรใด ๆ ที่พวกเขากำลังเพิ่มเพราะข้อมูลบางอย่างเกี่ยวกับทรัพยากรที่หายไป การแจ้งเตือนอื่น ๆ เป็นการแจ้งเตือนที่ง่ายและให้ข้อมูลเท่านั้น วันนี้ฉันได้พูดคุยกับโปรแกรมเมอร์คนอื่นในทีมของเรา ฉันได้สร้างโครงสร้างการสืบทอดเช่นนี้: อย่างไรก็ตามเขาต้องการให้ฉันเพิ่มblockingวิธีการส่งคืนบูลีนในแต่ละการแจ้งเตือนและระบุรายการของคลาสย่อยที่ปิดกั้นภายในคลาสพาเรนต์การแจ้งเตือน ความแตกต่างระหว่างวิธีการเหล่านี้ไม่มากนัก ในแนวทางของฉันไม่ต้องระบุรายการนี้ทำให้ root class cleaner ในทางตรงกันข้ามตรรกะพิเศษที่เกิดขึ้นในNotification::Blockingตอนนี้ก็ไม่ได้มีขนาดใหญ่มากเช่นกัน นามธรรมชนิดใดที่เหมาะกับปัญหานี้มากขึ้น?

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

4
การจับคู่รูปแบบกับประเภทการออกแบบที่ใช้สำนวนหรือไม่ดีหรือไม่?
ดูเหมือนว่ารหัส F # มักจะจับคู่รูปแบบกับประเภท อย่างแน่นอน match opt with | Some val -> Something(val) | None -> Different() ดูเหมือนทั่วไป แต่จากมุมมองของ OOP ที่ดูน่ากลัวอย่างมากเช่นโฟลว์ควบคุมตามการตรวจสอบประเภทรันไทม์ซึ่งโดยทั่วไปแล้วจะขมวดคิ้ว หากต้องการสะกดคำใน OOP คุณอาจต้องการใช้การโหลดมากเกินไป: type T = abstract member Route : unit -> unit type Foo() = interface T with member this.Route() = printfn "Go left" type Bar() = interface …

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