[Homework] OOP in Java
Здравейте, видях, че има тема за първата задача на домашното, но отварям нова тема, която да е официалната за проблемите по цялото домашно.
Аз лично имах доста проблеми с разбирането на задачите и от това съм сигурен, че имам много грешки затова ще се радвам, ако ми ги посочите. Например на 2-ра не разбрах по какъв начин се ползва този expiration date, след като в конструктора не ни се задава кога е направен продукта или каква годност има например 14 дни или нещо такова. Това, което аз съм направил е автоматично продукта е с дата на създаването му, датата на разваляне е месец след това. Предполагам най-добрия начин е да се записват във файл датите на създаване на продктите и след това да се чете. Така, че ще ми е интересно да видя какви решения сте дали вие.
В първата задача също много се обърках, но след като прочетох темата с разясненията горе долу ми стана ясно какво се иска.
На доста места на първа задача забелязвам, че както е направено сетърите са излишни. За да се минава през тях на лекдията се спомена да се използват вместо this, примерно в конструктора. Все още тази лекция не е качена за да го намеря точно къде е, а не знам дали е споменато в лекцията от сряда. Иначе всичко останало е направено супер.
Здрасти Sholeto, хубава забележка за set-ърите, лош навик от JEE при създаването на моделите, където обикновето конструкторите са без аргументи и Eclipse да ми ги създава автомачично, вече го коригирах, а относно this, това не е задължително, използва се предимно ако в базовия и в наследения клас или поле в клас в поле в метод има променливи с еднакви имена да се упомене изришно кое поле е към този клас, а ако няма такава повтаряемост няма смисъл да се пише
Бая късно, този коментар но по-добре късно от колкото никога. Прегледах ти домашното колега и ако трябва да съм честен, ООП то е много счупено в него, не го казвам с цел да те обидя, просто е по-добре да се кажат тези неща, за да може да се работи по проблема вместо да се премълчат. Разбирам че най-вероятно не си учил ООП, затова ще се опитам да обясня главната идея накратко. Целите на ООП то могат да се сведат до няколко неща, едно от тях е да се преизползва колкото се може повече код, като за това се използва наследяване. Друга цел на ООП то е да се ограничи достъпа до неща, които не трябва да се виждат отвън ( сетърите и гетърите идват тук). Като цяло ООП то има идея да моделира обекти, да обедини смислово неща в един такъв обект, вземи например една от фигурите като триъгълник, триъгълникът в най-прост вариант има страни, точки, лице и периметър, тогава смисловата комбинация от 3 страни, 3 точки, лице и периметър ти наричаш обекта триъгълник и съответно в класът триъгълник трябва да може да се намерят горно посочените неща.
Спрямо самото домашно сега, виждам че имаш клас Vertex и клас Shape, но са празни, това е лошо тъй като има неща които наследяват този клас, ако той е празен няма много смисъл от това наследяване. Класовете PlaneShape и SpaceShape имат общи характеристики, съответно тази обща логика която споделят (например че и 2та класа имат List от неща които са Vertex-и) може да се изнесе във Shape класът и така това повторение ще се избегне. Друго което виждам е че класът ти Vertex2D моделира по скоро отсечка от колкото точка (Vertex е точка), докато Vertex3D моделира точка, тук става смесване на логиката. Какво трябва да е Vertex отсечка или точка?, наследниците могат да добавят ново поведение, но не е правилно да сменят самия смисъл на обекта, ако Vertex е абстрактната идея за точка в пространството, то Vertex2D трябва да моделира конкретната имплементация на точка в двуизмерното пространство, а Vertex3D в триизмерното. Много от тези държания и характеристики могат да се определят лесно като се приложи логика, понеже ООП то моделира по логиката от истинския свят, когато се чудиш какво трябва да има в някакъв клас, просто се запитай какво има един обект от този тип (примерно триъгълника). Разбира се важно е да се вземе в предвид че понякога не ти трябват всички характеристики които може да има даден обект, затова задаваме и определяме обектите само с характеристиките които ни интересуват. Надявам се съм помогнал ако имаш въпроси, питай разбира се.