Loading...
bgnightwish avatar bgnightwish 6 Точки

[Homework] OOP - Defining Classes - Ноември 2015

Здравейте, нека споделяме решенията от домашното за първата лекция по ООП, в тази тема,

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

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

01: Persons

02: Laptop Shop

03: PC Catalog

 

Тагове:
5
C# OOP Basics 23/11/2015 23:23:34
cap7ainjack avatar cap7ainjack 20 Точки

Регекса е супер!

Само се чудя дали не трябва, когато след точката има повече от 3 букви, например .commm, не е ли по-правилно да изпусне целият match, вместо да хваща редо до 3тата буква ?

И аз не съм сигурен,  само питам :)

Също хваща и нещо от типа на Ivan@abv.   т.е. без .бг и т.н.

 

0
20/11/2015 23:14:19
flashestswag avatar flashestswag 66 Точки

Здравей, може ли да оправиш file extension-a на .cs защото без оцветяване на кода е много грозно за четене :( А ми е интересно да разгледам, но с тоя черен цвят въобще не ми се гледа..

0
21/11/2015 23:02:47
slavpetroff avatar slavpetroff Trainer 155 Точки

 Редактирал съм го.

1
Rextor92 avatar Rextor92 149 Точки

Здравейте,

давам линк към решени задача 1 и 3, като трета я реших.. току що, а в 4:30 сутринта не се пише добър код - всички предложения как да бъде подобрена са добре дошли!

01.Persons

03.PCCatalog

Единственото, което се различава от вашите решения е, че съм използвал MailAddress класа за проверка на валидността на имейл адреса. Струва ми се доста приятен начин да се измъкнеш от регулярните изрази, със задоволителна точност, а и Microsoft го предлагат в MSDN - How to: Verify that Strings Are in Valid Email Format.​

5
Gabbs avatar Gabbs 80 Точки

Здравей,

Една идея за 3та - с params можеш да подадеш колкото искаш аргументи(компоненти), не е нужно да подаваш лист:

        public Computer(string name, params Component[] component)
        {
            this.Name = name;
            foreach (var item in component)
            {
                this.components.Add(item);
                this.Price += item.Price;
            }
        }

 По този начин можеш да създадеш обектите с Computer PC1 = new Computer("PC1", ram1, hdd1, gpu1, cpu1);

12
18/11/2015 10:08:40
alevtodorov avatar alevtodorov 29 Точки

Адски полезно. Благодаря. Аз лично, не можах да се сетя за по-добър начин за решаване на 3-тата задача.

3
karlite avatar karlite 20 Точки

А какво правим ако искаме след време да добавим още един компонент... :Д

0
21/11/2015 15:04:48
butanfire avatar butanfire 32 Точки

Привет!

Относно 4-та задача :

LINQ израза ти хваща наследниците на CurrentStudent (Onsite/OnlineStudent).

Това е понеже ofType<> хваща и наследниците... :(

Затова трябва проверка като например :

if (Object.GetType() == typeof(CurrentStudent))

Не съм разгадал още как да го направя през LINQ израз (най-вероятно с where).

 

#Edit - разгадах :

classTests

.OfType<CurrentStudent>()

.Where(o => o.GetType() == typeof(CurrentStudent))

.OrderByDescending(student => student.AverageGrade)

.ToList()

.ForEach(Console.WriteLine);
          

Поздрави,

Владо

0
18/11/2015 20:05:02
djc_bg2015 avatar djc_bg2015 923 Точки

Ами точно така трябва да бъде, защото както виждаш класа CurrentStudent е абстрактен и неможе да се инстанцира. (public abstract class CurrentStudent : Student)

("Extract only the Current Students, sort them by average grade and print information about each one on the console.")

На диаграмата в условието не са показани абстрактни класовете, по простата причина , че все още не е преподавано, но вярвам че всеки ще се съгласи че Person, Student, CurrentStudent трябва да бъдат абстрактни :)

Тоест, ако linq-a не ми хваща наследниците, то тогава няма да работи.

Поздрави

 

0
18/11/2015 20:53:09
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Проверката дали даден обект е от тип CurrentStudent може да се прави и с is:

persons.Where(person => person is CurrentStudent)

Edit: За abstract си прав, писах мнението си по спомен, но след това отворих домашното и видях, че CurrentStudent може да е Online и Onsite.

1
18/11/2015 21:11:00
djc_bg2015 avatar djc_bg2015 923 Точки

Здравейте колеги, ето какво видях аз:

@bgnightwish
Като препоръка, мога кажа, че не са подредени много правилно елементите в класа ти.
Ето дискусия по темата в stackoverflow, както и StyleCop документацията:
http://stackoverflow.com/questions/150479/order-of-items-in-classes-fields-properties-constructors-methods

@slavpetroff
Липсва ти втория конструктор с който се прави обект без мейл. Не че както си го направил няма да работи, просто идеята е да се тренира преизползването на конструкторите.

@rextor92
В Persons няма да е лошо да изнсеш класа тест в собствен файл.

А относно валидирането на имейла, тук според мен по - важно е да се тренира енкапсулацията, а не да се конкретизира как.
В смисъл и !value.Contains("@") отговаря на условието.

6
Mozez avatar Mozez 55 Точки

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

0
Gabbs avatar Gabbs 80 Точки

Да, продължава се - ООП е понеделник, сряда и петък. В страницата на курса има един файл "Програма на курса".

2
18/11/2015 10:09:06
alevtodorov avatar alevtodorov 29 Точки

Здравей,bgnightwish

Мисля, че в твоето домашно има малка грешка. В условието е написано: "Define a property for the email that accepts either null or non-empty string containing '@'. Това не значи ли, че може да съдържа null, но не и празен стринг (""). Според мен трябва да е:

if(value == "" || !value.Contains("@"))

{

   throw new ArgumentException("Invalid email!");

}
else
{
    this.email = value;
}

1
18/11/2015 10:27:14
flashestswag avatar flashestswag 66 Точки

alevtodorov : Аз го бях направил точно както ти си предложил :) Само, че когато създадох инстанция на Person без да давам имейл ми хвърли Exception :) Понеже, като не подавам имейл, имейла е null.
И тук:

if(value == "" || !value.Contains("@"))

Първо проверява дали null == "", което връща false, и понеже връща false се налага да провери и дясната част на ИЛИ-то. Тръгва да вика метода Contains() за value, който в този случай е null.. И хвърля NullReferenceException. 

И го направих така:
(Важно е първо да проверяваш за null, а после проверката с Contains(), защото иначе ако не подадем имейл value пак ще е null, и пак ще хвърли NullReferenceException. А в случая, ако value==null, то първият аргумент на ИЛИ-то вече е TRUE, и вече вторият аргумент не го изчислява(съответно няма да има NullReferenceException), защото при ИЛИ е достатъчно единият аргумент да е TRUE, за да е цялото TRUE)

if (value == null || value.Contains("@"))
{
    email = value;
}
else
{
    throw new ArgumentException("Email must be Non-Empty and be a valid email address.");
}

1
22/11/2015 23:10:09
alevtodorov avatar alevtodorov 29 Точки

Да. Прав си. Така е по-правилно. Съгласен съм.

1
krisi1606 avatar krisi1606 33 Точки

Здравейте, аз чак днес имам възможност да седна и да се пробвам върху задачките, но от тази сутрин направих само първата:

http://pastebin.com/raXb709a

Ето го кодът ми, приемам забележки. :) 

Искам да попитам може ли някой да ми помогне с разясняването на това override ToString() метода, защо го правим, че малко ми е объркано и не мога да го схвана.

Лек ден!

0
18/11/2015 10:52:44
Gabbs avatar Gabbs 80 Точки

Всеки обект има ToString() метод, който връща стринг-а репрезентиращ обекта. Default-ния ToString() връща името/типа на обекта (примерно Console.Write(myArray) ще ти каже че е масив и от какъв тип е). Когато го override-неш, ти променяш какво прави този метод когато е приложен върху обекти от твоя клас - така когато направиш Console.Write(myObject), вместо да ти изпише в конзолата името/типа на обекта, ще изпише точно това което искаш (примерно някое поле - name, age, каквото искаш).

6
18/11/2015 11:36:49
djc_bg2015 avatar djc_bg2015 923 Точки

Както съм писал вече по - горе, трябва всеки клас да бъде в отделен файл. :)

 

2
18/11/2015 11:35:50
Gabbs avatar Gabbs 80 Точки

edit: да, прав си - съгласявам се с теб :) Не те бях разбрала правилно.

0
18/11/2015 17:17:15
deniz avatar deniz 29 Точки

Здеавйте!

Някой може ли да каже дали така е добре написан кода ми. http://pastebin.com/x2eDZt9C

0
19/11/2015 12:30:39
alevtodorov avatar alevtodorov 29 Точки

Според мен си е добре.

1
ivodonev avatar ivodonev 7 Точки

Здравейте,

ето и моята задача 1,

http://pastebin.com/7YN6Kb6m 

компилира се нормално но на финала в конзолата принтира:

ProgramPersonHW.Person
ProgramPersonHW.Person

Някой може ли да ми даде насоки, какво да търся... опитах с дебъгера но не виждам нищо което може да е причина?
 

1
krisitown avatar krisitown 45 Точки

Това е защото методите, незнаят как да се отпечатват.

Когато се извика Console.WriteLine(), параметъра който му се подава му се вика .ToString() метода, затова, за да може да ти се отпечатват обектите трябва да им напишеш override на .ToString(), който трябва да върне string, форматиран така както искаш да бъде принтирано.

4
pepster avatar pepster 69 Точки

виж малко по-горе Gabbs е обяснила за ToString() метода. Та .... - изписва ти това е конзолата защото вкласа Person си не си го overridе-нал метода.

Можеш да го направиш например така:

public override string ToString()
  {
  return string.Format("Name: {0}, Age: {1}", name, age);
   
  }

като добавиш и за мейла подходящ код разбира се ..

 

 
   
   
   
   

3
Filkolev avatar Filkolev 4482 Точки

Ако искаш хората винаги да се принтират по един и същи начин - override ToString(). Ако еднократно искаш да изведеш информация - просто достъпвай отделните пропъртита, които ти трябват, например: Console.WriteLine("{0} {1), age: {2}", person.FirstName, person.LastName, person.Age). Въпрос на преценка е кое е за предпочитане.

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