Loading...
velio84 avatar velio84 241 Точки

[Homework] OOP - Defining Classes - Януари 2015

Мисля няма да е лошо да имаме обща тема за първото домашно от курса по ООП от нашия випуск. Не за друго, а доста хора имат въпроси и питат в най-различни теми, което е доста трудно за следене и е доста разхвърляно. Според мен би било добре да правим нови общи теми за различните домашни и нещата да се коментират вътре. На мен поне, а и предполагам на други хора им е по-лесно всичко да е накуп, а не отделни теми за всяка задача.

Ето го моето първо домашно:

01

02

03

04

На 3-та задача имам 2 класа в 1 файл, знам (вече) че не се прави така, но домашното го писах преди 2 седмици, а сега не ми се занимаваше да преправям.

4-та задача я написах днес, след като изгледах половината курс. Не ми се занимаваше да преправям override ToString на класовете, затова като сортирах само CurrentStudent-ите в нов масив, заедно с това направих и нови анонимни обекти като им взимам които пропертита искам (ред 21-35). C# изкарва анонимните обекти подобно на JavaScript, достатъчно добре ми се стори за целите на задачата :)

Също за 4-та ме мързеше да пиша и пропертита с проверки за различните елементи, затова само съм сложил get-ъри и set-ъри.

13
C# OOP Basics 24/01/2015 16:48:30
a.angelov avatar a.angelov 1316 Точки

Ето и моето домашно:

GITHUB

Четвърта задача след като човек е изгледал всички лекции му се струва елементарна /просто иначе няма знанията да я направи/ :) И аз като Вельо не съм правил при нея проверки на set-ърите, защото си е бая писане, а и не се изисква в условието :) 

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

1
24/01/2015 10:16:38
Filkolev avatar Filkolev 4482 Точки

Имам коментар по 1-ва задача, козметични неща.

В ToString() за Person - прието е да се минава на нов ред след запетаята, която отделя форматирания стринг от параметрите. За имейла, понеже той няма как да е празен, може да е или null, или валиден мейл, може да ползваш оператора ?? (null-coalescing) вместо тернарния. Съкращава малко записа и върши същата работа.

1
Filkolev avatar Filkolev 4482 Точки

На 2-ра задача, добавяш към лаптопа батерията и като отделно поле имаш battery life, което според мен е по-логично да е свойство на самата батерия. 

Като хвърляш ексепшъни е хубаво да слагаш информация кой параметър е изгърмял; особено в класа Лаптоп както има доста пропъртита, всичко може да изгърми с ArgumentNullException може да представлява затруднение.

1
a.angelov avatar a.angelov 1316 Точки

Благодаря за КПК забележката! :) Не съм сетил за ?? оператора, но определено става по-късо и ясно с него.

Едит: За живота на батерията и аз си го помислих, логично е да е в батерията. Сигурно съм се подвел по примерния output, където батерията е отделно от живота на батерията...

0
24/01/2015 11:42:50
a.angelov avatar a.angelov 1316 Точки

Вельо,

имам коментар по втора задача:

1. На клас Battery защо полетата са ти protected...;

2. Мисля, че не е правилно наследяването на Battery от клас Laptop - абстрахирайки се от задачата класът Лаптоп може да наследи клас Компютър например, Компютъра от своя страна да наследи ЕлектронноУстройство и т.н. но не ми се връзва да наследява свой компонент какъвто е батерията. Тоест идеята на наследяването е да се върви от общото към частното.

Освен това в условието е казано "a class Laptop holding an instance of class Battery", което аз го разбирам класът Лаптоп да има поле Батерия - private Battery battery; и съответно в конструктура да имаш параметър от тип Батерия.

В трета задача също имаш protected полета.

2
Filkolev avatar Filkolev 4482 Точки

Нито батерията е редно да наследява лаптопа, нито лаптопа да наследява батерията.

Когато даден клас наследява друг, това означава, че обектите от класа наследник са подмножество на обектите от класа родител. Например, бозайниците са вид животни, т.е. класа бозайник наследява класа животно. В случая нито лаптопа е вид батерия, нито батерията е вид лаптоп. Надявам се стана горе-долу ясно.

2
a.angelov avatar a.angelov 1316 Точки

Фил го обясни по-добре от мен :)

0
velio84 avatar velio84 241 Точки

Благодаря за забележките :)

полетата на батерията са ми протектед, защото като съм писал задачата преди няколко седмици толкова съм разбирал laughing Сега като прегледах решението, от класа лаптоп съм искал да досътъпя батерията(batt) през класа Лаптоп директно, не през пропертито Batt - предполагам visual studioto е изпищяло, променил съм полетата от private на protected и VOALA :)

"a class Laptop holding an instance of class Battery", това пък аз тогава съм го разбрал лаптопа да наследява батерия, което ЯВНО не е така. Instance of class е просто вътре да има батерия в лаптопа, нищо повече - както Фил казва. :)

Ще взема да я преправя тая задача, че наистина е доста зле... :)

1
Filkolev avatar Filkolev 4482 Точки

Здравейте и от мен,

Това домашно го започнах още миналата година, направих донякъде 1-ва задача и довърших нещата едва преди 2-3 дни.

Харесват ми задачите, може би защото вече почнаха да ми поомръзват алгоритмичните задачи от другите курсове.

Задачите със звезди са интересни и не бих казал особено трудни, защото всичко е обяснено на лекциите. На места е нужно да се мине малко по-напред, но за момента мисля да се опитвам да ги правя всичките (което поради липса на време не успях да постигна по останалите предмети).

Има известен елемент на еднообразие - пишеш полета, пропъртита, конструктори, методи. Но пък за разлика от преди има друг момент - проектиране, т.е. не просто решаване на конкретен проблем, а изграждане на система с елементи, взаимовръзки и т.н.

Ето решенията ми: ЛИНК.

На 4-та предполагам може да се структурират по-добре нещата ако ползвам някой и друг неймспейс, но не мисля да се занимавам повече с това домашно освен ако някой не открие съществена грешка разбира се :)

2
velio84 avatar velio84 241 Точки

За 4-та единствено като това, което написах и на Анатоли - базовите класове да са абстрактни, за да не могат да се създават обекти от тях, а само от наследниците. Въпрос на виждане е вкрайна сметка и това му е хубавото на ООП-то - има доста различни варианти за правене на нещата :)

0
Filkolev avatar Filkolev 4482 Точки

Вельо, на 2-ра задача имаш повторение на код в конструкторите, може да ги chain-неш. Моето лично предпочитание е да почвам от тези с най-малък брой параметри и да ги викам от тези с повече. Но както и да решиш да подходиш ще съкратиш малко излишни неща.

0
velio84 avatar velio84 241 Точки

Преправих я втора и я направих като хората, отделени класове, чейнати конструктори, без безмислени наследявания и т.н..... :)

1
Andreev avatar Andreev 11 Точки

Ето го и моето домашно: GITHUB

Предполагам някои неща могат да бъдат направени по по-добър начин, така че всякаква обратна връзка би била полезна.

0
velio84 avatar velio84 241 Точки

Много добре си ги направил задачите. Единствено в SULSTest е добре ламбдите да са всяка на нов ред - по-лесно четимо е :)

persons

     .Where(person => person is CurrentStudent)

     .OrderBy(person => ((Student)person).AvgGrade).ToList()

     .ForEach(p => Console.WriteLine(p.ToString()));

2
Filkolev avatar Filkolev 4482 Точки

Може да зачистиш излишните using-и, общо взето се добавят такива само ако ти потрябват.

На 2-ра задача в класа батерия хвърляш: new ArgumentException("Invalid value for battery type!"). Малко е объркващо, по-описателно е да е ArgumentNullException и да кажеш, че стойността не може да е празна, иначе като кажеш само invalid това не помага особено. В другия клас, лаптоп, ексепшъните си ги направил по този начин (по-описателния).

Цените - decimal за предпочитане пред double. Това за 2-рата задача, в 3-та е направена с decimal.

За принтирането на цената в 3-та, в условието е казано, че трябва да ползваме български формат, т.е. да ръчнем културните настройки; точката става запетая, изписва се след това "лв." и др.

На 4-та задача си пропуснал за OnsiteStudent полето за брой присъствия.

1
Andreev avatar Andreev 11 Точки

Въобще не бях забелязал в условието полето за брой присъствия. Благодаря за коментарите и  препоръките. Мисля, че оправих нещата.

1
p.yordanov avatar p.yordanov 51 Точки

Ето я и моята домашна(за сега само 4-та задача)- GitHub. Аз си поиграх малко повече и слагах проверки, където ми се стори удачно. Малко feedback няма да навреди, особено ако има нещо, което не е наред.

0
Filkolev avatar Filkolev 4482 Точки

Имаш излишни using-и, които може да се махнат.

На места ползваш не особено добри имена на променливи - studNum, currCourse. Аз лично никога не съм виждал смисъл от такива съкращения, правя го само за по-стандартни неща, които са ясни за всички (average може да сменя с avg или нещо такова). За 4-5 спестени символа не си заслужава, а се увеличава рискът кодът да стане по-трудно четим.

Кодът не е форматиран на места, Ctrl+K,D е поне при мен шорткъта във VS. По-конкретно - имаш скоби на същия ред, което нарушава конвенцията в C#.

Допада ми идеята да се сложи списък с курсовете на трейнърите и методите за добавяне и премахване да вършат реално някаква функция. 

 

0
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Ето и моето решение на домашното:

GitHub

2
velio84 avatar velio84 241 Точки

Никола, за какво се слага ? след името на типа променлива? Например от Лаптопа:

private int? ram = null;

Пак на лаптопа в override tostring метода - като има повече стрингове за слепване StringBuilder-a е доста по-бърз.

Тая проверка много ми хареса:

if (value != null && value.Trim() == "")

:)

0
mihayloff14 avatar mihayloff14 824 Точки

? се слага на променливи, които не могат да бъдат null (като int например), за да имат възможността да приемат стойност null.

1
scienide avatar scienide 17 Точки

Да взема и аз да се включа по темите с домашни:

github

Четвърта задача може би тея дни ще я направя, в момента ме мързи. Всякакви препоръки и конструктивна критика са добре дошли.

2
25/01/2015 17:53:53
RoYaL avatar RoYaL Trainer 6849 Точки

За задачата с каталога:

По никакъв начин не се подсигуряваш, че това което се асайнва към някое поле е това, което очакваш. Т.е. това, което примерно ти се праща като ram в конструктора, задължително е от тип компонент, но нищо друго не е задължително, името му може да е CPU и пак ще го присвоиш към рамта.

Това което предлагам е да си направиш енумерация с възможните типове и може да я закачаш към поле "type" на компонента. А най-добре даже самите подкомпоненти да са наследници на Component, така можеш да се подсигуриш че нещо ще е от тип Ram.

Другото, което ще изникне като проблем, ако го направиш по този начин (то и сега го има този проблем) е, че за всеки нов компонент, който се измисли, например Лан карта, ще трябва да влезеш в класа Computer и да промениш аааадски много неща, като започнем от параметрите на конструктора, добавяне на ново поле в класа, пропърти към него и стигнем до промяна на ToString() метода.

Според мен трябва да имаш List от компоненти, който подаваш в конструктора на Computer. Така компонентите дори и да са сто - пак лесно ще се подадат като един цял Лист. Няма да ти трябва поле и пропърти за всяко и в ToString() просто ще итерираш през List-a.

P.S.: sb.AppendFormat("{0}\n", this.Motherboard.ToString()); мисля, че викането на ToString() е излишно тук. Щом извършваш стрингова операция, би трябвало да се invoke-не сам.

0
26/01/2015 10:12:41
scienide avatar scienide 17 Точки

Да, това за каталога е така, обаче ме домързя вече, много писане става. И за всеки компонент да правя тип се сетих, ама пак много хамалогия. Май с лист от компоненти наистина ще стане най-добре.

Иначе за .ToString() - обичам да ги разписвам обикновено, по четим е кода така според мен.

0
nedjo avatar nedjo 53 Точки

Да се включа и аз.

github

Знам, че не всичко е както трябва, но всякаква критика е добре дошла.

1
26/01/2015 18:42:09
RoYaL avatar RoYaL Trainer 6849 Точки

Замислял ли си се да ползваш автоматични пропъртита, до момента в който не ти се наложи да правиш валидация? Доста излишно ми се вижда, ако нямаш логика в сетъра/гетъра да имаш полета и пропъртита, които просто ги гет/сет-ват

0
nedjo avatar nedjo 53 Точки

Да, прав си. Няма логика да само да гет/сет-ват. Е, поне се уча да пиша празни пропъртита :) Сега ще ги оправя.

0
RosenKrumov avatar RosenKrumov 203 Точки

Здравейте,

С малко закъснение не и без помощта на VS, ето и моето домашно.

GITHUB

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