Loading...
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Преработка на кода на задачата Military Elite

Здравейте,

 

за първи път качвам кода на задача, която минава 100/100 в Judge, но за всичко си има първи път. laugh Днес събрах кураж и седнах да пиша задачата Military Elite. Старах се през цялото време да следвам конвенциите и принципите, които сме учили, но при крайните класове и интерфейси, може би си личи, че съм изпушил, а да не говорим за Engine класа. Ще съм много благодарен, ако някой колега може да ми помогне с рефакторирането на кода. Все още не съм сигурен кога да запазвам в интерфейс, и кога в клас. Затова на някои места е каша. Качвам кода и условието.

https://github.com/kaloyantihomirov/CSharp-OOP/tree/master/MilitaryElite

https://softuni.bg/downloads/svn/csharp-fundamentals/2019-May/CSharp-OOP-June-2019/04.%20CSharp-OOP-Interfaces-and-Abstraction/04.%20CSharp-OOP-Interfaces-And-Abstraction-Exercises.docx

0
C# OOP Advanced
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

е тя е доста straightforward тая задача, като цяло е ок но тоя engine class.. С switch case ще е много по чист.. Ако ти е се заиграва с reflection ще стане доста по кратък, иначе по класовете и другите неща няма кои знае какво да се пипне но те са и доста simple.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Благодаря за отговора! Има ли на места, където мога да вдигна абстракцията и да запазя обекта в интерфейс? Говоря за Add методите в интерфейсите (AddMission и другите) и листовете.

0
19/07/2019 10:50:45
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

обект в интерфейс айде не....  

IReadOnlyCollection<Mission> Missions { get; }
 

 това в командо интерфейса е безумие... тея неща не се държат там.. Сега теоритично може да се слагат структури и properties в интерфейсите но не се прави не е добра практика. А колко повече да вдигаш абстракцията няма смисъл.То идеята и е да вдигнеш общите неща. Сега това че командото има addmission ами ок да си стой само при него.

Дали ти трябва отделен интерфейс icommando не можеше всичките да са просто soldier или isoldier.  Абстракцията е хубаво нещо ама човек не трябва да се увлича в нея.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Така ни го показаха на упражнението, така го правим (ICommando интерфейса с Add метода в него). Условието на задачата гласи да направим за всеки клас интерфейс.

обект в интерфейс айде не....

Извинявай за фрапантната грешка! Мисля, че се разбра какво исках да кажа:

public interface IAnimal {}

public abstract class Mammal {}

public class Person : Mammal, IAnimal {}

Animal person = new Person();

Mammal personOne = new Person();

Person personTwo = new Person();

Можеше просто да ме поправиш, за да знам как да го кажа следващия път... Просто исках да напиша тази задача като хората, съобразено, разбира се, с това, което сме учили. Все още не съм гледал лекцията за полиморфизъм, а мисля, че точно това се разглежда там.

0
19/07/2019 14:52:40
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Доколкото разбрах от коментара ти, имам прекалено много интерфейси. И аз мисля, че не е необходимо за всеки клас да имам интерфейс, но това изисква задачата, и така съм го направил. Вече в Engine използвам switch-case и изглежда better.

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

това с класовете е така,дори преди година на един колега му обеснявах и го имам записано на видео но там влязохме и малко в дълбокия рефлекшън и взимане на методите runtime.

Сега за абстракцията това е дълга тема. Зависи как ти е удобно зависи в какъв екип работиш някои хора предпочитат като теб да го раздробят всичко аз не го харесвам тоя подход. Абстракцията е да събереш еднаквите логически неща на едно място.

Не помня задачата точно или да и имам условието но принципно аз как бих подходил.

Един абстрактен клас soldier който общо взето май ще държи само ToString() и още нещо общо между всичките и после всеки клас ще го наслед и  толкова той ще си държи вече там мисии и тн специфичните неща.Дали ми трябва interface за 1 метод абсолютно не, дали бих си сложил струкрурите в интерфейса пак не.Едната причина да не се слагат е че там всичко е публично.Ако искам да направя публична колекция ще я инициализирам в класа.. Примерно ако приемем твоя пример с Ianimal да кажем че тоя интерфейс държи Breath() walk()  общи за всички бозайници неща.Какво ще стане ако там му сложа и Ienumerable<Person> Relatives да задължа всичките класове да го имат това ли безумно е.

Тея неща на теория звучат много забавно но на практика като сте голям екип и имате конвенции. Все пак много и различни проекти и идеята е да можете лесно да си разчитате кода ако има хиляда интерфейса търсенето на кои метод и къде и кое къде инициализира и кое вкарва DI става страшно. Същата работа и с полиморфизма много е полезен обаче на практика не строиш огромни пирамиди от наследявания и подобни защото в базата ти става малко мазало дали ще избереш table hieraracy или table per class все тая забавен смях е да си ги управляваш.

За engine класа аз бих го направил с reflection 10 -20 реда няма да ми е повече, а и е забавно но е малко объркващо отначало.

0
19/07/2019 19:29:55
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.