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

การออกแบบเชิงวัตถุเป็นกระบวนการของการวางแผนระบบการโต้ตอบวัตถุเพื่อการแก้ปัญหาซอฟต์แวร์

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

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

14
Gang of Four สำรวจ“ Pattern Space” หรือไม่?
นับตั้งแต่ครั้งแรกที่ผมได้เรียนรู้เกี่ยวกับแก๊งสี่ (GoF) รูปแบบการออกแบบอย่างน้อย 10 ปีที่ผ่านมาฉันมีความประทับใจที่เหล่านี้ 23 รูปแบบที่ควรจะเป็นเพียงตัวอย่างเล็ก ๆ ของสิ่งที่มีขนาดใหญ่มากซึ่งผมชอบที่จะเรียกพื้นที่รูปแบบ Pattern Spaceสมมุตินี้ประกอบด้วยโซลูชันที่แนะนำทั้งหมด (รู้จักหรือไม่รู้จัก) สำหรับปัญหาการออกแบบซอฟต์แวร์เชิงวัตถุทั่วไป ดังนั้นฉันจึงคาดว่าจำนวนของรูปแบบการออกแบบที่เป็นที่รู้จักและจัดทำเอกสารจะเพิ่มขึ้นอย่างมีนัยสำคัญ มันไม่ได้เกิดขึ้น มากกว่า 20 ปีหลังจากหนังสือ GoF ออกมามีเพียง 12 รูปแบบเพิ่มเติมที่ปรากฏในบทความ Wikipedia ซึ่งส่วนใหญ่เป็นที่นิยมน้อยกว่าต้นฉบับมาก (ฉันไม่ได้รวมรูปแบบการทำงานพร้อมกันที่นี่เพราะครอบคลุมหัวข้อเฉพาะ) อะไรคือเหตุผล? ชุดรูปแบบของ GoF จริง ๆ แล้วครอบคลุมกว่าที่ฉันคิดหรือไม่ ความสนใจในการหารูปแบบใหม่ลดลงหรืออาจเป็นเพราะพวกเขาพบว่าไม่ใช่ทุกสิ่งที่มีประโยชน์ในการออกแบบซอฟต์แวร์? อื่น ๆ อีก?

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 เท่านั้น ใครบ้างที่ต่อสู้กับสิ่งนี้? ความช่วยเหลือหรือข้อมูลเชิงลึกใด ๆ ที่ชื่นชม

10
นี่เป็นการละเมิดหลักการทดแทน Liskov หรือไม่?
สมมติว่าเรามีรายการของเอนทิตีงานและProjectTaskประเภทย่อย สามารถปิดงานได้ตลอดเวลายกเว้นงานProjectTasksที่ไม่สามารถปิดได้เมื่อพวกเขามีสถานะเป็นเริ่มต้น UI ควรตรวจสอบให้แน่ใจว่าไม่มีตัวเลือกในการปิดการเริ่มต้นทำงานProjectTaskแต่มีการป้องกันบางอย่างในโดเมน: public class Task { public Status Status { get; set; } public virtual void Close() { Status = Status.Closed; } } public class ProjectTask : Task { public override void Close() { if (Status == Status.Started) throw new Exception("Cannot close a started Project Task"); base.Close(); } …

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

13
คุณจะปรับรหัสเพิ่มเติมให้ถูกเขียนโดยทำตามวิธีปฏิบัติที่สะอาดของรหัสได้อย่างไร
ผู้ดำเนินรายการหมายเหตุ คำถามนี้มีคำตอบแล้วสิบเจ็ดคำตอบแล้ว ก่อนที่คุณจะโพสต์คำตอบใหม่โปรดอ่านคำตอบที่มีอยู่และตรวจสอบให้แน่ใจว่ามุมมองของคุณยังไม่ครอบคลุมเพียงพอ ฉันได้ปฏิบัติตามแนวทางปฏิบัติบางข้อที่แนะนำในหนังสือ "Clean Code" ของ Robert Martin โดยเฉพาะอย่างยิ่งวิธีการที่ใช้กับซอฟต์แวร์ประเภทที่ฉันทำงานด้วยและแนวทางที่เหมาะสมกับฉัน (ฉันไม่ปฏิบัติตามแนวคิด) . ผลข้างเคียงหนึ่งที่ฉันสังเกตเห็นคือรหัส "สะอาด" ที่ฉันเขียนนั้นเป็นรหัสมากกว่าที่ฉันไม่ได้ปฏิบัติตาม แนวทางปฏิบัติเฉพาะที่นำไปสู่สิ่งนี้คือ: Encapsulating conditionals ดังนั้นแทนที่จะ if(contact.email != null && contact.emails.contains('@') ฉันสามารถเขียนวิธีการขนาดเล็กเช่นนี้ private Boolean isEmailValid(String email){...} การแทนที่ความคิดเห็นแบบอินไลน์ด้วยวิธีส่วนตัวอื่น ๆ เพื่อให้ชื่อวิธีการอธิบายตัวเองมากกว่าที่จะมีความคิดเห็นแบบอินไลน์ด้านบนของมัน คลาสควรมีเหตุผลเดียวเท่านั้นที่จะเปลี่ยน และอีกไม่กี่คน ประเด็นคือสิ่งที่อาจเป็นวิธีการ 30 บรรทัดกลายเป็นชั้นเรียนเพราะวิธีการเล็ก ๆ ที่แทนที่ความคิดเห็นและ encapsulate เงื่อนไข ฯลฯ เมื่อคุณรู้ว่าคุณมีวิธีการมากมายแล้วมัน "เข้าท่า" เพื่อ ใส่ฟังก์ชั่นทั้งหมดไว้ในคลาสเดียวเมื่อจริง ๆ แล้วมันควรเป็นวิธี ฉันทราบว่าการฝึกฝนใด ๆ …

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

9
เหตุใดฉันจึงควรใช้การฉีดพึ่งพา
ฉันมีช่วงเวลาที่ยากมองหาแหล่งข้อมูลเกี่ยวกับทำไมฉันจึงควรใช้ฉีดพึ่งพา ทรัพยากรส่วนใหญ่ที่ฉันเห็นอธิบายว่ามันเพิ่งผ่านอินสแตนซ์ของวัตถุไปยังอีกอินสแตนซ์ของวัตถุ แต่ทำไม? นี่เป็นเพียงสถาปัตยกรรม / รหัสที่สะอาดขึ้นหรือมีผลกระทบต่อประสิทธิภาพโดยรวมหรือไม่ ทำไมฉันต้องทำสิ่งต่อไปนี้? class Profile { public function deactivateProfile(Setting $setting) { $setting->isActive = false; } } แทนที่จะเป็นดังต่อไปนี้? class Profile { public function deactivateProfile() { $setting = new Setting(); $setting->isActive = false; } }

4
รูปแบบโดเมนที่หลากหลาย - พฤติกรรมนั้นเข้ากันได้อย่างไร
ในการอภิปรายเกี่ยวกับโมเดลโดเมน Rich and Anemic อินเทอร์เน็ตเต็มไปด้วยคำแนะนำทางปรัชญา แต่ย่อมาจากตัวอย่างที่เชื่อถือได้ วัตถุประสงค์ของคำถามนี้คือการหาแนวทางที่ชัดเจนและตัวอย่างที่เป็นรูปธรรมของโมเดลการออกแบบที่ขับเคลื่อนด้วยโดเมนที่เหมาะสม (นึกคิดใน C #.) สำหรับตัวอย่างในโลกแห่งความจริงการใช้ DDD นี้ดูเหมือนจะผิด: โดเมน WorkItem รุ่นด้านล่างไม่มีอะไรนอกจากถุงคุณสมบัติซึ่ง Entity Framework ใช้สำหรับฐานข้อมูลรหัสแรก ต่อฟาวเลอร์ก็เป็นโรคโลหิตจาง เห็นได้ชัดว่าชั้น WorkItemService เป็นความเข้าใจผิดทั่วไปของบริการโดเมน มันมีพฤติกรรม / ตรรกะทางธุรกิจทั้งหมดสำหรับ WorkItem ต่อ Yemelyanov และคนอื่น ๆ ก็เป็นขั้นตอน (หน้า 6) ดังนั้นถ้าด้านล่างผิดฉันจะทำให้ถูกต้องได้อย่างไร พฤติกรรมเช่นAddStatusUpdateหรือCheckoutควรเป็นของคลาส WorkItem ที่ถูกต้องหรือไม่ แบบจำลอง WorkItem ควรพึ่งพาอะไร? public class WorkItemService : IWorkItemService { private IUnitOfWorkFactory _unitOfWorkFactory; …

11
เหตุใดจึงเป็นพื้นฐานสำหรับวัตถุทั้งหมดท้อแท้ใน C ++
Stroustrup กล่าวว่า "อย่าคิดค้นฐานเฉพาะสำหรับคลาสทั้งหมดของคุณ (คลาส Object) โดยทันทีคุณสามารถทำได้ดีกว่านี้หากไม่มีคลาสที่มากที่สุด / ส่วนใหญ่" (ภาษา C ++ ภาษาที่สี่รุ่น Sec 1.3.4) ทำไมพื้นฐานสำหรับทุกสิ่งโดยทั่วไปเป็นความคิดที่ไม่ดีและเมื่อใดที่เหมาะสมที่จะสร้าง

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

12
มีการตั้งค่าสถานะเพื่อระบุว่าเราควรผิดพลาดหรือไม่
ฉันเพิ่งเริ่มทำงานในที่ที่มีผู้พัฒนาอายุมาก (ประมาณ 50 ปีขึ้นไป) พวกเขาทำงานเกี่ยวกับแอพพลิเคชั่นที่สำคัญเกี่ยวกับการบินที่ระบบไม่สามารถลงได้ เป็นผลให้โปรแกรมเมอร์ที่มีอายุมากกว่ามีแนวโน้มที่จะรหัสด้วยวิธีนี้ เขามีแนวโน้มที่จะวางบูลีนในวัตถุเพื่อระบุว่าควรโยนข้อยกเว้นหรือไม่ ตัวอย่าง public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (ในโครงการของเราวิธีการอาจล้มเหลวเนื่องจากเราพยายามใช้อุปกรณ์เครือข่ายที่ไม่สามารถแสดงได้ในเวลาตัวอย่างพื้นที่เป็นเพียงตัวอย่างของการตั้งค่าสถานะข้อยกเว้น) สำหรับฉันนี่ดูเหมือนรหัสกลิ่น การเขียนการทดสอบหน่วยจะซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องทดสอบการตั้งค่าสถานะข้อยกเว้นในแต่ละครั้ง นอกจากนี้หากมีสิ่งผิดปกติคุณไม่ต้องการรู้ทันทีหรือไม่? ไม่ควรเป็นความรับผิดชอบของผู้โทรที่จะกำหนดวิธีดำเนินการต่อ ตรรกะ / เหตุผลของเขาคือโปรแกรมของเราต้องการทำสิ่งหนึ่งแสดงข้อมูลให้ผู้ใช้ ข้อยกเว้นอื่นใดที่ไม่ได้ห้ามไม่ให้เราทำเช่นนั้นควรเพิกเฉย ฉันยอมรับว่าพวกเขาไม่ควรเพิกเฉย แต่ควรทำให้เกิดฟองและจัดการโดยบุคคลที่เหมาะสมและไม่จำเป็นต้องจัดการกับสถานะสำหรับสิ่งนั้น นี่เป็นวิธีที่ดีในการจัดการข้อยกเว้นหรือไม่ …

10
“ ผู้ใช้ไม่ควรตัดสินใจว่าเป็นผู้ดูแลหรือไม่ ควรมีสิทธิ์หรือระบบรักษาความปลอดภัย”
ตัวอย่างที่ใช้ในคำถามผ่านข้อมูลขั้นต่ำเปลือยไปยังฟังก์ชั่นสัมผัสกับวิธีที่ดีที่สุดเพื่อตรวจสอบว่าผู้ใช้เป็นผู้ดูแลหรือไม่ หนึ่งคำตอบทั่วไปคือ: user.isAdmin() สิ่งนี้กระตุ้นให้เกิดความคิดเห็นซึ่งซ้ำหลายครั้งและได้รับการโหวตหลายครั้ง: ผู้ใช้ไม่ควรตัดสินใจว่าเป็นผู้ดูแลระบบหรือไม่ สิทธิพิเศษหรือระบบความปลอดภัยควร สิ่งที่อยู่คู่กับชั้นเรียนแน่นไม่ได้หมายความว่าเป็นความคิดที่ดีที่จะทำให้มันเป็นส่วนหนึ่งของชั้นเรียนนั้น ฉันตอบ ผู้ใช้ไม่ได้ตัดสินใจอะไร วัตถุผู้ใช้ / ตารางเก็บข้อมูลเกี่ยวกับผู้ใช้แต่ละคน ผู้ใช้จริงไม่ได้เปลี่ยนทุกอย่างเกี่ยวกับตัวเอง แต่นี่ไม่ได้ผล เห็นได้ชัดว่ามีความแตกต่างพื้นฐานของมุมมองซึ่งทำให้การสื่อสารเป็นเรื่องยาก มีคนอธิบายให้ฉันฟังได้ไหมว่าทำไม user.isAdmin () ไม่ดีและวาดภาพร่างสั้น ๆ ของสิ่งที่ดูเหมือน "ถูกต้อง" จริงๆฉันไม่เห็นข้อดีของการแยกการรักษาความปลอดภัยจากระบบที่ปกป้อง ข้อความความปลอดภัยใด ๆ จะกล่าวว่าความปลอดภัยต้องได้รับการออกแบบเข้าสู่ระบบตั้งแต่เริ่มต้นและพิจารณาในทุกขั้นตอนของการพัฒนาการปรับใช้การบำรุงรักษาและแม้กระทั่งจุดสิ้นสุดของชีวิต ไม่ใช่สิ่งที่สามารถยึดติดกับด้านข้างได้ แต่ 17 คะแนนขึ้นไปจนถึงความคิดเห็นนี้บอกว่าฉันไม่มีอะไรสำคัญ

9
ชั้นเรียนที่มีวิธีการเดียว (สาธารณะ) เป็นปัญหาหรือไม่?
ฉันกำลังทำงานในโครงการซอฟต์แวร์ที่ทำการบีบอัดและจัดทำดัชนีวิดีโอคลิปการเฝ้าระวังวิดีโอ การบีบอัดทำงานโดยการแยกพื้นหลังและวัตถุเบื้องหน้าจากนั้นให้บันทึกพื้นหลังเป็นภาพนิ่งและส่วนหน้าเป็นสไปรต์ เมื่อเร็ว ๆ นี้ฉันได้เริ่มต้นการทบทวนบางคลาสที่ฉันออกแบบมาสำหรับโครงการ ฉันสังเกตเห็นว่ามีหลายคลาสที่มีวิธีการสาธารณะเพียงครั้งเดียวเท่านั้น บางส่วนของชั้นเรียนเหล่านี้คือ: VideoCompressor (ด้วยcompressวิธีการที่ใช้ในวิดีโออินพุตประเภทRawVideoและส่งกลับวิดีโอประเภทเอาต์พุตCompressedVideo) VideoSplitter (ด้วยsplitวิธีที่ใช้ในอินพุตวิดีโอประเภทRawVideoและส่งคืนเวกเตอร์ของวิดีโอเอาต์พุต 2 ชนิดแต่ละประเภทRawVideo) VideoIndexer (ด้วยindexวิธีที่ใช้ในวิดีโออินพุตประเภทRawVideoและส่งกลับดัชนีวิดีโอประเภทVideoIndex) ฉันพบตัวเอง instantiating แต่ละชั้นเรียนเพียงเพื่อให้สายเช่นVideoCompressor.compress(...), ,VideoSplitter.split(...)VideoIndexer.index(...) บนพื้นผิวฉันคิดว่าชื่อชั้นเรียนมีความหมายเพียงพอของฟังก์ชั่นที่ตั้งใจไว้และเป็นคำนามจริง ๆ ตามลําดับวิธีการของพวกเขายังเป็นคำกริยา ปัญหานี้จริงหรือ

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