การออกแบบเชิงวัตถุ


23

สมมติว่าคุณมีสิ่งต่อไปนี้:

     +--------+     +------+
     | Animal |     | Food |
     +-+------+     +----+-+
       ^                 ^
       |                 |
       |                 |
  +------+              +-------+
  | Deer |              | Grass |
  +------+              +-------+

DeerสืบทอดจากAnimalและสืบทอดจากGrassFood

จนถึงตอนนี้ดีมาก AnimalวัตถุสามารถกินFoodวัตถุ

ทีนี้ลองผสมกันหน่อย ช่วยเพิ่มซึ่งสืบทอดมาจากLionAnimal

     +--------+     +------+
     | Animal |     | Food |
     +-+-----++     +----+-+
       ^     ^           ^
       |     |           |
       |     |           |
  +------+ +------+     +-------+
  | Deer | | Lion |     | Grass |
  +------+ +------+     +-------+

ตอนนี้เรามีมีปัญหาเพราะLionสามารถที่จะกินทั้งDeerและGrassแต่Deerไม่ได้ มันเป็นFoodAnimal

เมื่อใช้หลายมรดกและใช้การออกแบบเชิงวัตถุคุณจะแก้ปัญหานี้ได้อย่างไร

FYI: ฉันใช้http://www.asciiflow.comเพื่อสร้างแผนภาพ ASCII


14
การสร้างแบบจำลองโลกแห่งความเป็นจริงมักจะมีปัญหาไม่ช้าก็เร็วเพราะมีบางสิ่งแปลก ๆ เกิดขึ้นอยู่เสมอ (เช่นปลาบินปลาหรือนก?) แต่นกเพนกวินเป็นนกไม่สามารถบินและกินปลาได้) @Ampt พูดว่าอะไรเป็นไปได้สัตว์ควรมีของสะสมที่กิน
Rob van der Veer

2
ฉันคิดว่าสัตว์ควรสืบทอดจากอาหาร หากมีสิ่งใดที่พยายามจะกินสิงโตเพียงแค่โยน InvalidOperationException
RalphChapin

4
@RalphChapin: ทุกสิ่งกินสิงโต (แร้งบั๊ก ฯลฯ ) ฉันคิดว่าสัตว์และอาหารเป็นสิ่งประดิษฐ์ที่แตกต่างเพราะมันไม่กว้างพอ (สัตว์ทุกตัวเป็นอาหารสัตว์อื่น ๆ ในที่สุด) หากคุณจัดอยู่ใน "LivingThing" คุณจะต้องจัดการกับคดีขอบที่มีพืชที่กินสิ่งไม่มีชีวิต (แร่ธาตุ ฯลฯ ) และมันจะไม่ทำลายสิ่งใดเลยที่จะมี LivingThing.Eat (LivingThing)
Satanicpuppy

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

9
เกมนี้ตอบคำถามแล้ว Age of Empire III ageofempires.wikia.com/wiki/List_of_Animals ใช้กวางและละมั่งIHuntableแกะและวัวเป็นIHerdable(สามารถควบคุมได้โดยมนุษย์) และ Lion เท่านั้นที่ใช้ IAnimal ซึ่งไม่ได้บ่งบอกถึงอินเทอร์เฟซเหล่านั้น AOE3 รองรับการสอบถามชุดอินเทอร์เฟซที่รองรับโดยวัตถุเฉพาะ (คล้ายกับinstanceof) ซึ่งอนุญาตให้โปรแกรมสืบค้นความสามารถของมัน

คำตอบ:


38

ความสัมพันธ์คือสิ่งที่สืบทอด =

สิงโตเป็นสัตว์

มีความสัมพันธ์ A = องค์ประกอบ

รถยนต์มีล้อ

สามารถทำความสัมพันธ์ = การเชื่อมต่อ

ICanEat


5
+1 นั้นง่ายมากและยังได้ข้อสรุปที่ดีเกี่ยวกับความสัมพันธ์ 3 ประเภทที่แตกต่างกัน
dreza

4
ทางเลือก: ICanBeEatenหรือIEdible
ไมค์เวลเลอร์

2
CAN HAZ สัมพันธ์ = lolcats
Steven A. Lowe

1
คำถามนี้จะตอบคำถามได้อย่างไร
user253751

13

OO เป็นเพียงคำอุปมาที่เลียนแบบตัวเองหลังจากโลกแห่งความจริง แต่คำอุปมาอุปมัยเพียงไปไกล

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

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

ฉันไม่ได้ตอบคำถามอย่างแม่นยำเพราะเราไม่มีข้อมูลโดเมน แต่ด้วยเหตุผลข้างต้นคุณอาจออกแบบสิ่งที่เหมาะกับความต้องการของคุณ


3
+1 OO เป็นเครื่องมือไม่ใช่ศาสนา
mouviciel

ฉันเห็นด้วยอาจไม่มีวิธีแก้ปัญหาที่สมบูรณ์แบบหากปัญหานี้ยังคงมีการเปลี่ยนแปลงและมีวิวัฒนาการ ในสถานะปัจจุบันปัญหานี้ไม่มีข้อมูลโดเมนหรือไม่
Michael Irey

คุณคิดว่าโลกแห่งความจริงกำลังถูกจำลองใน OP หรือไม่? รูปแบบความสัมพันธ์จะแสดงผ่านตัวอย่าง
Basilevs

@Basilevs นั่นเป็นสิ่งที่มีความหมายจริงๆแล้วเพราะเขาพูดถึงว่าสัตว์มีพฤติกรรมอย่างไรในชีวิตจริง เราจำเป็นต้องคำนึงถึงสาเหตุว่าทำไมจึงต้องมีพฤติกรรมดังกล่าวในโปรแกรม IMO ที่กล่าวว่ามันจะดีของฉันที่จะแนะนำการออกแบบที่เป็นไปได้บางอย่าง
DPM

10

คุณต้องการแยกย่อยสัตว์ออกเป็นคลาสย่อย (หรืออย่างน้อยก็เท่าที่เหมาะสมสำหรับสิ่งที่คุณกำลังทำ) เนื่องจากคุณกำลังทำงานกับสิ่งที่ดูเหมือนสัตว์พื้นฐานและอาหารสองประเภท (พืชและเนื้อสัตว์) คุณควรใช้สัตว์กินเนื้อและสัตว์กินพืชเพื่อกำหนดสัตว์เพิ่มเติมและแยกพวกมันออกจากกัน นี่คือสิ่งที่ฉันดึงมาให้คุณ

             +----------------+                   +--------------------+
             |    Animal      |                   |      Food          |
             |----------------|<--+Interfaces+--->|--------------------|
             |                |                   |                    |
             +----------------+                   +--------------------+
                +           +                       +                 +
                |           |    Abstract Classes   |                 |
                |           |        |          |   |                 |
                v           v        v          v   v                 v
   +-----------------+  +----------------+     +------------+      +------------+
   |   Herbivore     |  |  Carnivore     |     |   Plant    |      |   Meat     |
   |-----------------|  |----------------|     |------------|      |------------|
   |Eat(Plant p)     |  |Eat(Meat m)     |     |            |      |            |
   |                 |  |                |     |            |      |            |
   +-----------------+  +----------------+     +------------+      +------------+
            +                    +                    +                   +
            |                    |                    |                   |
            v                    v                    v                   v
   +-----------------+  +----------------+     +------------+      +------------+
   |  Deer           |  |   Lion         |     |  Grass     |      |  DeerMeat  |
   |-----------------|  |----------------|     |------------|      |------------|
   |DeerMeat Die()      |void Kill(Deer) |     |            |      |            |
   +-----------------+  +----------------+     +------------+      +------------+
                                 ^                    ^
                                 |                    |
                                 |                    |
                              Concrete Classes -------+

อย่างที่คุณเห็นพวกเขาทั้งคู่เปิดเผยวิธีกิน แต่สิ่งที่พวกเขากินเปลี่ยนไป ตอนนี้สิงโตสามารถฆ่ากวางได้กวางสามารถตายและคืน DeerMeat ได้และคำถามเดิมเกี่ยวกับการอนุญาตให้สิงโตกินกวาง แต่ไม่ตอบหญ้าโดยไม่มีระบบนิเวศทั้งหมด

แน่นอนว่าสิ่งนี้น่าสนใจอย่างรวดเร็วเพราะกวางสามารถพิจารณาเนื้อสัตว์ชนิดหนึ่งได้เช่นกัน แต่เพื่อให้ง่ายขึ้นฉันจะสร้างวิธีที่เรียกว่า kill () ใต้กวางซึ่งจะส่งเนื้อกวางกลับมา ชั้นคอนกรีตขยายเนื้อสัตว์


Deer จะเปิดเผยอินเตอร์เฟส IMeat หรือไม่
Dan Pichelman

เนื้อสัตว์ไม่ใช่ส่วนต่อประสาน แต่เป็นระดับนามธรรม ฉันได้เพิ่มวิธีที่ฉันจะใช้สำหรับคุณ
Ampt

Eat(Plant p) และ Eat(Meat m)ทั้งคู่ละเมิด LSP
Tulains Córdova

เป็นอย่างไร @ user61852 ฉันตั้งใจจะไม่เปิดเผย Eat in the interface สัตว์เพื่อให้สัตว์แต่ละชนิดมีวิธีการกินของตัวเอง
Ampt

1
TCWL (ซับซ้อนเกินไปจะรั่วไหล) ปัญหามีการกระจายและเกิดขึ้นได้และโซลูชันของคุณเป็นแบบคงที่รวมศูนย์และกำหนดไว้ล่วงหน้า TCWL
Tulains Córdova

7

การออกแบบของฉันจะเป็นเช่นนี้:

  1. อาหารถูกประกาศเป็นอินเทอร์เฟซ มีอินเทอร์เฟซ IFood และอินเทอร์เฟซที่สืบเนื่องสองส่วนจากนั้น: IMeat และ IVegetable
  2. สัตว์ใช้ IMeat และผักใช้ IVegetable
  3. สัตว์มีลูกหลานสองคนคือ Carnivores และ Hebivores
  4. สัตว์กินเนื้อมีวิธีกินที่ได้รับตัวอย่างของ IMeat
  5. สัตว์กินพืชมีวิธีกินที่ได้รับตัวอย่างของ IVegetable
  6. สิงโตลงมาจากสัตว์กินเนื้อ
  7. กวางลงมาจาก Herbivore
  8. หญ้าลงมาจากผัก

เพราะสัตว์ใช้ IMeat และ Deer เป็นสัตว์ (Herbivore) Lion ซึ่งเป็นสัตว์ (Carnivore) ที่สามารถกิน IMeat ได้ก็สามารถกิน Deer ได้

Deer เป็น Herbivore ดังนั้นจึงสามารถกิน Grass ได้เนื่องจากใช้ IVegetable

Carnivores ไม่สามารถกิน IVegeable และ Herbivores ไม่สามารถกิน IMeat ได้


1
ฉันเห็นประเภทการแจงนับจำนวนมากที่นี่โดยใช้การสืบทอดเพียงเพื่อ จำกัด เวลาที่การสืบทอดนั้นไม่ได้ใช้อะไรเลย ... เมื่อใดก็ตามที่คุณพบว่าตัวเองกำลังสร้างประเภทที่ไม่ได้ใช้การทำงานใด ๆ เลย คุณได้ขยายแบบจำลองในระบบชนิดที่ไม่ให้คุณค่ากับการใช้งานในโค้ด
Jimmy Hoffa

จำไว้ว่ามีอยู่มากกว่าทุกอย่างเช่นมนุษย์ลิงและหมี
Tulains Córdova

ดังนั้นคุณจะเพิ่มว่าทั้งสิงโตและกวางเป็นสัตว์เลี้ยงลูกด้วยนมได้อย่างไร :-)
johannes

2
@JimmyHoffa เหล่านี้เรียกว่า "marker interfaces" และเป็นการใช้งานอินเตอร์เฟสที่ถูกต้องโดยสมบูรณ์ จำเป็นต้องได้รับการตรวจสอบโค้ดเพื่อตัดสินใจว่าการใช้นั้นถูกต้องหรือไม่ แต่มีหลายกรณีการใช้งาน (เช่นกรณีนี้ที่ Lion ที่พยายามจะกินหญ้าจะใช้ข้อยกเว้น NoInterface) อินเทอร์เฟซของตัวทำเครื่องหมาย (หรือขาด) ทำหน้าที่บอกล่วงหน้าข้อยกเว้นที่จะถูกโยนทิ้งหากวิธีการนั้นถูกเรียกด้วยอาร์กิวเมนต์ที่ไม่สนับสนุน

1
@rwong ฉันเข้าใจแนวคิดไม่เคยได้ยินมันเป็นทางการมาก่อน แค่ประสบการณ์ของฉันทุกครั้งฐานรหัสที่ฉันทำงานอยู่มันทำให้ทุกอย่างซับซ้อนและยากขึ้น บางทีประสบการณ์ของฉันอาจจะเป็นที่ที่ผู้คนใช้ผิดไป
จิมมี่ฮอฟฟา

5

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

ความรู้เกี่ยวกับอาหารที่สัตว์กินไม่สามารถทำได้อยู่ทั้งชั้นเรียนดังนั้นเพียงมีการอ้างอิงถึงสมาชิกของลำดับชั้นอาหารบางอย่างไม่เพียงพอที่จะบอกคุณว่าสิ่งที่คุณสามารถกิน

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

การสืบทอดหลายอย่างไม่ได้แก้ปัญหานี้ได้ดีเช่นกัน คุณต้องการสิ่งที่สัตว์กินได้หรือสัตว์ที่สามารถกินอาหารได้


เช่นที่พวกเขาพูดเกี่ยวกับ regex "ฉันมีปัญหาดังนั้นฉันจึงใช้ regex ตอนนี้ฉันมีปัญหาสองข้อ" MI มีปัญหา "ฉันมีปัญหาดังนั้นฉันจึงใช้ MI ตอนนี้ฉันมีปัญหา 99 ข้อ" ถ้าฉันเป็นคุณ d ตามที่ไร้สาระที่คุณ poking ที่นี่แม้ว่าอาหารรู้ว่าสิ่งที่สามารถกินได้จริง ๆ นี้ลดความซับซ้อนของรูปแบบตัน FTW การพึ่งพาการพึ่งพา
จิมมี่ฮอฟฟา

1

ฉันจะเข้าหาปัญหาจากด้านต่าง ๆ : OOP เป็นเรื่องเกี่ยวกับพฤติกรรม ในกรณีของคุณGrassมีพฤติกรรมบางอย่างที่จะเป็นลูกFoodหรือไม่? ดังนั้นในกรณีของคุณจะไม่มีชั้นเรียนหรืออย่างน้อยก็จะไม่ได้รับการสืบทอดมาจากGrass Foodนอกจากนี้หากคุณต้องการบังคับให้ผู้ที่สามารถกินสิ่งที่รวบรวมเวลามันเป็นคำถามที่น่าสงสัยถ้าคุณต้องการAnimalสิ่งที่เป็นนามธรรม นอกจากนี้ยังไม่ยากที่จะเห็นสัตว์กินเนื้อกินหญ้าแม้ว่าจะไม่ใช่เพื่อการยังชีพ

ดังนั้นฉันจะออกแบบสิ่งนี้เป็น (จะไม่ไปรบกวนกับศิลปะ ASCI):

IEdible กับทรัพย์สิน Typeซึ่งเป็น enum ของเนื้อพืชซาก ฯลฯ (นี้จะไม่เปลี่ยนแปลงบ่อยและไม่ได้มีพฤติกรรมที่เฉพาะเจาะจงดังนั้นจึงไม่จำเป็นต้องทำแบบจำลองนี้เป็น hiearchy ระดับ)

Animalด้วยวิธีการCanEat(IEdible food)และEat(IEdible food)ซึ่งเป็นตรรกะ จากนั้นสัตว์ที่เฉพาะเจาะจงสามารถตรวจสอบได้ทุกเวลาจากนั้นสามารถกินอาหารที่ได้รับในสถานการณ์ที่กำหนดและจากนั้นกินอาหารนั้นเพื่อรับความช่วยเหลือ / ทำอย่างอื่น นอกจากนี้ฉันจะจำลองคลาส Carnivore, Herbivore, Omnivore เป็นรูปแบบกลยุทธ์มากกว่าเป็นส่วนหนึ่งของลำดับชั้นสัตว์


1

TL; DR: การออกแบบหรือรุ่นที่มีบริบท

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

ฉันคิดว่ามันมีประสิทธิผลมากกว่าที่จะมุ่งเน้นไปที่การใช้ข้อมูล เมื่อคุณมีรูปแบบการใช้ข้อมูลแล้วจะสามารถย้อนกลับไปที่โมเดลและความสัมพันธ์ได้ง่ายขึ้น

เช่นข้อกำหนดที่มีรายละเอียดเพิ่มเติมจะทำให้ความสัมพันธ์ของวัตถุแตกต่างกัน:

  • สนับสนุนAnimals eatไอเอ็นจีที่ไม่FoodเหมือนGastroliths
  • สนับสนุนChocolateเป็นPoisonสำหรับDogsแต่ไม่ได้สำหรับHumans

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


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

@hagensoft: เห็นด้วย ฉันถูกพาไปบางครั้งเพราะฉันเห็นนักพัฒนาแบบจำลองอยู่เสมอโดยใช้คำเปรียบเทียบที่พวกเขายึดไว้ทันทีแทนที่จะมองว่าข้อมูลนั้นจำเป็นต้องใช้และใช้อย่างไร พวกเขาแต่งงานกับการออกแบบ OO โดยใช้แนวคิดเริ่มต้นจากนั้นลองและบังคับให้ปัญหาเหมาะสมกับวิธีการแก้ปัญหาของพวกเขาแทนที่จะทำให้วิธีการแก้ปัญหาสอดคล้องกับปัญหา
dietbuddha

1

วิธีการจัดองค์ประกอบการสืบทอดมากกว่า ECS:

An entity is a collection of components.
Systems process entities through their components.

Lion has claws and fangs as weapons.
Lion has meat as food.
Lion has a hunger for meat.
Lion has an affinity towards other lions.

Deer has antlers and hooves as weapons.
Deer has meat as food.
Deer has a hunger for plants.

Grass has plant as food.

pseudocode:

lion = new Entity("Lion")
lion.put(new Claws)
lion.put(new Fangs)
lion.put(new Meat)
lion.put(new MeatHunger)
lion.put(new Affinity("Lion"))

deer = new Entity("Deer")
deer.put(new Antlers)
deer.put(new Hooves)
deer.put(new PlantHunger)

grass = new Entity("Grass")
grass.put(new Plant)

Natureเป็นsystemลูปที่ผ่านเอนทิตีเหล่านี้โดยมองหาส่วนประกอบที่พวกเขามีผ่านฟังก์ชันการสืบค้นทั่วไป Natureจะทำให้หน่วยงานที่มีความหิวหาเนื้อสัตว์โจมตีหน่วยงานอื่นที่มีเนื้อเป็นอาหารโดยใช้อาวุธของพวกเขาเว้นแต่พวกเขามีความสัมพันธ์ที่ใกล้ชิดกับองค์กรนั้น หากการโจมตีประสบความสำเร็จเอนทิตีจะกินเหยื่อของมัน ณ จุดนั้นเหยื่อจะกลายเป็นศพที่ปราศจากเนื้อสัตว์ Natureจะทำให้เอนทิตีที่มีความหิวสำหรับพืชกินอาหารที่มีพืชเป็นอาหารหากมีอยู่

Nature({lion, deer, grass})

Nature(entities)
{
    for each entity in entities:
    {
       if entity.has("MeatHunger"):
           attack_meat(entity, entities.with("Meat", exclude = entity))
       if entity.has("PlantHunger"):
           eat_plants(entity, entites.with("Plant", exclude = entity))
    }
}

บางทีเราต้องการขยายGrassให้มีความต้องการแสงอาทิตย์และน้ำและเราต้องการแนะนำแสงอาทิตย์และน้ำเข้าสู่โลกของเรา แต่ไม่สามารถแสวงหาเหล่านี้ออกได้โดยตรงขณะที่มันไม่ได้มีGrass นอกจากนี้ยังอาจต้องการน้ำ แต่อย่างแข็งขันสามารถแสวงหามันออกมาตั้งแต่ที่พวกเขามี มันค่อนข้างง่ายที่จะขยายและเปลี่ยนแปลงแบบจำลองนี้โดยไม่ลดทอนการออกแบบทั้งหมดเนื่องจากเราเพิ่งเพิ่มส่วนประกอบใหม่และขยายพฤติกรรมของระบบของเรา (หรือจำนวนระบบ)mobilityAnimalsmobility


0

เมื่อใช้หลายมรดกและใช้การออกแบบเชิงวัตถุคุณจะแก้ปัญหานี้ได้อย่างไร

ชอบมากที่สุด มันขึ้นอยู่กับ

ขึ้นอยู่กับสิ่งที่คุณเห็น 'ปัญหานี้' เป็น

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

หากคุณกำลังถามเกี่ยวกับปัญหาการใช้งานทั่วไปคำตอบนั้นขึ้นอยู่กับความสามารถของสภาพแวดล้อมของคุณ อินเตอร์เฟส IFood และ IAnimal สามารถทำงานได้โดยมีคลาสย่อย EdibleAnimal ที่ใช้ทั้งสองอินเตอร์เฟส หากสภาพแวดล้อมของคุณไม่รองรับอินเทอร์เฟซเพียงให้สัตว์ได้รับมรดกจากอาหาร

หากคุณกำลังถามเกี่ยวกับปัญหาการออกแบบนี้เพียงให้สัตว์ได้รับมรดกจากอาหาร มันเป็นสิ่งที่ง่ายที่สุดที่อาจเป็นไปได้

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


0

ควรใช้การสืบทอดสำหรับบางสิ่งที่เป็นอย่างอื่นเสมอไปและไม่สามารถเปลี่ยนแปลงได้ หญ้าไม่ได้เป็นอาหารเสมอไป ตัวอย่างเช่นฉันไม่กินหญ้า

หญ้ามีบทบาทเป็นอาหารสำหรับสัตว์บางชนิด


มันเป็นเพียงนามธรรม ถ้านั่นเป็นข้อกำหนดคุณสามารถสร้างแผนกเพิ่มเติมที่ขยายคลาสนามธรรมของพืชและทำให้มนุษย์กินคลาสนามธรรมเช่น 'HumanEatablePlants' ซึ่งจะจัดกลุ่มพืชที่มนุษย์กินเข้าไปในคลาสที่เป็นรูปธรรม
hagensoft

0

คุณเพิ่งเจอข้อ จำกัด พื้นฐานของ OO

OO ทำงานได้ดีกับโครงสร้างแบบลำดับชั้น แต่เมื่อคุณหลีกหนีจากลำดับชั้นที่เข้มงวดสิ่งที่เป็นนามธรรมไม่ได้ผลดีนัก

ฉันรู้ทุกอย่างเกี่ยวกับองค์ประกอบของการเปลี่ยนแปลงที่ใช้เพื่อหลีกเลี่ยงข้อ จำกัด เหล่านี้ แต่พวกเขาเงอะงะและที่สำคัญกว่านั้นนำไปสู่การคลุมเครือและยากที่จะติดตามโค้ด

ฐานข้อมูลเชิงสัมพันธ์ถูกประดิษฐ์ขึ้นเพื่อหลีกเลี่ยงข้อ จำกัด ของโครงสร้างลำดับชั้นที่เข้มงวด

ตัวอย่างหญ้าของคุณอาจเป็นวัสดุก่อสร้างวัตถุดิบสำหรับกระดาษวัสดุเสื้อผ้าวัชพืชหรือพืช

กวางอาจเป็นสัตว์เลี้ยงปศุสัตว์สัตว์ในสวนสัตว์หรือสัตว์คุ้มครอง

สิงโตอาจเป็นสัตว์ในสวนสัตว์หรือสัตว์คุ้มครอง

ชีวิตไม่ง่าย


0

เมื่อใช้หลายมรดกและใช้การออกแบบเชิงวัตถุคุณจะแก้ปัญหานี้ได้อย่างไร

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

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

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