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

หลักเกณฑ์ทั่วไปเกี่ยวกับวิธีการออกแบบคลาสด้วยวิธีปฏิบัติที่เป็นที่รู้จักมากที่สุดในอุตสาหกรรม

5
คุณจะย่อยสลายนวกรรมิกได้อย่างไร?
ให้บอกว่าฉันมีคลาสศัตรูและตัวสร้างจะมีลักษณะดังนี้: public Enemy(String name, float width, float height, Vector2 position, float speed, int maxHp, int attackDamage, int defense... etc.){} สิ่งนี้ดูไม่ดีนักเนื่องจากตัวสร้างมีพารามิเตอร์มากมาย แต่เมื่อฉันสร้างอินสแตนซ์ของศัตรูฉันต้องระบุทุกสิ่งเหล่านี้ ฉันต้องการคุณลักษณะเหล่านี้ในคลาส Enemy เพื่อให้สามารถวนซ้ำรายการของพวกเขาและรับ / ตั้งค่าพารามิเตอร์เหล่านี้ ฉันคิดว่าอาจจะ subclassing Enemy เป็น EnemyB, EnemyA ในขณะที่ hardcoding maxHp ของพวกเขาและคุณลักษณะเฉพาะอื่น ๆ แต่จากนั้นฉันก็จะสูญเสียการเข้าถึงคุณลักษณะ hardcoded ของพวกเขาหากฉันต้องการย้ำผ่านรายการ EnemyA ของ EnemyA และ EnemyB EnemyC ของ) ฉันแค่พยายามเรียนรู้วิธีการเขียนโค้ดให้สะอาด ถ้ามันสร้างความแตกต่างฉันทำงานใน Java …

9
เมื่อใดที่คุณควรใช้คลาสส่วนตัว / ชั้นใน
เพื่อชี้แจงสิ่งที่ฉันถามคือ public class A{ private/*or public*/ B b; } เมื่อเทียบกับ public class A{ private/*or public*/ class B{ .... } } ฉันสามารถนึกถึงเหตุผลบางอย่างที่จะใช้อย่างใดอย่างหนึ่ง แต่สิ่งที่ฉันอยากจะเห็นคือตัวอย่างที่น่าเชื่อถือที่แสดงให้เห็นว่าข้อดีและข้อเสียไม่ใช่แค่เรื่องวิชาการ

7
แนวคิดในการตั้งชื่อคลาสที่มีคำต่อท้าย“ ข้อมูล” เช่น:“ SomeClass” และ“ SomeClassInfo” คืออะไร
ฉันกำลังทำงานในโปรเจ็กต์ที่เกี่ยวข้องกับอุปกรณ์ทางกายภาพและฉันสับสนว่าจะตั้งชื่อคลาสบางคลาสในโครงการนี้ได้อย่างไร เมื่อพิจารณาถึงอุปกรณ์จริง (เซ็นเซอร์และตัวรับสัญญาณ) เป็นสิ่งหนึ่งและการเป็นตัวแทนของพวกเขาในซอฟต์แวร์นั้นเป็นอีกสิ่งหนึ่ง ตัวอย่างเช่นในขณะที่Sensorคลาสจะเป็นตัวแทนของเซ็นเซอร์จริง (เมื่อเชื่อมต่อกับอุปกรณ์ที่ใช้งานจริง) SensorInfoจะถูกใช้เพื่อแสดงเฉพาะคุณสมบัติของเซ็นเซอร์ดังกล่าว ตัวอย่างเช่นเมื่อบันทึกไฟล์ฉันจะทำให้เป็น a SensorInfoถึงส่วนหัวของไฟล์แทนการทำให้เป็นอันดับ a Sensorซึ่งเรียงลำดับของจะไม่ทำให้รู้สึก แต่ตอนนี้ฉันสับสนเพราะมีวงจรกลางในวงจรชีวิตของวัตถุที่ฉันไม่สามารถตัดสินใจได้ว่าฉันควรใช้อย่างใดอย่างหนึ่งหรืออื่นหรือวิธีการได้รับอย่างใดอย่างหนึ่งหรือแม้กระทั่งว่าตัวแปรทั้งสองควรจะยุบลงในชั้นเดียวเท่านั้น นอกจากนี้Employeeคลาสตัวอย่างที่ธรรมดาเกินไปก็ชัดเจนว่าเป็นเพียงตัวแทนของบุคคลจริง แต่ไม่มีใครแนะนำให้ตั้งชื่อชั้นเรียนEmployeeInfoแทนเท่าที่ฉันรู้ ภาษาที่ฉันทำงานด้วยคือ. NET และรูปแบบการตั้งชื่อนี้ดูเหมือนจะเป็นเรื่องทั่วไปตลอดทั้งเฟรมเวิร์กสำหรับตัวอย่างของคลาสเหล่านี้: DirectoryและDirectoryInfoชั้นเรียน FileและFileInfoชั้นเรียน ConnectionInfoชั้นเรียน (ไม่มีConnectionชั้นเรียนผู้สื่อข่าว); DeviceInfoชั้นเรียน (ไม่มีDeviceชั้นเรียนผู้สื่อข่าว); ดังนั้นคำถามของฉันคือ: มีเหตุผลทั่วไปเกี่ยวกับการใช้รูปแบบการตั้งชื่อนี้หรือไม่? มีกรณีที่เหมาะสมหรือไม่ที่จะมีชื่อคู่ ( ThingและThingInfo) และกรณีอื่น ๆ ที่ควรมีอยู่เฉพาะThingInfoคลาสหรือThingคลาสโดยไม่มีคู่

4
เหตุใดจึงกำหนดวัตถุ Java โดยใช้ส่วนต่อประสาน (เช่นแผนที่) แทนที่จะใช้งาน (HashMap)
ในรหัส Java ส่วนใหญ่ฉันเห็นคนประกาศวัตถุ Java เช่นนี้: Map<String, String> hashMap = new HashMap<>(); List<String> list = new ArrayList<>(); แทน: HashMap<String, String> hashMap = new HashMap<>(); ArrayList<String> list = new ArrayList<>(); ทำไมจึงมีการตั้งค่าเพื่อกำหนดวัตถุ Java โดยใช้อินเตอร์เฟซมากกว่าการใช้งานที่จะใช้จริง?

7
ชั้นเรียนที่ไม่เปลี่ยนแปลงกลายเป็นภาระในจุดใด?
เมื่อออกแบบคลาสเพื่อเก็บโมเดลข้อมูลของคุณฉันได้อ่านแล้วมันมีประโยชน์ในการสร้างออบเจ็กต์ที่ไม่เปลี่ยนรูป แต่ภาระหน้าที่ของรายการพารามิเตอร์คอนสตรัคเตอร์และสำเนาลึกกลายเป็นมากเกินไปและคุณต้องละทิ้งข้อ จำกัด ที่ไม่เปลี่ยน ตัวอย่างเช่นนี่คือคลาสที่ไม่เปลี่ยนรูปเพื่อแสดงสิ่งที่มีชื่อ (ฉันใช้ไวยากรณ์ C # แต่หลักการใช้กับภาษา OO ทั้งหมด) class NamedThing { private string _name; public NamedThing(string name) { _name = name; } public NamedThing(NamedThing other) { this._name = other._name; } public string Name { get { return _name; } } } สิ่งที่สร้างชื่อสามารถสร้างสอบถามและคัดลอกไปยังสิ่งที่ตั้งชื่อใหม่ แต่ไม่สามารถเปลี่ยนชื่อได้ ทั้งหมดนี้เป็นสิ่งที่ดี แต่จะเกิดอะไรขึ้นเมื่อฉันต้องการเพิ่มคุณสมบัติอื่น ฉันต้องเพิ่มพารามิเตอร์ให้กับตัวสร้างและอัปเดตตัวสร้างสำเนา ซึ่งไม่ทำงานมากเกินไป …

2
ทำให้เชื่องคลาส 'ฟังก์ชันยูทิลิตี้'
ใน codebase Java ของเราฉันเห็นรูปแบบต่อไปนี้: /** This is a stateless utility class that groups useful foo-related operations, often with side effects. */ public class FooUtil { public int foo(...) {...} public void bar(...) {...} } /** This class does applied foo-related things. */ class FooSomething { int DoBusinessWithFoo(FooUtil fooUtil, ...) { …

4
มันเป็น "ผิด" / การออกแบบที่ไม่ดีที่จะนำคนงานกระทู้ / พื้นหลังในชั้นเรียนหรือไม่?
ฉันมีชั้นเรียนที่จะอ่านจาก Excel (C # และ. Net 4) และในชั้นเรียนนั้นฉันมีผู้ทำงานเบื้องหลังที่จะโหลดข้อมูลจาก Excel ในขณะที่ UI สามารถตอบสนองได้ คำถามของฉันมีดังต่อไปนี้: การออกแบบที่ไม่ดีที่จะมีคนทำงานเบื้องหลังในชั้นเรียนหรือไม่? ฉันควรสร้างชั้นเรียนโดยไม่มีมันและใช้ผู้ทำงานเบื้องหลังเพื่อทำงานในชั้นเรียนนั้นหรือไม่? ฉันไม่เห็นปัญหาใด ๆ ในการสร้างชั้นเรียนของฉันด้วยวิธีนี้ แต่จากนั้นอีกครั้งฉันเป็นมือใหม่ดังนั้นฉันจึงคิดว่าฉันจะทำให้แน่ใจก่อนที่ฉันจะดำเนินการต่อ ฉันหวังว่าคำถามนี้เกี่ยวข้องกับที่นี่เพราะฉันไม่คิดว่ามันควรจะเป็นแบบ stackoverflow เนื่องจากรหัสของฉันทำงานได้นี่เป็นเพียงปัญหาการออกแบบ

7
เป็นความคิดที่ไม่ดีหรือไม่ที่ทำให้วิธีการเรียนที่ผ่านการเรียนตัวแปรหรือไม่
นี่คือสิ่งที่ฉันหมายถึง: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } addสามารถเข้าถึงตัวแปรทั้งหมดที่ต้องการได้แล้วเนื่องจากเป็นวิธีการเรียนดังนั้นนี่เป็นความคิดที่ไม่ดีหรือไม่? …

3
คลาส RxJava Flowable ถูกต้องตามกฎหมายสามารถมี 460 วิธีได้หรือไม่?
ฉันเพิ่งเริ่มต้นกับRxJavaการใช้ReactiveXของ Java (หรือที่เรียกว่าRxและReactive Extensions ) สิ่งที่ทำให้ฉันหลงไหลจริงๆคือขนาดที่ใหญ่ของคลาสFlowableของ RxJava : มันมี 460 วิธี! เพื่อความเป็นธรรม: มีวิธีการมากมายที่มากเกินไปซึ่งกระแทกจำนวนวิธีทั้งหมดอย่างมีนัยสำคัญ บางทีคลาสนี้ควรจะถูกทำลาย แต่ความรู้และความเข้าใจของฉันเกี่ยวกับ RxJava มี จำกัด มาก คนที่สร้าง RxJava นั้นฉลาดมากและพวกเขาสามารถเสนอข้อโต้แย้งที่ถูกต้องในการเลือกสร้างFlowableด้วยวิธีการมากมาย ในทางกลับกัน: RxJava เป็นการใช้งาน Java ของส่วนขยายรีแอกทีฟของMicrosoftและนั่นไม่ได้มีคลาสFlowableดังนั้นนี่ไม่ใช่กรณีของการย้ายคลาสที่มีอยู่แบบสุ่มและนำไปใช้ใน Java [ อัปเดต:จุดก่อนหน้าในตัวเอียงไม่ถูกต้องตามจริง: คลาสObservableของ Microsoft ซึ่งมีมากกว่า 400 วิธีใช้เป็นพื้นฐานสำหรับคลาสObservableของ RxJava และFlowableนั้นคล้ายกับObservableแต่จัดการ backpressure สำหรับข้อมูลจำนวนมาก ดังนั้นทีม RxJava จึงย้ายคลาสที่มีอยู่ โพสต์นี้น่าจะท้าทายการออกแบบเดิมของคลาสObservableโดย Microsoft มากกว่าคลาสFlowableของ RxJava ] RxJava อายุน้อยกว่า 3 …

4
รูปแบบความรับผิดชอบเดี่ยวควรมีรูปแบบเฉพาะสำหรับชั้นเรียนอย่างไร
ตัวอย่างเช่นสมมติว่าคุณมีโปรแกรมเกมคอนโซลซึ่งมีวิธีอินพุต / เอาต์พุตทุกชนิดเข้าและออกจากคอนโซล มันจะเป็นสมาร์ทเพื่อให้พวกเขาทั้งหมดในครั้งเดียวinputOutputชั้นเรียนหรือทำลายพวกเขาลงไปเรียนที่เฉพาะเจาะจงมากขึ้นเช่นstartMenuIO, inGameIO, playerIO, gameBoardIOฯลฯ ดังกล่าวว่าแต่ละชั้นจะมีประมาณ 1-5 วิธี? และเมื่อทราบเหมือนกันถ้ามันจะดีกว่าที่จะทำลายพวกเขาลงมันจะเป็นสมาร์ทที่จะวางไว้ในIOnamespace จึงทำให้เรียกพวกเขาเล็ก ๆ น้อย ๆ มากขึ้นอย่างละเอียดเช่น: IO.inGameฯลฯ ?

5
คลาสพื้นฐานเป็นโรงงาน
ฉันเขียนโค้ดในช่วงสุดสัปดาห์และพบว่าตัวเองต้องการเขียนโรงงานเป็นวิธีการคงที่ในคลาสฐาน คำถามของฉันคือการรู้ว่า ac # idomatic approach หรือไม่? ความรู้สึกของฉันที่อาจไม่ได้มาจากความจริงที่ว่าชั้นฐานมีความรู้เกี่ยวกับชั้นเรียนที่ได้รับ ที่กล่าวว่าฉันไม่แน่ใจว่าวิธีที่ง่ายกว่าเพื่อให้ได้ผลลัพธ์เดียวกัน คลาสโรงงานอื่นทั้งดูเหมือน (อย่างน้อยฉัน) เช่นความซับซ้อนที่ไม่จำเป็น (?) สิ่งที่ต้องการ: class Animal { public static Animal CreateAnimal(string name) { switch(name) { case "Shark": return new SeaAnimal(); break; case "Dog": return new LandAnimal(); break; default: throw new Exception("unknown animal"); } } } class LandAnimal : Animal { …
14 c#  class-design 

3
คลาสฐานนามธรรมพร้อมอินเทอร์เฟซเป็นพฤติกรรม
ฉันต้องออกแบบลำดับชั้นของชั้นเรียนสำหรับโครงการ C # ของฉัน โดยพื้นฐานแล้วฟังก์ชันของคลาสนั้นคล้ายกับคลาสของ WinForms ดังนั้นให้ลองใช้ชุดเครื่องมือ WinForms เป็นตัวอย่าง (อย่างไรก็ตามฉันไม่สามารถใช้ WinForms หรือ WPF ได้) มีคุณสมบัติและฟังก์ชั่นหลักบางอย่างที่ทุกชั้นต้องการ ขนาดตำแหน่งสีการมองเห็น (จริง / เท็จ) วิธีการวาด ฯลฯ ฉันต้องการคำแนะนำด้านการออกแบบฉันใช้การออกแบบที่มีคลาสเบสและอินเทอร์เฟซที่เป็นนามธรรมซึ่งไม่ใช่ประเภทจริง ๆ แต่ชอบพฤติกรรมมากกว่า นี่เป็นการออกแบบที่ดีหรือไม่? ถ้าไม่สิ่งที่จะเป็นการออกแบบที่ดีกว่า รหัสมีลักษณะดังนี้: abstract class Control { public int Width { get; set; } public int Height { get; set; } public int BackColor { get; …

2
ออกแบบ: วิธีการวัตถุกับวิธีการแยกชั้นซึ่งใช้วัตถุเป็นพารามิเตอร์?
ตัวอย่างเช่นจะดีกว่าที่จะทำ: Pdf pdf = new Pdf(); pdf.Print(); หรือ: Pdf pdf = new Pdf(); PdfPrinter printer = new PdfPrinter(); printer.Print(pdf); ตัวอย่างอื่น: Country m = new Country("Mexico"); double ratio = m.GetDebtToGDPRatio(); หรือ: Country m = new Country("Mexico"); Country us = new Country("US"); DebtStatistics ds = new DebtStatistics(); double usRatio = ds.GetDebtToGDPRatio(us); double …

4
ชั้นเรียนขนาดใหญ่ที่มีความรับผิดชอบเดียว
ฉันมีCharacterคลาสline 2,500 ที่: ติดตามสถานะภายในของตัวละครในเกม โหลดและยืนยันสถานะนั้น จัดการคำสั่งที่เข้ามา ~ 30 (โดยปกติ = ส่งต่อคำสั่งไปยังGameแต่คำสั่งแบบอ่านอย่างเดียวบางคำสั่งจะตอบกลับทันที) รับสายประมาณ 80 สายจากGameการกระทำที่ต้องทำและการกระทำที่เกี่ยวข้องของผู้อื่น ดูเหมือนว่าฉันCharacterมีความรับผิดชอบเดียว: การจัดการสถานะของตัวละคร, การไกล่เกลี่ยระหว่างคำสั่งที่เข้ามาและเกม มีความรับผิดชอบอื่น ๆ อีกสองสามอย่างที่ถูกทำลายไปแล้ว: Characterมีสิ่งOutgoingที่เรียกร้องให้สร้างการอัพเดตขาออกสำหรับแอปพลิเคชันไคลเอนต์ CharacterมีTimerแทร็กใดที่อนุญาตให้ทำอะไรต่อไป คำสั่งที่เข้ามาจะถูกตรวจสอบกับสิ่งนี้ ดังนั้นคำถามของฉันคือเป็นที่ยอมรับหรือไม่ที่จะมีชั้นเรียนขนาดใหญ่ภายใต้ SRP และหลักการที่คล้ายกัน? มีวิธีปฏิบัติที่ดีที่สุดในการทำให้ยุ่งยากน้อยลงหรือไม่ (เช่นอาจแบ่งวิธีเป็นไฟล์แยกกัน) หรือฉันขาดอะไรบางอย่างไปและมีวิธีที่ดีมากที่จะแยกมันออกมา? ฉันรู้ว่านี่เป็นอัตนัยและต้องการความคิดเห็นจากผู้อื่น นี่คือตัวอย่าง: class Character(object): def __init__(self): self.game = None self.health = 1000 self.successful_attacks = 0 self.points = 0 self.timer = Timer() …

2
ฉันควรเปิดเผยค่า“ คำนวณ” เป็นคุณสมบัติหรือวิธีการหรือไม่?
ฉันมีคลาส C # ที่แสดงประเภทเนื้อหาในระบบการจัดการเนื้อหาเว็บ เรามีฟิลด์ที่อนุญาตให้แก้ไขเนื้อหาเว็บเพื่อป้อนเทมเพลต HTML สำหรับวิธีการแสดงวัตถุ โดยพื้นฐานแล้วมันใช้ไวยากรณ์แฮนด์บาร์สำหรับการแทนที่ค่าคุณสมบัติวัตถุลงในสตริง HTML: <h1>{{Title}}</h1><p>{{Message}}</p> จากมุมมองการออกแบบคลาสฉันควรแสดงสตริง HTML ที่จัดรูปแบบ (พร้อมการแทนที่) เป็นคุณสมบัติหรือวิธีการหรือไม่ ตัวอย่างเช่นคุณสมบัติ: public class Example { private string _template; public string Title { get; set; } public string Message { get; set; } public string Html { get { return this.ToHtml(); } protected set { } …

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