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

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

4
มันหมายความว่าอย่างไรเมื่อมีคนพูดว่า“ ห่อหุ้มสิ่งที่แตกต่างกัน”?
หนึ่งในหลักการของ OOP ที่ฉันพบคือ: - สรุปสิ่งที่แตกต่าง ฉันเข้าใจความหมายของวลีคือซ่อนสิ่งที่แตกต่างกัน อย่างไรก็ตามฉันไม่รู้ว่ามันจะช่วยในการออกแบบที่ดีขึ้นได้อย่างไร บางคนสามารถอธิบายได้โดยใช้ตัวอย่างที่ดี

5
เป็นวิธีปฏิบัติที่ดีในการหลีกเลี่ยงค่าคงที่โดยใช้ getters หรือไม่
มันเป็นการดีหรือไม่ที่จะแทนที่ค่าคงที่ที่ใช้นอกคลาสโดย getters ตัวอย่างเช่นใช้ดีกว่าif User.getRole().getCode() == Role.CODE_ADMINหรือif User.getRole().isCodeAdmin()? นั่นจะนำไปสู่คลาสนี้: class Role { constant CODE_ADMIN = "admin" constant CODE_USER = "user" private code getRoleCode() { return Role.code } isCodeAdmin () { return Role.code == Role.CODE_ADMIN } isCodeUser () { return Role.code == Role.CODE_USER } }

6
มันไม่เป็นไรสำหรับอินเตอร์เฟสที่จะมีวิธีการที่ส่งกลับชนิดที่เป็นรูปธรรมของการใช้งานในรูปแบบของค่าคงที่หรือไม่?
ฉันมักจะทำให้ตัวเองอยู่ในสถานการณ์ที่ฉันต้องการพฤติกรรมที่แตกต่างของส่วนประกอบซึ่งขึ้นอยู่กับรูปแบบที่แตกต่างกันของอินเทอร์เฟซที่แตกต่างกัน เพื่อแสดงคำถามของฉันฉันได้เขียนรหัสชิ้นเล็ก ๆ ซึ่งจะแสดงสิ่งที่ฉันหมายถึง ในตัวอย่างนี้ฉันพยายามที่จะยกตัวอย่างวัตถุอาหารจากวัตถุสัตว์ interface Animal { void growl(); String getAnimalType(); //"DOG" or "FISH" } abstract class Food {} Meat extends Food {} Bread extends Food {} class FoodFactory { Food createFoodForAnimal(Animal animal) { switch (animal.getAnimalType()) { case "DOG": Food food = new Meat(); break; case "FISH": Food food …

4
ฉันจะจัดการ setters ในฟิลด์ที่ไม่เปลี่ยนรูปแบบได้อย่างไร
ฉันมีชั้นเรียนสองreadonly intสาขา พวกเขาถูกเปิดเผยเป็นคุณสมบัติ: public class Thing { private readonly int _foo, _bar; /// <summary> I AM IMMUTABLE. </summary> public Thing(int foo, int bar) { _foo = foo; _bar = bar; } public int Foo { get { return _foo; } set { } } public int Bar { get { …

8
การรวบรวมลำดับของฉันควรเริ่มต้นที่ดัชนี 0 หรือดัชนี 1 หรือไม่
ฉันกำลังสร้างแบบจำลองวัตถุสำหรับอุปกรณ์ที่มีหลายช่องทาง คำนามที่ใช้ระหว่างลูกค้าและฉันและChannel ChannelSet("ชุด" ไม่ถูกต้องทางความหมายเพราะเป็นชุดและชุดที่ไม่ถูกต้อง แต่นั่นเป็นปัญหาสำหรับเวลาที่แตกต่างกัน) ฉันใช้ C # นี่คือตัวอย่างการใช้งานของChannelSet: // load a 5-channel ChannelSet ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json"); Console.Write(channels.Count); // -> 5 foreach (Channel channel in channels) { Console.Write(channel.Average); Console.Write(", "); } // -> 0.3, 0.3, 0.9, 0.1, 0.2 ทั้งหมดคือสำรวย อย่างไรก็ตามลูกค้าไม่ใช่โปรแกรมเมอร์และพวกเขาจะสับสนอย่างแน่นอนโดยไม่มีการทำดัชนี - ช่องแรกคือช่องที่ 1 สำหรับพวกเขา แต่เพื่อประโยชน์ของความสอดคล้องกับ C # ผมต้องการที่จะให้ChannelSetจัดทำดัชนีจากศูนย์ นี่เป็นสาเหตุที่ทำให้เกิดการเชื่อมต่อระหว่างทีม …

3
ทำไมสมาชิกส่วนตัวสามารถเข้าถึงได้ในวิธีการคงที่?
ต่อไปนี้เป็นรหัสหลอกฉันลองใน Java และ PHP และทั้งสองทำงาน: class Test { private int a = 5; public static function do_test(){ var t = new Test(); t.a = 1; print t.a // 1 } } Test::do_test(); ทำไมคุณสามารถทำสิ่งนี้ในกระบวนทัศน์ OOP และการใช้งานของมันคืออะไร?

5
เหตุใดการเขียนบางสิ่งในภาษา X จึงไม่ดีราวกับว่าคุณกำลังเขียนโปรแกรมในภาษา Y ในแง่ของการใช้กระบวนทัศน์การเข้ารหัสที่ใช้ร่วมกัน [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ไม่นานมานี้ฉันถามคำถามเกี่ยวกับ SO เกี่ยวกับสิ่งที่เขียนใน C ++ แต่แทนที่จะได้รับคำตอบสำหรับปัญหาที่เกิดขึ้นความคิดเห็นต่าง ๆ ก็บ้าไปตามสไตล์การเขียนโค้ดของฉันแม้ว่าฉันจะระบุว่ามันเป็นรหัสWIPและฉันตั้งใจจะล้างมันในภายหลังเมื่อฉันใช้เคสพื้นฐาน (ฉันได้รับคะแนนเสียงลงมากที่ฉันตัดสินใจที่จะดึงคำถามเนื่องจากตัวแทนของฉันดังนั้นแล้วอยู่ใกล้สุดซึ้ง) มันทำให้ฉันสงสัยว่าทำไมผู้คนถึงยอมรับทัศนคติที่ว่า "คุณเป็นโนบ ฉันถูกกล่าวหาว่าเขียน C ++ เหมือนกับว่าเป็น Java สิ่งที่ฉันไม่เข้าใจและยังทำให้ฉันงุนงง ฉันได้รับการเขียนโปรแกรมในภาษา OOP ไม่กี่ปีที่ผ่านมาในขณะนี้แม้ในช่วงเวลา ฉันเลือกภาษาที่จะใช้ในแง่ของไลบรารีที่มีอยู่และสภาพแวดล้อมการดำเนินการที่ดีที่สุดสำหรับงานในมือ ฉันนำรูปแบบการออกแบบมาใช้ในรหัส OOP และฉันค่อนข้างมั่นใจว่าการใช้รูปแบบของฉันนั้นฟังดูดีและ OO ที่ชาญฉลาดฉันสามารถมีรูปแบบของตัวเองได้ ฉันเข้าใจกล่องเครื่องมือของ OOP แต่เลือกที่จะใช้เครื่องมือเฉพาะเมื่อฉันคิดว่าเป็นสิ่งจำเป็นจริงๆไม่ใช่เพื่อใช้เคล็ดลับที่ประณีตเพื่อแสดงการเข้ารหัสของฉัน (ซึ่งฉันรู้ว่าไม่ใช่รอยบนสุด แต่ฉันคิดว่าไม่อยู่ในระดับ n00b เช่นกัน) ฉันออกแบบรหัสของฉันก่อนที่ฉันจะเขียนบรรทัดเดียว ในการกำหนดการทดสอบฉันทำรายการเป้าหมายของชั้นเรียนหนึ่ง ๆ และเกณฑ์การทดสอบที่ต้องปฏิบัติตาม เพราะฉันจะสร้างไดอะแกรมลำดับและเขียนรหัสได้ง่ายขึ้นฉันเลือกที่จะเขียนการทดสอบหลังจากที่อินเทอร์เฟซกลายเป็นที่ชัดเจน ฉันต้องยอมรับว่าในส่วนของรหัสที่ฉันโพสต์ในคำถามฉันยังคงใช้พอยน์เตอร์แทนการใช้สมาร์ทพอยน์เตอร์ ฉันใช้ RAII ทุกครั้งที่ทำได้ ฉันรู้ว่า …

4
ทำไม Java ไม่ใช้การห่อหุ้มด้วยคลาสบางคลาส?
คำถามของฉันเกี่ยวข้องกับSystem.inและSystem.outชั้นเรียน (อาจมีคนอื่น ๆ เช่นที่อยู่ในไลบรารีมาตรฐาน) ทำไมถึงเป็นอย่างนั้น? นั่นเป็นวิธีปฏิบัติที่ไม่ดีใน OOP ใช่หรือไม่ ไม่ควรใช้เช่น: System.getIn()และSystem.getOut()? ฉันมีคำถามนี้มาตลอดและหวังว่าฉันจะหาคำตอบที่ดีได้ที่นี่

4
ฉันจะเพิ่มฟังก์ชันการทำงานให้กับวัตถุที่มีอยู่แล้วได้อย่างไร
ฉันมีอินเทอร์เฟซที่มีฟังก์ชันการทำงานที่กำหนดไว้จำนวนหนึ่ง สมมติว่า: interface BakeryInterface { public function createCookies(); public function createIceCream(); } สิ่งนี้ทำงานได้ดีสำหรับการนำไปใช้งานส่วนใหญ่ของอินเทอร์เฟซ แต่ในบางกรณีฉันต้องเพิ่มฟังก์ชันใหม่บางอย่าง (เช่นอาจรีดเป็นวิธีใหม่createBrownies()) วิธีการที่ชัดเจน / ไร้เดียงสาในการทำเช่นนี้คือการขยายส่วนต่อประสาน: interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } แต่มีข้อเสียใหญ่ที่ฉันไม่สามารถเพิ่มฟังก์ชั่นใหม่โดยไม่ต้องปรับเปลี่ยน API ที่มีอยู่ (เช่นการเปลี่ยนคลาสเพื่อใช้อินเทอร์เฟซใหม่) ฉันกำลังคิดเกี่ยวกับการใช้อะแดปเตอร์เพื่อเพิ่มฟังก์ชันการทำงานหลังจาก instantiation: class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() …

5
ฉันจะใช้แนวคิด OOP เพื่อสร้างแอปพลิเคชันเว็บที่เรียบง่าย แต่มีอยู่จริงได้อย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการ4 ปีที่แล้ว ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ฉันพยายามมาเป็นเวลานานแล้วที่จะปิดหัว OOP ฉันเห็นข้อดีของมัน ฉันได้อ่านแบบฝึกหัดจำนวนมากและดูวิดีโอในหัวข้อที่เท่ากัน ฉันได้ตัวอย่างสัตว์ / แมว / สุนัขฉันได้รับตัวอย่างรถยนต์ / ไดรฟ์ สิ่งที่ฉันกำลังดิ้นรนคือจะใช้แนวคิดเหล่านี้ในแอปพลิเคชันที่ใช้งานจริง ดังนั้นฉันได้กำหนดให้สร้างโดยใช้ OOP ฉันไม่ได้ขอความช่วยเหลือเกี่ยวกับไวยากรณ์หรือการเขียนรหัสเฉพาะ - ฉันสามารถพบว่าตัวเองในเอกสารและโดยการค้นหาฟอรั่ม ฯลฯ สิ่งที่ฉันต้องการจริงๆคือแนวทางและการผลักดันในทิศทางที่ถูกต้องทุกครั้ง มีโปรแกรมเมอร์โปรแกรมเมอร์คนใดที่เต็มใจให้คำปรึกษากับฉันหรือไม่? ในฐานะที่เป็นโครงการเรียนรู้ของฉันฉันต้องการที่จะสร้างคลาสสิฟายด์ "app เว็บ" สิ่งที่คล้ายกับ Craigslist แต่มีวิธีการลดลงในแง่ของขอบเขต ฉันต้องการใช้ PHP5 และ MySQL เพราะฉันคุ้นเคยกับพวกเขา สมมติว่ามีเพียง 2 กรณีใช้งาน: โพสต์บางสิ่งเพื่อขาย การสืบค้น / ค้นหาสิ่งที่จะซื้อ สิ่งที่ …


4
ชี้แจงหลักการเปิด / ปิด
ตามที่ฉันได้อธิบายหลักการเปิด / ปิดระบุว่าเมื่อเขียนรหัสไม่ควรแก้ไข (นอกเหนือจากการแก้ไขข้อผิดพลาด) แต่หากกฎธุรกิจของฉันเปลี่ยนฉันไม่ควรแก้ไขรหัสที่ใช้การเปลี่ยนแปลงเหล่านั้นหรือ ฉันสงสัยว่าฉันไม่เข้าใจบางสิ่งเกี่ยวกับหลักการเพราะมันไม่สมเหตุสมผลสำหรับฉัน

10
มันเป็นรูปแบบการต่อต้านถ้าทรัพย์สินชั้นสร้างและส่งกลับตัวอย่างใหม่ของชั้นเรียนหรือไม่?
ฉันมีคลาสที่เรียกHeadingว่าทำสิ่งเล็ก ๆ น้อย ๆ แต่ก็ควรที่จะสามารถคืนค่าตรงกันข้ามกับค่าหัวเรื่องปัจจุบันซึ่งในที่สุดจะต้องใช้ผ่านการสร้างอินสแตนซ์ใหม่ของHeadingคลาสเอง ฉันสามารถมีคุณสมบัติแบบง่าย ๆ ที่เรียกว่าreciprocalให้ส่งคืนหัวเรื่องตรงข้ามของค่าปัจจุบันจากนั้นสร้างอินสแตนซ์ใหม่ของคลาสหัวเรื่องด้วยตนเองหรือฉันสามารถสร้างวิธีที่ต้องการcreateReciprocalHeading()สร้างอินสแตนซ์ใหม่ของคลาสหัวเรื่องโดยอัตโนมัติ ผู้ใช้งาน อย่างไรก็ตามหนึ่งในเพื่อนร่วมงานของฉันแนะนำให้ฉันเพียงแค่สร้างคุณสมบัติคลาสที่เรียกreciprocalว่าคืนค่าอินสแตนซ์ใหม่ของคลาสเองผ่านเมธอด getter คำถามของฉันคือ: มันเป็นรูปแบบต่อต้านหรือไม่สำหรับคุณสมบัติของคลาสที่จะทำเช่นนั้น? ฉันพบว่ามันใช้งานง่ายน้อยลงเพราะ: ในใจของฉันคุณสมบัติของคลาสไม่ควรส่งคืนอินสแตนซ์ใหม่ของคลาสและ ชื่อของคุณสมบัติซึ่งreciprocalไม่ได้ช่วยให้นักพัฒนาสามารถเข้าใจพฤติกรรมของมันได้อย่างสมบูรณ์โดยไม่ได้รับความช่วยเหลือจาก IDE หรือตรวจสอบลายเซ็นของ getter ฉันเข้มงวดเกินไปเกี่ยวกับคุณสมบัติของคลาสที่ควรทำหรือเป็นข้อกังวลที่ถูกต้อง? ฉันพยายามจัดการสถานะของคลาสผ่านฟิลด์และคุณสมบัติของมันตลอดจนพฤติกรรมของมันผ่านวิธีการของมันและฉันล้มเหลวในการดูว่าสิ่งนี้เหมาะกับนิยามของคลาสของคุณสมบัติอย่างไร

5
การใช้ตัวดำเนินการแคสต์อย่างชัดเจนของฉันนั้นสมเหตุสมผลหรือแฮ็คที่ไม่ดี?
ฉันมีวัตถุขนาดใหญ่: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } และวัตถุที่เหมือน DTO เฉพาะด้าน: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } ฉันพบแนวคิดส่วนตัวในการส่ง BigObject ไปยัง SmallObject อย่างชัดเจนโดยรู้ว่าเป็นการดำเนินการทางเดียวที่ทำให้ข้อมูลสูญหาย - ใช้งานง่ายและอ่านได้ง่ายมาก: var small = …

10
วิธีที่เหมาะสมในการจำลองกิจกรรมในโลกแห่งความเป็นจริงที่ดูเหมือนจะต้องการการอ้างอิงแบบวงกลมใน OOP
ฉันต่อสู้กับปัญหาในโครงการ Java เกี่ยวกับการอ้างอิงแบบวงกลม ฉันพยายามจำลองสถานการณ์ในโลกแห่งความเป็นจริงซึ่งดูเหมือนว่าวัตถุที่เป็นปัญหานั้นมีความเป็นอิสระและจำเป็นต้องรู้ซึ่งกันและกัน โครงการนี้เป็นรูปแบบทั่วไปของการเล่นเกมกระดาน คลาสพื้นฐานนั้นไม่ใช่แบบเฉพาะเจาะจง แต่ขยายออกไปเพื่อจัดการกับข้อมูลเฉพาะของหมากรุกแบ็คแกมมอนและเกมอื่น ๆ ฉันเขียนโค้ดนี้เป็นแอปเพล็ตเมื่อ 11 ปีที่แล้วกับเกมที่แตกต่างกันครึ่งโหล แต่ปัญหาคือมันเต็มไปด้วยการอ้างอิงแบบวงกลม ฉันนำมันกลับมาแล้วโดยการบรรจุคลาสที่เกี่ยวพันทั้งหมดไว้ในไฟล์ต้นฉบับเดียว แต่ฉันเข้าใจว่ามันเป็นรูปแบบที่ไม่ดีใน Java ตอนนี้ฉันต้องการใช้สิ่งที่คล้ายกันเป็นแอพ Android และฉันต้องการทำสิ่งที่ถูกต้อง ชั้นเรียนคือ: RuleBook: วัตถุที่สามารถสอบปากคำสำหรับสิ่งต่างๆเช่นเค้าโครงเริ่มต้นของคณะกรรมการข้อมูลเกมเริ่มต้นอื่น ๆ เช่นใครเป็นคนแรกที่ย้ายการเคลื่อนไหวที่มีอยู่สิ่งที่เกิดขึ้นกับรัฐเกมหลังจากการย้ายเสนอและการประเมินผลของ ตำแหน่งคณะกรรมการปัจจุบันหรือที่เสนอ บอร์ด: การแสดงบอร์ดเกมอย่างง่ายซึ่งสามารถสั่งให้สะท้อนการเคลื่อนไหวได้ MoveList: รายการ Moves นี่คือจุดประสงค์คู่: ตัวเลือกการเคลื่อนไหวที่มีให้ ณ จุดที่กำหนดหรือรายการการเคลื่อนไหวที่เกิดขึ้นในเกม มันอาจแบ่งออกเป็นสองคลาสใกล้เคียงกัน แต่นั่นไม่เกี่ยวข้องกับคำถามที่ฉันถามและอาจทำให้ซับซ้อนขึ้นอีก ย้าย: ย้ายเพียงครั้งเดียว มันรวมทุกอย่างเกี่ยวกับการเคลื่อนไหวเป็นรายการของอะตอม: หยิบชิ้นส่วนจากที่นี่วางไว้ที่นั่นเอาชิ้นส่วนที่ถูกจับออกจากที่นั่น สถานะ: ข้อมูลสถานะเต็มของเกมที่กำลังดำเนินการ ไม่เพียง แต่ตำแหน่ง Board เท่านั้น แต่เป็น MoveList และข้อมูลสถานะอื่น ๆ เช่นใครจะย้ายได้ …

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