[OOP Exam] 20.12.2015 Към колегите със 70+ точки в judge
Някой от горепосочените би ли споделил решението си?
Иска ми се да разгледам някое сполучливо (на C#).
Някой от горепосочените би ли споделил решението си?
Иска ми се да разгледам някое сполучливо (на C#).
Не е перфектно но 100 изкарах някак :Д https://github.com/HristoVutov/OOPExam
На моето много му куца логиката за Атаките ама иначе горе долу си го харесвам :D линк
Аз участвах в изпита малко по-рано, поради технически причини ; )
Ако говориш за вечерния, това е решение със 70 точки.
Тестове 3, 8 и 9 изглежда са сценарии на атакуващ блоб с Aggressive Behavior и Blobplode.
Ако те ви гърмят, пробвайте да промените калкулирането на damage-а:
(началния dmg + бонуса от Aggressive) * 2 ако е Blobplode
А status трябва да принтва само онова в скобите :D
Ето го и моето решение. Като цяло съм доволен от решението си, но има места в Блоб-а, където ми е сериозно счупена абстракцията. Например създавам атаката и бихейвиъра в конструктора на блоб и заради това си контактува с енджина. Предполагам по-правилно щеше да е да подходя като Enevlogiev е конструктора да му подам директно атака и поведение и после в самите методи на атака и поведението да извиквам за кой блоб се отнася, но ми се стори по-правилно при положение, че принадлежат на конкретен блоб, то би трябвало да знаят за кой се отнасят без да им бъде подавано във всеки метод. Сега смятам, че най-добрият подход би бил да създам атака и поведение без конкретен blob, а после в конструктора на блоба вместо там да създавам цялата атака, просто там да им кажа, че техния конкретен блоб, с който ще работят е this. Но, както всеки път след изпит винаги може и още.
За репортирането приех доста дървен подход, тъй като и там не можах да се сетя как да направя така, че вътрешността на блоба да не участва по никакъв начин. Накрая на това, което се спрях е 4 булеви в енджина, ако ни е обявено репортване.
Някои, ако ми изтъкне и други грешки ще съм му благодарен.
В моето решение всеки блоб пази референция към инстанции на собствените си атака и поведение, а те от своя пазят референция към блоба, за който се отнасят. Въпрос на дизайн. Но ако ще се подават блобовете като параметри на методите на атаките и поведенията, няма смисъл за всеки блоб да се инстанциират нови такива, може някъде да се пазят инстанции на всички нужни видове и да се викат при нужда.
Абсолютно, такава беше и моята, но ме затрудни това, че нямаше как да се инстанцират и двете едновременно, защото едното иска другото. Затова, ако си погледнал моето решение си видял, че в конструктора на блоба създавам неговата атака, но за да я създам извиквам attackFactory от engine, което е грешно. Затова по-правилно щеше да е в createFactory да създам първо атака и поведение, без референция към блоба, а вече след като се подадат на блоба, тогава в неговия конструктор или в сетъра на неговата референция към атака и поведение да им се казва изрично, че тази атака и това поведение си отговарят изрично за него.
Надявам се успях да обясня това, което исках да кажа като хората, че е доста объркано :D
Задачата от сутрешния изпит определено беше интересна, силно се надявам на поправката да дадът пак някаква игричка.
Някой ще може ли да шерне условието от вечерния изпит ?
А кога е поправката?
Мисля, че се спомена някъде към средата или края на февруари
Аз хванах 80т. с едно предване в последните 5-10 мин, когато подкарах първия нулев тест. Предполагам, че единия ми проблем за останалите, е че смятам health-a така:
Health /= 2;
При което се получава разминаване при нечетните числа и трябва да е:
Health -= Health / 2;
Това се вижда ясно като си погледнеш втория тест, но нямаше време. Малко странна ще ми е имплементацията защото аз от атаката взимам само един modifier и вече с него си работя в Blob-a.
Ето го решението ми, въпреки че не ми остана и време да оправям на protected virtual където има нужда, а сигурно и други неща съм оплескал :D
Ето и моето решение: ЛИНК
Като цяло доста неща съвпадат с решението на enevlogiev.
Леле, колко ексепшъни ми липсват ... е, живи-здрави, така се учи човек : )
Като цяло, там където не ми беше изрично казано да мятам грешка, не съм и мятал. Това, разбира се, не е оправдание да не си защитиш програмата от некоректна употреба.
Имаше места, на които ме беше страх да не си прецакам тестовете в джъдж. Никъде в условието не е написано, че примерно името на някой блоб не може да е whitespace, или string.Empty. За health и damage - пише, че са валидни 32-битови числа. По-нагоре пише, че кръвта на блоб не трябва да се позволява да пада под нула. Всичко е въпрос на интерпретация. Можеше някой да иска да ме прецака с отрицателен damage : )
Тук на помощ идват юнит тестовете. Аз примерно не се сетих, че е добре да хвърля грешка ако един блоб опита да атакува себе си. Когато се пишат тестове, се тества конкретна функционалност, да речем командата за атакуване. Когато започнеш да мислиш всички варианти какво може да ти се подаде в конкретната команда (което е доста по-ограничен набор от възможности отколкото ако мислиш изобщо какви команди може да се дадат), се досещаш кое е валидно и кое не. Валидациите, които са посочени изрично в условието, са достатъчни, за да се приеме решението за коректно, останалото е бонус. Има я и другата опасност - да направим повече валидации от необходимото и да се окаже, че хвърляме грешки когато не трябва.