Професионална програма
Loading...
+ Нов въпрос
galin.s avatar galin.s 11 Точки

[C# OOP}try-catch, if, while.. проверка от console.readline през друг клас - как?

пичове и дами - един въпрос:

https://github.com/galin-s/CSharpSamples/tree/master/Students

има ли вариант, в който за firstname и lastname от input в program да се направи проверка в student дали са null и, ако са - конзолата да ми вади съобщения "вкарай име", докато наистина взема, че вкарам име?
пробвах с while, do-while - цикълът сработва само веднъж, после си продължава с другите въпроси.
if-ът пък го пробвах за екссепшън - грам не го интересува въведено ли е нещо, или не - директно си изкарва изключение.
и с try-catch - същото.
изобщо - къде ми се губи връзката при console.readline, който шсе обработва в друг клас?
благодаря за вниманието и приятен уикенд wink
 

Тагове:
1
Fundamentals Module
quickben avatar quickben 974 Точки

В сетъра на пропъртито което искаш да не ти е null правиш нещо подобно.

if(string.IsNullOrWhiteSpace(value)) {  throw new ArgumentException();  }

После там където искаш да въвеждаш името(Main метода в твоя случай) го обграждаш с един try - catch, в catch блока хващаш само exception-a който си хвърлил в сетъра на пропъртито което искаш да валидираш и от там може да извикаш Main() и програмата ще започне отначало. Най-добре си направи custom exception InvalidPlayerNameException примерно, за да си гарантираш, че ще хванеш само това изключение което теб те интересува а не някакъв друг, както е описано в добрите практики.

Try-catch-finally не трябва да се използва като control flow механизъм, а това което съм написал прави точно това, също така имай предвид, че твърде много защитно програмиране не е добре за user experience-a и за performance-a на приложението ти, защото цялата работа с exception-ите отнема доста ресурси.

0
05/12/2015 11:34:17
galin.s avatar galin.s 11 Точки

аз затва искам конзолата да ми повтаря да вкарам име, а не да мята ексепшън.
има ли такъв вариант - цикъл в student, който да върти "въведи нещо, де", докато не се въведе нещо :?

0
quickben avatar quickben 974 Точки

Естествено, че има но е грешно да се прави.

bool isInputCorrect = false;

while(isInputCorrect == false)

{

      string input = Console.ReadLine();

      if(input == correct)

     {

          isInputCorrect = true;

     }

}

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

Нещо подобно, но това е подход подходящ по-скоро за C# Basics отколкото за ООП

1
05/12/2015 12:58:13
kosio197 avatar kosio197 104 Точки

Ето малко насоки:

bool b = true;

while (b) {

/* тук четеш в стринг задължително за да не хвърля грешки */

if (/* проверките за корекност са ОК */) { .......; b =false; } else {/*показваш грешка*/} 

ИЛИ

try {/* Парсваш към int или викаш сетър дето хвърля грешка .... */  ...; b=false;} catch (/* някаква грешка */) {/* показваш грешка на конзолата */}

 }

Със същия успех вместо b може да направиш цикъла безкраен - while (true) ... и там където в момента b=false; го сменяш с break; -  тоест цикъла си върти до безкрай и ако си провеерил, че всичко е наред с входа го прекъсваш с break.

Можеш да направиш същото и с do/while цикъл (той винаги може да замени while цикъла, въпроса е спрямо конкретната задача кой цикъл е по - четим ).

В случая за конкретната задача ще се хвърля грешка от сетър или конструктор, затова по удачно е да се ползва try/catch варианта. Понеже пък имаш четете на вход поне един път по подходяш е do/while цикъла.

1
quickben avatar quickben 974 Точки

От КПК гледна точка пърата опция която си посочил нарушава S-a в SOLID принципите, сиреч не е работа там където взимаш вход да следиш дали входа е правилен за даден обект, това трябва да се прави от самия обект, сиреч обекта да си е отговорен за неговите правила а не нещо друго да знае, че този обект има такова правило за валидация и тн... може да го срещнете като self validating object в нета, иначе ще работи по първия начин който си написал, просто няма да е много коректно. (лично мнение)

0
kosio197 avatar kosio197 104 Точки

Ами то в случая мисля, че е ясно, че при положение, че има проверки в конструктур/сетър няма смисъл тази проверка да се дублира в if (чисто логично, абстрахираме се от КПК), но в случая въпроса е как може да се напише някаква функционалност и аз мисля, че е по - коректно да се дадът максимално много възможности за да може да се хване идеята, а вече после кое в кои случаи се ползва е друга тема.

А за КПК - още се не съм го учил ...

1
quickben avatar quickben 974 Точки

И ти прав, но според мен едно нещо когато не е правилно не попада в графата опция, друг е въпроса дали нещо е правилно или не и от там идват различните мнения :)

0
galin.s avatar galin.s 11 Точки

смесих ви съветите, плеснах в сетъра

 while(string.IsNullOrWhiteSpace(value))
                {
                    Console.WriteLine("You must enter a first name: ");
                    value = Console.ReadLine();
                }

и заспа.

ако знаех тая проверка string.IsNullOrWhiteSpace(value) - щях да си спестя доста време хехе

благодаря и на двамата yes

0
quickben avatar quickben 974 Точки

Моля те не го прави това ;)

http://pastebin.com/gv81E1bu - това ти е в Main Метода или нещо подобно.

В сетъра на обекта само проверяваш дали входа е верен ако не е верен хвърляш exception.

Сетъра е един метод, а един метод или трябва да си върши работата или да известява, че не може да си свърши работа(хвърляне на exception примерно), друг принцип който нарушаваш е, че един метод трябва да върши само едно нещо а в твоя случай сетъра се грижи както за валидация така и за взимане на инпут което не е добре, и допълнително създаваш голямо dependancy между обекта и конзолата, сиреч Student-a ти вече не работи без да има референция към конзолата, днес е конзолата която я имаш по подразбиране утре ще е нещо друго което няма да го имаш ей така :)

 Console.WriteLine('Invalid player name'); иаваскрипт хас руинд ми :)

2
05/12/2015 13:33:02
kosio197 avatar kosio197 104 Точки

Тук сме на едно мение с колегата - "Моля те не прави това :)"  - Ако този клас примерно ще се пълни с данни от файл, а не от конзолата? Написано по този начин е не само е обвързано с конзолата, но и с формата на данните (може примерно да поискаш да ги подаваш всичките данни на един ред ...)

2
galin.s avatar galin.s 11 Точки

добре, добре - трия го, само мир да има laugh

правилно ли разбирам, че цялата идея да се лупва "опитай пак" е грешна?

0