Софтуерно Инженерство
Loading...
TanyaZheleva avatar TanyaZheleva 356 Точки

[C# OOP Basics] Encapsulation - Problem 04. Shopping Spree

Проблемът е, че винаги дава ексепшън "Name cannot be empty", независимо какво му подавам.

Пробвах да взема хората и продуктите по различни начини (Split/Regex), но дава същото съобщение. Странно е, че с това решение минава последния тест в джъдж, както и един от нулевите.

http://pastebin.com/SGXQU9kf

Тагове:
0
C# OOP Basics
AntyfrizZz avatar AntyfrizZz 238 Точки
Best Answer

Здравей,

 

1) Никъде не инициализираш BagOfProducts в Person класа. Трябва да го направиш в конструктора на класа

2) Проверката за имената трябва да е IsNullOrWhiteSpace (и за 2та класа)

3) В BuyProduct метода, в съобщението което хвърляш при невалидна операция, не трябва да позлваш nameof(this.Name), а само this.Name. Това се отнася и за продукта

4) В този метод никъде не изписваш ако някой е купил успешно продукт "{this.Name} bought {product.Name}"

5) В конструктора на Product класа задаваш стойност на пропъртито да е равна на полето му, а не на подадения от вън през конструктора стринг.

6) Съобщението, което хвърляш при негативна цена е грешно. Не трябва да използваш nameof(this.Cost) и има правописна грешка в думата "nagative"

7) Сложила си кода си в try catch, но той хваща само ArgumentException, а метода BuyProduct ти хвърля InvalidOperationException и ти гърми програмата

8) Когато принтираш кой какво е купил, не трябва да позлваш person a person.Name

 

И няколко съвета:

1) В съобщението за невалидно име използваш {nameof(this.Name)}, което не е нужно. Това не е променлива за всеки клас, а си е просто Name. (отнася се и за 2та класа)

2) В сетъра на BagOfProducts е написано value = new List<Product>();. Това не е ок. value ти се подава отвън. В момента каквото и да подадеш, ще се дефинира празен лист с продукти. Махни го този ред.

3) BagOfProducts може да е с автоматично пропърти.

4) Сетърите на всички пропъртита са публични. Ако не се лъжа пишеш домашно за Encapsulation :)

5) Добре е BuyProduct метода да не е void, а да връща string и някой друг да го обработва (в случая да го принтира)

6) Листа с хора и продукти е добре да се направи Dictionary<string, Person> и Dictionary<string, Product>, като string-а е името на person/product. Така ще имаш по - лесен достъп до тях и ще си спестиш обхожданията на листове с ".Where(p => p.Name == name).FirstOrDefault();"

 

Поздрави!

 

1