Loading...
felix_de_suza avatar felix_de_suza 100 Точки

[Homework] OOP - Defining Classes - Problem {1} - Persons

Колеги, искам да попитам защо като извикам вторият конструктор (chain- натия) без последният параметър email вместо да ми зададе стойността null която съм му задал ми изкарва NullReferenceException?!? Опитах сам да си намеря грешката като гледах кода на колегата Тито, но не мога да си намеря грешката :( ето го и кода ми : http://pastebin.com/zQGqgW5h 

Mod Edit: Обърни внимание на т. 9 от Правилата на форума - концепции за именуване на теми!

Тагове:
1
C# OOP Basics 17/09/2014 13:00:35
mbelev avatar mbelev 10 Точки

Здравей,

Дава ти NullReferenceException, заради метода IsValidEmail. Ти сетваш стойноста на Email, през пропъртито Email, в което викаш метода IsValidEmail(value), а в този метод за всеки символ проверяваш нещо, което попринцип не ми изглежда като валидация на email, но това е всеедно в случея. Като му подадеш стойност null и пуснеш foreach да провериш всички символи, тогава ти гърми.

Като го промениш това, няма да имаш проблеми. Ако искаш да позволяваш null стойност, просто провери ако value == null и си сетваш стойността на null (или може би по - добре на string.Empty), а за да не хвърля грешка при тази проверка в setter - a if (IsValidEmail(value) == false && value != null) им смени местата да са така -> if (value != null && IsValidEmail(value) == false), така първо ще провери дали е null, ако не е само тогава ще се извика метода за валидацията.

5
felix_de_suza avatar felix_de_suza 100 Точки

Много благодаря колега, сега разбрах защо така става, а не съм валидирал имейла както по принцип би трябвало, понеже в задачата се иска да се провери единствено дали съдържа '@' иначе си прав, че това не е никаква валидация на имейл. Още един път благодаря за бързия отговор!

0
Dzhuliya avatar Dzhuliya 5 Точки

Здравейте, и аз имам проблем с първа задача. Когато пусна програмата ми изкарва "Process is terminated due to StackOverflowException". Не мога да разбера къде е проблема, забелязах, че при зададените стойности още на първия обект не влиза в конструктура и става някакъв безкраен цикъл, обаче идея си нямам как се получава това. Ще съм благодарна на помощ :)

Ето го и кода ми

0
crazy7 avatar crazy7 177 Точки

Имаш грешка при презаписването на ToString. И по-точно когато подаваш Age си написала "this, Age", а не "this.Age".

 

Също няма нужда от if условието ти за "value.Length < 1", защото то ще влези само ако e 0, а то тогава ще е влязло още в предния ти if за празен стринг и няма да стигне въобще до него.

2
18/09/2014 13:33:41
Dzhuliya avatar Dzhuliya 5 Точки

О! Благодаря ти! :)

0
Filkolev avatar Filkolev 4482 Точки

Здравейте и Весела Коледа!

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

Ето както измислих по тази задача: КОД.

Въпросът ми е - схванал ли съм кое как се прави и има ли нещо, което е добре да се промени по някакви съображения? Специално по ООП си мисля, че колкото по-рано схвана как да правя правилно нещата толкова по-добре. Иначе лошо...

Поздрави!

2
25/12/2014 14:26:34
RoYaL avatar RoYaL Trainer 6849 Точки

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

1
Filkolev avatar Filkolev 4482 Точки

Т.е. тези методи или да ги направя статични, или да ги отделя в статичен клас, това ли препоръчваш? Вторият вариант ми се струва доста по-полезен ако реша от други места да ги викам.

Аз в момента съм ги направил и private с идеята, че валидирам данните само при създаване на обект и при промяна отвън. Ако ги изкарам в друг клас не следва ли да ги направя публични? Ако искам като поведение да не се променят нещата, т.е. да останат валидациите private, как да постъпя? Май имаше protected, но става малко сложно, щото трябва да направя Person да наследява тоя клас или... Абе малко навлизам в материя, която ми е мътна. Но като се замисля, що да няма статични публични методи за валидация и да си ги ползва който иска?

0
RoYaL avatar RoYaL Trainer 6849 Точки

Валидацията на имейл може да ти се наложи на много места в апликейшъна, през различно време от това на създаване на обекта, според мен е оправдано да е публичен статичен метод :) Представи си го като метода IsNullOrEmpty от класа String. Той е точно такъв валидационен метод, който е публичен статичен.

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

1
a.polyanska avatar a.polyanska 107 Точки

Здравейте,

 

И аз реших да се поборя с домашните и както винаги имам нужда от помощ :) Все още ми е адски объркано всичко и не съм много сигурна какво правя :) (Кодът на колегата Filkolev  ми служеше за отправна точка, защото ми се видя най-разбираем.) Въпреки това, обаче, нещо не ми се получава и не разбирам защо. Ето моят код: тук

Закоментарила съм пърсъните с грешно подадени данни, но въпреки това при стариране ми дава съобщение: "Parameter Name: Age should be in range 1...100".

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

0
RoYaL avatar RoYaL Trainer 6849 Точки

Опитай се да осъзнаеш ролята на сетъра. Може би не беше добра идея да се почва със C#, тъй като този syntax sugar не винаги помага да се разберат нещата.

Забелязваш ли как на пропъртито Name си написала if (String.IsNullOrEmpty(value))? Това е правилният начин.

set псевдо-методът представлява съкратено това:

private int age;

public void setAge(int value)

{

    this.age = value;

}

 

това което правиш ти в set (или в примера по-горе setAge) е следното

 

private int age;

public void setAge(int value)

{

        if (this.age < 1 || this.age > 100)

        {
            throw new ArgumentOutOfRangeException ("Age shoud be in range 1...100!");
        }
 
    this.age = value;

}

 

Т.е. не проверяваш това, което се подава в параметъра (value) а текущата стойност на age. Тя ще е 0, защото не е иницализирана никога. Когато се опиташ да сетнеш възраст, то ще провери - колко е текущата възраст, ще върне 0, което е по-малко от 1 и ще хвърли ексепшън.

Псевдометодите set в C# имат псевдоаргумента value, който е от съответния тип, от който е и полето. Използвай този аргумент, защото това е подадената от потребителя стойност, която искаш да инжектнеш.

2
a.polyanska avatar a.polyanska 107 Точки

Ахаааа, благодаря за подробното разяснение. Мисля, че поне по тази точка малко от малко ми просветна :)

0
ilian.kostov avatar ilian.kostov 0 Точки

Здравейте колеги!

Ето го и моето решение: Problem-01-Persons

Въпросът ми е защо Visual Studio 2015 иска да премахна "this" от конструкторите и пропъртитата ?

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

Просто защото може и без this, но е препоръчително да се пише с this тъй като е по-лесно четимо и ясно /така няма съмнение, че става дума за поле/пропърти на конкретния обект от класа, а не някой подаден параметър/.

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