CSharp [OOP] Подготовка за изпит - задача Academy Ecosystem


4

Здравейте колеги.

Решавах си задачката за екосистемата и когато свърших си я сравних с авторското решение. Почти едникви са с разликата на това че аз съм изкарал един отделен клас абстрактен за всички месоядни и там съм имплементирал интерфейса ICanivore. Въпросът ми е следния - когато става дума за глиган (boar), който наследява и хищниците и тревопасните грешка ли е да го направя да наследява месоядни и освен това да имплементира и интерфейса на тревопасните, или е по добре да го оставя на нивото на елена и да му наследя и двата интерфейса директно? Направил съм го така за да не повтарям код. Очаквам аргументирани мнения :)




Отговори



4
Сега ще я започвам аз, но от графиката - направо си плаче за IOmnivore интерфейс, който да имплементира и IHerbivore и ICarnivore. Не знам само дали условието го позволява :)

от Rusekov (971 точки)


0
Не знам дали е разумно да се прави interface IOmnivore...По-скоро да се наследят и двата интерфейса за да може да използваш абстракцията...Примерно ако правиш List

от dada166 (1113 точки)

0
Аз ли греша или IOmnivore : ICarnivore, IHerbivore , означава че IOmnivore is ICarnivore и IOmnivore is IHerbivore :)) мисля че абстракцията си е супер :)

от Rusekov (971 точки)



4
Този абстрактен клас "Carnivore" не ти върши никаква работа, а и така смислено се нарушава кохезията на йерархията ти. Идеята на абстрактните класове е да преизползваш техни компоненти, в случая това, което различава месоядните и тревопасните е Eat метода, който и без това е строго индивидуален за всеки отделен тип животно, т.е. той трябва да се инициализира по различен начин за всеки вид(по условие) и няма как да бъде деклариран веднъж в родителски клас и след това да бъде преизползван от наследниците.
Също така с абстрактен клас Месоядно/Тревопасно правиш категорично смислово разграничение между двата типа, като след това трудно можеш да вмъкваш животни, които са и от двата едновременно месоядни и тревопасни.
Според мен определено всички животни трябва да са на "едно ниво" в йерархията, като абстрактния Animal е напълно достатъчен като родителски клас.

от stinger907 (307 точки)


0
Току що я реших. Направи ми впечатление, че елена овъррайдва ъпдейт метода, което предполага, че и другите класове ще трябва да го овъррайднат ако искат да се будят след като е изтекло времето за сън. Което означава, че ако иска да спази DRY, трябва да създаде един абстрактен клас (примерно EvolvedAbimal) който да наследи Animal и там да стане овъррайдването на ъпдейт метода за всички следващи класове.

от Rusekov (971 точки)

0
Прав си, колега. И аз смятах, че всички животни трябва да override-ват Update(), но тъй като по условие не се иска, както и че тестовете минават и без това, то следва, че всеки ще го направи по свое усмотрение. Аз го направих без междинен клас. Поздрави и успех на изпита!

от LERRY (582 точки)



6

Понеже не видях друго досега - ето го моето решение на задачата https://github.com/KoPaB/AcademyEcosystem-Skeleton. Дава 100/100 точки в бгкодер (покрива всички тестове коректно при ръчна проверка). Интересното за този изпитен вариант е, че според мен първа задача е по-трудна от втора, така че задължително четете целите условия, преди да започнете да решавате на изпита. При тази задача мен ме затрудни ориентирането в кода, но след внимателно четене и преглеждане на вече създадените класове, я реших за около два часа.


от SStoyanov1 (1324 точки)


0
Решението е добро колега, само че не съм сигурен дали ще мине ръчна проверка без проблеми. public Boar(string name, Point position): base(name, position, 4) { this.biteSize = 2; } Тези магически числа, които си подал май не са най-добрата практика.

от Plamen_Petkov (1255 точки)

0
Не е да, редно е да се изкарат като константи (или променливи, взависимост от случая) и тогава да се подават, за да е ясен кода.

от staccobain (834 точки)



2

Ето едно решение на задачата от мен. Аз не смятам, че трябва да има повече абстрактни класове след Animal. Всички животни трябва да наследяват Animal и да си имплементират съответния интерфейс. Така или иначе имплементацията на TryEatEnimal() е различна. Според мен няма достатъчно добра причина за да има клас Carnivore.


от dimo.petrof (2887 точки)


0
Не трябва ли да се направи override на метода Update за всички новосъздадени животни, че да се събудят? Както е в примера с клас Deer...

от plamenti (534 точки)