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

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

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

23
หากวัตถุที่ไม่เปลี่ยนรูปนั้นดีทำไมผู้คนยังคงสร้างวัตถุที่เปลี่ยนแปลงได้ [ปิด]
หากออบเจ็กต์ที่ไม่เปลี่ยนรูปแบบนั้นดีง่ายและให้ประโยชน์ในการเขียนโปรแกรมพร้อมกันเหตุใดโปรแกรมเมอร์จึงต้องสร้างออบเจ็กต์ที่เปลี่ยนแปลงไม่ได้² ฉันมีประสบการณ์สี่ปีในการเขียนโปรแกรม Java และอย่างที่ฉันเห็นสิ่งแรกที่ผู้คนทำหลังจากสร้างคลาสคือสร้าง getters และ setters ใน IDE (ทำให้มันไม่แน่นอน) มีการขาดการรับรู้หรือเราสามารถใช้วัตถุที่เปลี่ยนแปลงได้ในสถานการณ์ส่วนใหญ่หรือไม่? ¹ วัตถุที่ไม่เปลี่ยนรูปนั้นเป็นวัตถุที่ไม่สามารถแก้ไขสถานะได้หลังจากสร้างขึ้นแล้ว ² วัตถุที่ไม่แน่นอนเป็นวัตถุที่สามารถแก้ไขได้หลังจากที่มันถูกสร้างขึ้น

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

2
ชื่อแพ็คเกจควรเป็นแบบเอกพจน์หรือพหูพจน์
บ่อยครั้งที่ในไลบรารีโดยเฉพาะแพ็คเกจประกอบด้วยคลาสที่ถูกจัดระเบียบรอบ ๆ แนวคิดเดียว ตัวอย่าง: XML, SQL, การใช้งานการตั้งค่า, DB ผมคิดว่าเราทุกคนรู้สึกรักธรรมชาติที่แพคเกจเหล่านี้ถูกต้องในเอกพจน์ com.myproject xml . โครงการส่วนเสริมทั้งหมด SQL .Connection com.myproject ผู้ใช้ .User com.myproject ผู้ใช้. UserFactory อย่างไรก็ตามถ้าฉันมีแพ็คเกจที่มีชุดของการใช้งานประเภทเดียว - เช่นงาน, กฎ, ตัวจัดการ, แบบจำลอง ฯลฯซึ่งเป็นที่นิยมมากกว่า? com.myproject ภารกิจ. TakeOutGarbageTask com.myproject ภารกิจ. DoTheDishesTask com.myproject งาน.เพ้นท์เฮาส์เฮาส์ หรือ com.myproject ภารกิจ. TakeOutGarbageTask com.myproject ภารกิจ. DoTheDishesTask com.myproject task .PaintTheHouseTask

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


16
เมื่อ Getters และ Setters เป็นธรรม
Getters และ setters มักถูกวิพากษ์วิจารณ์ว่าไม่เหมาะสม OO ในทางกลับกันรหัส OO ส่วนใหญ่ที่ฉันเคยเห็นมีตัวรับมากมายและตัวตั้งค่า เมื่อ getters และ setters เป็นธรรม? คุณพยายามหลีกเลี่ยงการใช้งานหรือไม่ โดยทั่วไปแล้วพวกเขาใช้มากเกินไปหรือไม่? หากภาษาที่คุณชื่นชอบมีคุณสมบัติ (ของฉัน) แล้วสิ่งเหล่านี้จะถือว่าเป็นผู้ได้รับและผู้ตั้งค่าสำหรับคำถามนี้ พวกเขาเป็นสิ่งเดียวกันจากมุมมองวิธีการ OO พวกเขามีไวยากรณ์ที่ดีกว่า แหล่งที่มาสำหรับการวิจารณ์ Getter / Setter (บางคนนำมาจากความคิดเห็นเพื่อให้พวกเขามองเห็นได้ดีขึ้น): http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html http://typicalprogrammer.com/?p=23 http://c2.com/cgi/wiki?AccessorsAreEvil http://www.darronschall.com/weblog/2005/03/no-brain-getter-and-setters.cfm http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html ในการระบุคำวิจารณ์อย่างง่าย ๆ : Getters and Setters อนุญาตให้คุณจัดการสถานะภายในของวัตถุจากด้านนอกของวัตถุ นี่เป็นการละเมิด encapsulation เฉพาะวัตถุเท่านั้นที่ควรดูแลเกี่ยวกับสถานะภายในของมัน และตัวอย่างรหัสขั้นตอน struct Fridge { int cheese; } void …

14
แนวคิดเรื่อง“ องค์ประกอบของความโปรดปรานเหนือมรดก” นี้มาจากไหน?
ในช่วงไม่กี่เดือนที่ผ่านมามนต์ "องค์ประกอบที่เป็นที่โปรดปรานเหนือมรดก" ดูเหมือนจะเด้งขึ้นมาจากที่ไหนเลยและกลายเป็นเกือบ meme บางอย่างภายในชุมชนการเขียนโปรแกรม และทุกครั้งที่ฉันเห็นฉันก็รู้สึกงงเล็กน้อย มันเหมือนมีคนพูดว่า "ชอบการฝึกฝนมากกว่าค้อน" จากประสบการณ์ของฉันการจัดองค์ประกอบและการรับมรดกเป็นเครื่องมือสองแบบที่แตกต่างกันกับกรณีการใช้งานที่แตกต่างกันและจัดการกับมันราวกับว่าพวกมันใช้แทนกันได้และอีกอันหนึ่งเหนือกว่าอีกอันหนึ่ง นอกจากนี้ฉันไม่เคยเห็นคำอธิบายที่แท้จริงว่าทำไมการรับมรดกจึงไม่ดีและการจัดองค์ประกอบเป็นสิ่งที่ดีซึ่งทำให้ฉันสงสัยมากขึ้น ควรที่จะได้รับการยอมรับในความเชื่อหรือไม่? การทดแทน Liskov และ polymorphism นั้นเป็นที่รู้จักกันดีผลประโยชน์ที่ชัดเจนและ IMO ประกอบด้วยจุดทั้งหมดของการใช้การเขียนโปรแกรมเชิงวัตถุและไม่มีใครอธิบายได้ว่าทำไมพวกเขาจึงควรทิ้งองค์ประกอบเหล่านั้น ไม่มีใครรู้ว่าแนวคิดนี้มาจากไหนและเหตุผลที่อยู่เบื้องหลังมันคืออะไร?

8
การเขียนโปรแกรมที่ไม่ดีเป็นเรื่องปกติในอุตสาหกรรมซอฟต์แวร์หรือไม่? [ปิด]
ฉันเพิ่งเริ่มงานแรกในฐานะนักพัฒนาซอฟต์แวร์เมื่อหนึ่งเดือนก่อน ทุกอย่างที่ฉันได้เรียนรู้เกี่ยวกับ OOP, SOLID , แห้ง , YAGNI, รูปแบบการออกแบบ, SRP , ฯลฯ สามารถถูกโยนออกไปนอกหน้าต่าง พวกเขาใช้เว็บฟอร์ม C # .NET และทำเกือบทุกอย่างภายใน Code Behind ด้วยคลาสภายนอกน้อยมากซึ่งไม่ได้เรียกว่าออบเจ็กต์ พวกเขาใช้การควบคุมที่กำหนดเองและนำมาใช้ใหม่ เกี่ยวกับวัตถุเท่านั้นที่ใช้โดยEntity Framework พวกเขาใช้ Code Behinds ซ้ำสำหรับลูกค้าแต่ละราย พวกเขามีวิธีการที่ยาว 400 บรรทัดในการทำสิ่งของทุกประเภท สำหรับลูกค้าใหม่พวกเขาใช้ aspx และ aspx.cs และดึงรหัสลูกค้าออกและเริ่มเพิ่มรหัสเฉพาะลูกค้าใหม่ ข้อแก้ตัวแรกของพวกเขาคือมันจะเพิ่มการบำรุงรักษาเพิ่มเติมและรหัสเพิ่มเติมคือการบำรุงรักษาเพิ่มเติม มันเป็นร้านค้าเล็ก ๆ ของนักพัฒนาสามคนรวมถึงตัวฉันด้วย นักพัฒนาซอฟต์แวร์หนึ่งคนมีประสบการณ์มากกว่า 30 ปีและอีกหนึ่งคนมีประสบการณ์มากกว่า 20 ปี หนึ่งเคยเป็นนักพัฒนาเกมและคนอื่น ๆ ได้ทำงานใน C และ …

17
เป็นการดีกว่าที่จะส่งคืนค่า NULL หรือค่าว่างจากฟังก์ชัน / เมธอดที่ไม่มีค่าส่งคืนใช่หรือไม่
ฉันกำลังมองหาคำแนะนำที่นี่ ฉันกำลังดิ้นรนกับว่ามันจะดีกว่าที่จะกลับเป็นโมฆะหรือค่าที่ว่างเปล่าจากวิธีการเมื่อไม่มีค่าตอบแทนหรือไม่สามารถหาได้ ใช้สองวิธีต่อไปนี้เป็นตัวอย่าง: string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. ในReverseString()ฉันจะพูดกลับสตริงที่ว่างเปล่าเพราะประเภทกลับเป็นสตริงดังนั้นผู้โทรคาดหวังว่า ด้วยวิธีนี้ผู้โทรจะไม่ต้องตรวจสอบเพื่อดูว่ากลับเป็นโมฆะ ในการFindPerson()คืนค่า NULL ดูเหมือนว่าเหมาะสมดีกว่า ไม่ว่า NULL หรือวัตถุ Person ว่างเปล่า ( new Person()) จะถูกส่งคืนหรือไม่ผู้โทรจะต้องตรวจสอบเพื่อดูว่าวัตถุบุคคลนั้นว่างเปล่าหรือว่างเปล่าก่อนที่จะทำอะไรกับมัน (เช่นการโทรUpdateName()) ดังนั้นทำไมไม่เพียงแค่ส่งคืนค่า NULL ที่นี่จากนั้นผู้โทรต้องตรวจสอบค่า NULL เท่านั้น ใครบ้างที่ต่อสู้กับสิ่งนี้? ความช่วยเหลือหรือข้อมูลเชิงลึกใด ๆ ที่ชื่นชม

14
ความยาวในอุดมคติของวิธีการสำหรับคุณคืออะไร? [ปิด]
ในการเขียนโปรแกรมเชิงวัตถุแน่นอนว่าไม่มีกฎที่แน่นอนเกี่ยวกับความยาวสูงสุดของวิธีการ แต่ฉันก็ยังพบว่าคำพูดสองคำนี้ขัดแย้งกันดังนั้นฉันอยากได้ยินสิ่งที่คุณคิด ในรหัสที่สะอาด: คู่มือของงานฝีมือซอฟต์แวร์เปรียว Robert Martin กล่าวว่า: กฎข้อแรกของฟังก์ชั่นคือมันควรมีขนาดเล็ก กฎข้อที่สองของฟังก์ชั่นคือควรมีขนาดเล็กกว่านั้น ฟังก์ชั่นไม่ควรยาว 100 บรรทัด ฟังก์ชั่นแทบจะไม่เคยมีความยาว 20 บรรทัด และเขายกตัวอย่างจากโค้ด Java ที่เขาเห็นจาก Kent Beck: ทุกฟังก์ชั่นในโปรแกรมของเขามีความยาวเพียงสองหรือสามหรือสี่บรรทัด แต่ละคนเห็นได้อย่างชัดเจน แต่ละคนเล่าเรื่อง และแต่ละคนก็นำคุณไปสู่ลำดับต่อไปที่น่าสนใจ นั่นเป็นสิ่งที่ฟังก์ชั่นของคุณควรสั้นลง! สิ่งนี้ฟังดูยอดเยี่ยม แต่ในทางกลับกันในCode Complete Steve McConnell พูดอะไรบางอย่างที่แตกต่างกันมาก: รูทีนควรได้รับอนุญาตให้เติบโตอย่างเป็นธรรมชาติถึง 100-200 บรรทัดหลักฐานหลายทศวรรษบอกว่ากิจวัตรที่มีความยาวดังกล่าวไม่มีข้อผิดพลาดเกิดขึ้นได้ง่าย และเขาให้การอ้างอิงถึงการศึกษาที่ระบุว่ากิจวัตร 65 บรรทัดหรือยาวกว่านั้นถูกกว่าเพื่อพัฒนา ดังนั้นในขณะที่มีการแยกความคิดเห็นเกี่ยวกับเรื่องนี้มีวิธีปฏิบัติที่ดีที่สุดสำหรับคุณหรือไม่?

6
"ตรรกะทางธุรกิจ" คืออะไร?
ฉันทำงานกับการพัฒนาเว็บไซต์ตั้งแต่ปี 2009 เมื่อฉันเริ่มต้นกับ PHP เมื่อฉันย้ายไปที่ ASP.NET ฉันได้ยินมากเกี่ยวกับ DDD และ OOAD ที่ให้ความสำคัญกับ "ตรรกะทางธุรกิจ" และ "กฎทางธุรกิจ" นี้ ประเด็นก็คือแอพทั้งหมดที่ฉันพัฒนาขึ้นจนถึงตอนนี้ล้วนเกี่ยวกับการทำงานของ CRUD และฉันไม่เคยเห็นสิ่งเหล่านี้มาใช้ในทางปฏิบัติ ฉันไม่สามารถจินตนาการได้ว่าสิ่งเหล่านั้นสามารถนำไปปฏิบัติได้จริง ๆ ดังนั้นตรรกะทางธุรกิจนี้คืออะไรและมันเข้ากับแอพได้อย่างไร ฉันรู้ว่าสิ่งเหล่านี้ถูกนำมาใช้เป็นวิธีการในแบบจำลองโดเมน แต่วิธีการเหล่านั้นอาจเป็นไปได้และในแอปพลิเคชันที่พวกเขาสามารถใช้งานได้

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

17
การห่อหุ้มยังคงเป็นหนึ่งในช้าง OOP ที่ยืนอยู่บน?
Encapsulation บอกให้ฉันสร้างฟิลด์ทั้งหมดหรือเกือบทั้งหมดเป็นส่วนตัวและแสดงสิ่งเหล่านี้โดย getters / setters แต่ตอนนี้ห้องสมุดเช่นลอมบอก@Dataปรากฏซึ่งช่วยให้เราเพื่อแสดงเขตข้อมูลส่วนตัวทั้งหมดของบันทึกย่อสั้น มันจะสร้าง getters, setters และการตั้งค่าคอนสตรัคเตอร์สำหรับฟิลด์ส่วนตัวทั้งหมด ใครสามารถอธิบายให้ฉันฟังได้ว่าอะไรคือความรู้สึกของการซ่อนเขตข้อมูลทั้งหมดเป็นส่วนตัวและหลังจากนั้นเพื่อเปิดเผยทั้งหมดของพวกเขาด้วยเทคโนโลยีพิเศษบางอย่าง ทำไมเราไม่ใช้เพียงช่องสาธารณะเท่านั้น? ฉันรู้สึกว่าเราได้เดินไกลและยากเพียงเพื่อกลับไปที่จุดเริ่มต้น ใช่มีเทคโนโลยีอื่น ๆ ที่ทำงานผ่าน getters และ setters และเราไม่สามารถใช้มันผ่านช่องสาธารณะที่เรียบง่าย แต่เทคโนโลยีเหล่านี้ปรากฏขึ้นเพราะเรามีคุณสมบัติมากมายเหล่านั้น - ฟิลด์ส่วนตัวที่อยู่เบื้องหลังผู้ได้รับ / setters สาธารณะ ถ้าเราไม่มีคุณสมบัติเทคโนโลยีเหล่านี้จะพัฒนาอีกวิธีหนึ่งและจะสนับสนุนเขตข้อมูลสาธารณะ และทุกอย่างจะง่ายและเราไม่ต้องการลอมบอกในตอนนี้ วงจรนี้มีความรู้สึกอย่างไร? และมีการห่อหุ้มจริงๆความรู้สึกใด ๆ ในขณะนี้ในการเขียนโปรแกรมในชีวิตจริง?

13
เราควรกำจัดตัวแปรท้องถิ่นถ้าทำได้หรือไม่?
ตัวอย่างเช่นเพื่อให้ซีพียูยังคงอยู่ใน Android ฉันสามารถใช้รหัสเช่นนี้: PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc"); wakeLock.acquire(); แต่ฉันคิดว่าตัวแปรท้องถิ่นpowerManagerและwakeLockสามารถกำจัดได้: ((PowerManager)getSystemService(POWER_SERVICE)) .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag") .acquire(); ฉากที่คล้ายกันจะปรากฏในมุมมองการแจ้งเตือนของ iOS เช่นจาก UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"my title" message:@"my message" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; [alert show]; -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ [alertView release]; } ไปที่: [[[UIAlertView alloc] initWithTitle:@"my title" message:@"my message" delegate:nil cancelButtonTitle:@"ok" …

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