Loading...
MiBuena avatar MiBuena 7 Точки

[C#] Как трябва да действа един метод при подаден аргумент null?

Имаме следния код:
 

public string ShortenString(string input)
{
     if (input == null)
     {
          throw new ArgumentException(nameof(input));
     }

     if (input.Length > Constants.MaxLength)
     {
          return input.Substring(0, Constants.MaxLength);
     }

     return input;
}


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

Как е най-правилно -

1. Да оставим метода да хвърля ексепшън, когато се подаде null - както е в момента. Това означава, че трябва да се направи проверка дали подадения аргумент не е null във всички методи, които го викат. - тоест на много места един и същи код.

2. Вторият вариант е да правим проверка в самия метод за null и съответно, ако е null - може да връща празен стринг.

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

Какъв би бил най-КПК подходът според вас в този случай?

Благодаря.
 

Тагове:
0
C# OOP Advanced 02/12/2017 10:57:54
TanyaZheleva avatar TanyaZheleva 354 Точки

Според мен е най-добре да хвърляш ексепшън при string.IsNullOrEmpty / string.IsNullOrWhiteSpace.

1
Pilgrimage avatar Pilgrimage 515 Точки

Решението изцяло зависи от бизнес логиката на програмата.
Ако string-а е за някаво Description поле (което не е [Required]), за което е важно да не се препълни, но няма значение дали е празно или не - спокойно може да се върне Empty String  или същото (т.е. null, ако това няма да счупи нещо).

 

0
MiBuena avatar MiBuena 7 Точки

В случая - няма значение дали ще върне празен стринг или null. И по двата начина няма да счупи приложението - за нещата, за които аз го ползвам.

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

Не е ли по-добре тогава да го направим да хвърля грешка, за да каже, че има невалиден input?

П.С. Понеже се оказа, че ще го ползвам и в други класове - направих метода public и май ще го изнеса в отделен Utilities клас StringManipulator.

 

0
02/12/2017 11:03:51
Quake3 avatar Quake3 546 Точки

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

0
Quake3 avatar Quake3 546 Точки

Когато слагате минус, хубаво е и да се аргументирате защо го правите.
"Спомням си това, което ни каза Наков - че един метод или трябва да свърши каквото имто му казва - или да хвърли ексепшън".
Има и допълнение с пример след тези негови думи: "Все едно, аз като изпратя празен sms- да ми се ребутне телефона."
https://softuni.bg/trainings/resources/video/2044/video-10-oktomvri-2014-nakov-high-quality-code-sep-2014      12:45
С две думи, както Pilgrimage казва, всичко зависи от конкретната задача. Освен това щях да екстендна Стринг :)

0
ValenNEW avatar ValenNEW 51 Точки

Тук има една доста елементарна заблуда.

Ако не въведеш никаква стойност, това не означава че методът "ShortenString" ще съсипе твоята програма.

Ако например не въведеш нищо. Методът няма какво да скъсява, нали така?

И ако потребителят не е въвел нищо и върнеш празен стринг например.

Това е просто празен стринг. Това не е нещо, което променя избора на потребителя.

Например, ако имам 0,00лв за въвеждане в някаква сметка и не въведа нищо. Тогава е лошо.

Защото, ако тогава не въведа нищо т.е. въведа "null". И да съм отчел "null", това няма да мине като запис от 0,00лв, а просто няма да има запис.

NULL е липса на стойност и не може да бъде обект на разсъждение, какво означава. Това просто е NULL и не е стойност.

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

щом става нещо Null това е грешка в кода, да имаш null някъде без да можеш да го контролираш или да знаеш защо това е все едно да караш кола без спирачки.... колегата не дава контекст на метода но  най-малкто трябва да си хвърли exception и то смислен а тоя дето тои го е написал в момента nameof ще върне просто string.

Навсякъде в книгите за код e казано null да имаш е лошо

0
meglenanovoselska avatar meglenanovoselska 1 Точки

A dobre zashto prosto nqmash validation predi da izviukash tozi method, taka si spestqvash logica varte v nego. 

if(!string.IsNotNullOrEmpty("12345"))

ShortenString("12345")

else

print.Out("Problem!");

0
06/09/2018 15:40:45
stoiko.bogev avatar stoiko.bogev 78 Точки

Exception се хвърля при неочаквано поведение. Ако в логиката на програмата очакваш, че ще се подава null като аргумент, можеш да направиш логика какво адекватно поведение да има в тази ситуация и да не хвърляш Exception. Ако ShortenString приема input отвън (от потребител), може да направиш метод който проверява този input и изобщо да не стига невалиден аргумент до ShortenString. Спoред мен не е добре да връщаш празен стринг от този метод, по-добре да връща null. Поведението му се очаква да скъси даден string, а не да създава string при несъществуващ такъв (null).

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