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

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

4
วิธีปฏิบัติที่ดีที่สุดที่ส่งคืนวัตถุแบบอ่านอย่างเดียว
ฉันมีคำถาม "แนวปฏิบัติที่ดีที่สุด" เกี่ยวกับ OOP ใน C # (แต่การเรียงลำดับจะใช้กับทุกภาษา) พิจารณาการมีคลาสห้องสมุดที่มีวัตถุที่ต้องเปิดเผยต่อสาธารณะพูดผ่านตัวเข้าถึงคุณสมบัติ แต่เราไม่ต้องการให้ประชาชน (ผู้ที่ใช้คลาสไลบรารีนี้) เปลี่ยนมัน class A { // Note: List is just example, I am interested in objects in general. private List<string> _items = new List<string>() { "hello" } public List<string> Items { get { // Option A (not read-only), can be …

3
การเยาะเย้ยระดับคอนกรีต - ไม่แนะนำ
ฉันเพิ่งอ่านข้อความที่ตัดตอนมาจากหนังสือ "Growing Object-Oriented Software" ซึ่งอธิบายเหตุผลบางอย่างว่าทำไมไม่แนะนำให้ใช้การล้อเลียนระดับคอนกรีต นี่คือตัวอย่างโค้ดของการทดสอบหน่วยสำหรับคลาส MusicCentre: public class MusicCentreTest { @Test public void startsCdPlayerAtTimeRequested() { final MutableTime scheduledTime = new MutableTime(); CdPlayer player = new CdPlayer() { @Override public void scheduleToStartAt(Time startTime) { scheduledTime.set(startTime); } } MusicCentre centre = new MusicCentre(player); centre.startMediaAt(LATER); assertEquals(LATER, scheduledTime.get()); } } และคำอธิบายแรกของเขา: ปัญหาด้วยวิธีนี้คือมันทิ้งความสัมพันธ์ระหว่างวัตถุโดยนัย ฉันหวังว่าเราได้ทำให้ชัดเจนแล้วในตอนนี้ความตั้งใจของการพัฒนาขับเคลื่อนทดสอบกับวัตถุจำลองคือการค้นพบความสัมพันธ์ระหว่างวัตถุ …

12
ฉันจะอธิบายการเขียนโปรแกรมเชิงวัตถุให้กับผู้ที่มีรหัสเฉพาะใน Fortran 77 ได้อย่างไร
แม่ของฉันทำวิทยานิพนธ์ที่วิทยาลัยใน Fortran และตอนนี้ (มากกว่าทศวรรษต่อมา) จำเป็นต้องเรียนรู้ c ++ สำหรับการจำลองสถานการณ์ของไหล เธอสามารถเข้าใจการเขียนโปรแกรมขั้นตอนทั้งหมด แต่ไม่ว่าฉันจะพยายามอธิบายวัตถุให้ยากแค่ไหนมันก็ไม่ติด (ฉันทำงานกับ Java มากฉันรู้ว่าวัตถุทำงานอย่างไร) ฉันคิดว่าฉันอาจอธิบายได้ในระดับสูงเกินไปดังนั้นจึงไม่สมเหตุสมผลกับคนที่ไม่เคยทำงานกับพวกเขาเลยและเติบโตขึ้น ขึ้นในยุคของการเขียนโปรแกรมขั้นตอนอย่างหมดจด มีวิธีง่าย ๆ ที่ฉันสามารถอธิบายให้เธอฟังซึ่งจะช่วยให้เธอเข้าใจหรือไม่?

5
หลักการชดเชย Liskov เข้ากันไม่ได้กับการวิปัสสนาหรือการพิมพ์ดีดเป็ด?
ฉันเข้าใจอย่างถูกต้องหรือไม่ว่าหลักการแทน Liskovไม่สามารถสังเกตได้ในภาษาที่วัตถุสามารถตรวจสอบตัวเองเช่นภาษาเป็ดที่พิมพ์เป็นปกติ ยกตัวอย่างเช่นในทับทิมถ้าระดับBสืบทอดจากชั้นเรียนAแล้วสำหรับวัตถุทุกxของA, x.classเป็นไปได้กลับมาAแต่ถ้าxเป็นวัตถุของB, จะไม่กลับมาx.classA นี่คือคำแถลงของ LSP: Let Q (x)เป็นสถานที่ให้บริการสามารถพิสูจน์ได้เกี่ยวกับวัตถุxประเภทT จากนั้นQ (y)ควรจะสามารถพิสูจน์ได้สำหรับวัตถุYประเภทSที่Sเป็นชนิดย่อยของT ดังนั้นใน Ruby เช่น class T; end class S < T; end ละเมิด LSP ในแบบฟอร์มนี้ตามที่เห็นในคุณสมบัติq (x) =x.class.name == 'T' ส่วนที่เพิ่มเข้าไป. หากคำตอบคือ "ใช่" (LSP ไม่เข้ากับการวิปัสสนา) คำถามอื่น ๆ ของฉันจะเป็น: มีรูปแบบที่อ่อนแอของ LSP ที่ "อ่อนแอ" ซึ่งอาจจะเก็บไว้เป็นภาษาไดนามิกอาจอยู่ภายใต้เงื่อนไขเพิ่มเติมบางอย่างและมีชนิดพิเศษเท่านั้น ของคุณสมบัติ ปรับปรุง สำหรับการอ้างอิงนี่เป็นอีกสูตรของ LSP ที่ฉันพบบนเว็บ: ฟังก์ชันที่ใช้พอยน์เตอร์หรือการอ้างอิงไปยังคลาสพื้นฐานต้องสามารถใช้วัตถุของคลาสที่ได้รับโดยไม่ต้องรู้ เเละอีกอย่าง: …

5
เหตุใดจึงไม่มีภาษาที่มุ่งเน้นบริการ
แก้ไข: เพื่อหลีกเลี่ยงความสับสนเพิ่มเติม: ฉันไม่ได้พูดถึงบริการเว็บและเช่นนั้น ฉันกำลังพูดถึงการจัดโครงสร้างแอปพลิเคชันภายในไม่ใช่การสื่อสารของคอมพิวเตอร์ มันเกี่ยวกับการเขียนโปรแกรมภาษาคอมไพเลอร์และการขยายกระบวนทัศน์การเขียนโปรแกรมที่จำเป็น เดิม: ในฟิลด์การเขียนโปรแกรมที่จำเป็นเราเห็นกระบวนทัศน์สองรายการในช่วง 20 ปีที่ผ่านมา (หรือมากกว่า): object-oriented (OO) และ service-oriented (SO) ส่วนประกอบตาม (CB) กระบวนทัศน์ทั้งสองขยายกระบวนทัศน์การเขียนโปรแกรมที่จำเป็นโดยการแนะนำแนวคิดของโมดูล OO เรียกวัตถุเหล่านี้ (และคลาส) และให้พวกเขาสรุปข้อมูล (ฟิลด์) และโพรซีเดอร์ (เมธอด) เข้าด้วยกัน ดังนั้นในทางตรงกันข้ามแยกข้อมูล (บันทึก, ถั่ว, ... ) จากรหัส (ส่วนประกอบบริการ) อย่างไรก็ตามมีเพียง OO เท่านั้นที่มีภาษาการเขียนโปรแกรมซึ่งสนับสนุนกระบวนทัศน์ของมัน: Smalltalk, C ++, Java และอื่น ๆ ทั้งหมดที่เข้ากันได้กับ JVM, C # และอื่น ๆ ที่รองรับ NET., …

9
การออกแบบ OO ใดที่จะใช้ (มีรูปแบบการออกแบบ)
ฉันมีวัตถุสองชิ้นที่แสดงถึง 'บาร์ / คลับ' (สถานที่ที่คุณดื่ม / สังสรรค์) ในสถานการณ์หนึ่งฉันต้องการชื่อบาร์ที่อยู่ระยะทางสโลแกน ในสถานการณ์อื่นฉันต้องการชื่อบาร์, ที่อยู่, URL เว็บไซต์, โลโก้ ดังนั้นฉันจึงมีวัตถุสองชิ้นที่เป็นตัวแทนของสิ่งเดียวกัน แต่มีเขตข้อมูลที่แตกต่างกัน ผมชอบที่จะใช้วัตถุที่ไม่เปลี่ยนรูปเพื่อให้ทุกสาขามีการตั้งค่าจากตัวสร้าง ตัวเลือกหนึ่งคือการมีสองคอนสตรัคเตอร์และโมฆะสาขาอื่น ๆ เช่น: class Bar { private final String name; private final Distance distance; private final Url url; public Bar(String name, Distance distance){ this.name = name; this.distance = distance; this.url = null; } public …

5
ทำไมชั้นเรียนของฉันถึงแย่กว่าลำดับชั้นของหนังสือ (OOP เริ่มต้น)
ฉันอ่านPHP วัตถุรูปแบบและการปฏิบัติ ผู้เขียนพยายามสร้างแบบจำลองบทเรียนในวิทยาลัย เป้าหมายคือการส่งออกประเภทบทเรียน (การบรรยายหรือการสัมมนา) และค่าใช้จ่ายสำหรับบทเรียนขึ้นอยู่กับว่าเป็นบทเรียนราคาชั่วโมงหรือคงที่ ดังนั้นผลลัพธ์ควรเป็น Lesson charge 20. Charge type: hourly rate. Lesson type: seminar. Lesson charge 30. Charge type: fixed rate. Lesson type: lecture. เมื่ออินพุตเป็นดังนี้: $lessons[] = new Lesson('hourly rate', 4, 'seminar'); $lessons[] = new Lesson('fixed rate', null, 'lecture'); ฉันเขียนสิ่งนี้: class Lesson { private $chargeType; private $duration; …

3
การเขียนโปรแกรมทั่วไปใช้บ่อยแค่ไหนในอุตสาหกรรม
ฉันกำลังเขียนโปรแกรมในสภาพแวดล้อมทางวิชาการในขณะนี้ดังนั้นฉันสามารถใช้สิ่งที่ฉันต้องการ ฉันใช้ห้องสมุดกราฟเพิ่มสำหรับบางสิ่งและฉันสงสัยว่าการลงทุนเพื่อทำความเข้าใจ GP ยิ่งลึกคุ้มค่าหรือไม่ ฉันอยากรู้อยากเห็น - การเขียนโปรแกรมทั่วไป (GP) มีการใช้งานมากในอุตสาหกรรมหรือไม่ ฉันเดาว่าโปรแกรมเมอร์ส่วนใหญ่คุ้นเคยกับ OOP หรือใช้ภาษาที่ไม่เน้นหรือสนับสนุน GP ดังนั้นนอกการเรียก STL โครงสร้างข้อมูล / ฟังก์ชั่นใน C ++ ความประทับใจของฉันคือ GP ไม่ได้ใช้ทั้งหมดบ่อยนัก ในทางปฏิบัติ แต่การอยู่นอกอุตสาหกรรมในขณะนี้เป็นเรื่องดีที่ได้ยินจากผู้ฝึกสอนในเรื่องนี้ (ขณะที่ฉันกำลังเขียนสิ่งนี้ฉันเห็นว่าการเขียนโปรแกรมทั่วไปไม่ใช่แท็กที่ถูกต้อง!)

7
จากมุมมองการออกแบบแนวทางปฏิบัติที่ดีที่สุดสำหรับการบันทึกคืออะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันต้องการเพิ่มการบันทึกลงในแอปพลิเคชันที่ฉันกำลังทำงานอยู่ ฉันได้เพิ่มการบันทึกก่อนหน้านี้ไม่ใช่ปัญหาที่นี่ แต่จากมุมมองการออกแบบในภาษาเชิงวัตถุอะไรคือวิธีปฏิบัติที่ดีที่สุดสำหรับการบันทึกที่เป็นไปตาม OOP และรูปแบบ หมายเหตุ:ฉันกำลังทำสิ่งนี้ใน C # ดังนั้นตัวอย่างใน C # ยินดีต้อนรับอย่างชัดเจน ฉันต้องการเห็นตัวอย่างใน Java และ Ruby แก้ไข:ฉันใช้ log4net ฉันไม่รู้ว่าวิธีที่ดีที่สุดในการเสียบคืออะไร

4
ฉันจะส่งข้อมูลวิธีการเชิงวัตถุใน PHP ได้อย่างไร
ฉันพบว่าแม้เมื่อทำงานกับกรอบ MVC (เช่น CodeIgniter) ฉันมักหันไปใช้อาร์เรย์ที่ซ้อนกันมากกว่าวัตถุ สิ่งนี้ไม่เป็นไปตามความเข้าใจในเชิงวัตถุของฉัน ตัวอย่างเช่นถ้าฉันจะย้ายรหัสไปยัง Java แล้วฉันจะไม่ฝันที่จะผ่านอาร์เรย์ (หรือเวกเตอร์หรืออะไรก็ตาม) รอบ ๆ แบบนั้น ฉันสงสัยว่านี่เป็นวิธีที่เหมาะสมในการจัดการข้อมูลหรือไม่ มีเหตุผลว่าทำไมอาร์เรย์ถูกส่งผ่านอย่างนี้ใน PHP หรือทำไมวัตถุไม่ได้ใช้? วิธีที่ดีที่สุดในการส่งผ่านข้อมูลคืออะไร

4
การคิดเกี่ยวกับรูปแบบการออกแบบและการปฏิบัติของ OOP เปลี่ยนไปอย่างไรในภาษาที่มีการเปลี่ยนแปลงและมีการพิมพ์น้อย
มีคำถามที่เป็นประโยชน์อยู่แล้วในบรรทัดเหล่านี้ (" รูปแบบการออกแบบที่ไม่ใช่ OOP? ") แต่ฉันอยากรู้มากขึ้นเกี่ยวกับมุมมองการเปลี่ยนผ่านสำหรับใครบางคนที่เพิ่งเริ่มต้นด้วยภาษาแบบไดนามิกและพิมพ์อ่อนแอ นั่นคือ: สมมติว่าฉันได้รับการเขียนโปรแกรมใน C ++, C # หรือ Java เป็นเวลาหลายปีและดูดซึมจำนวนมากของภูมิปัญญาตามสายของรูปแบบการออกแบบ GoF ฟาวเลอร์ของรูปแบบของ Enterprise Application สถาปัตยกรรม , หลักการมูลฝอยฯลฯ ตอนนี้ฉัน' การเล่นน้ำใน Ruby, Python, JavaScript และอื่น ๆ และสงสัยว่าความรู้ของฉันใช้อย่างไร สันนิษฐานว่าฉันสามารถทำการแปลโดยตรงในหลายกรณี แต่เกือบจะแน่นอนว่าจะไม่ได้รับประโยชน์เต็มที่จากการตั้งค่าใหม่ของฉัน การพิมพ์แบบเป็ดเพียงอย่างเดียวทำให้ความคิดแบบอินเทอร์เฟซบนหัวของฉันเยอะ อะไรที่ยังคงเหมือนเดิม? การเปลี่ยนแปลงอะไร มีหลักการชี้แนะเช่น SOLID หรือรูปแบบที่เป็นที่ยอมรับ (อาจเป็นเรื่องใหม่ทั้งหมด) ที่มือใหม่ควรรู้หรือไม่?

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

4
คลาสที่ซ้อนกัน: เครื่องมือที่มีประโยชน์หรือการละเมิดการห่อหุ้มข้อมูลหรือไม่
ดังนั้นฉันยังอยู่บนรั้วว่าควรใช้สิ่งเหล่านี้หรือไม่ ฉันรู้สึกว่ามันเป็นการละเมิด encapsulation อย่างมาก แต่ฉันพบว่าฉันสามารถบรรลุระดับการห่อหุ้มได้ในขณะที่เพิ่มความยืดหยุ่นในโค้ดของฉัน โปรเจ็กต์ Java / Swing ก่อนหน้านี้ฉันใช้คลาสที่ซ้อนกันในระดับหนึ่ง แต่ตอนนี้ฉันได้ย้ายไปยังโปรเจ็กต์อื่นใน C # และฉันหลีกเลี่ยงการใช้งาน คุณรู้สึกอย่างไรเกี่ยวกับคลาสที่ซ้อนกัน?

10
คุณประเมินทักษะการออกแบบเชิงวัตถุอย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ข้อมูลเชิงลึกหรือคำถามประเภทใดที่จะนำคุณไปสู่การกำหนดทักษะ OOAD ของบุคคล

2
ข้อยกเว้นใน DDD
ฉันกำลังเรียน DDD และฉันกำลังคิดจะทิ้งข้อยกเว้นในบางสถานการณ์ ฉันเข้าใจว่าวัตถุไม่สามารถเข้าสู่สถานะที่ไม่ดีดังนั้นที่นี่ยกเว้นได้ดี แต่ในหลาย ๆ ตัวอย่างมีข้อยกเว้นการขว้างปาเช่นถ้าเราพยายามเพิ่มผู้ใช้ใหม่ที่มีอีเมลที่มีอยู่ในฐานข้อมูล public function doIt(UserData $userData) { $user = $this->userRepository->byEmail($userData->email()); if ($user) { throw new UserAlreadyExistsException(); } $this->userRepository->add( new User( $userData->email(), $userData->password() ) ); } ดังนั้นหากผู้ใช้ที่มีอีเมลนี้มีอยู่เราสามารถยกเว้นบริการแอพพลิเคชั่นได้ แต่เราไม่ควรควบคุมการทำงานของแอปพลิเคชันโดยใช้บล็อกการลองจับ วิธีที่ดีที่สุดสำหรับสิ่งนี้คืออะไร?

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