Това приемлив случай на използване на троичния оператор ли е?

Използвах троичния оператор, за да изпълня много просто, условно действие. Работи добре, но моята IDE (PHPStorm) го отчете като грешка. Грешката, която получих беше:

'void' method 'performAction' result used

Кодът, който използвах, е следният:

($this->doThis ? $class->performAction() : $class->performDifferentAction());

Грешката в PHPStorm очевидно е грешна; Никъде не използвам резултата от метода void. Просто извиквам методите и това работи според очакванията. Току-що използвах троичния оператор като съкратено за това:

if($this->doThis)
{
    $class->performAction();
}
else
{
    $class->performDifferentAction();
}

Мисля, че това изглежда като валиден случай на използване на троичния оператор. Не е объркано, лесно се чете и е кратко.

Все пак това дефект в дизайна ли е?


person Sherlock    schedule 27.01.2015    source източник
comment
Не изглежда като валиден случай - условен оператор трябва да върне нещо някъде.   -  person zerkms    schedule 27.01.2015
comment
И къде мога да намеря това задължение?   -  person Sherlock    schedule 27.01.2015
comment
Това не е задължение, това е здрав разум. Изразът трябва да върне стойност по дефиниция. Ако бях рецензент на кода за този ред - нямаше да го оставя да мине.   -  person zerkms    schedule 27.01.2015


Отговори (1)


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

Например, вие не бихте написали това, нали?

1 + 2;  // result not used, does nothing

Това, което по същество правите там, е да напишете такъв код, но да добавите страничен ефект към него:

1 + someFunc();  // soooo... does this do anything?

Следователно вашето IDE ви подтиква изрично да напишете код за странични ефекти, като използвате if..else. Той по-директно изразява това, което правите там.

Като казахме всичко това, в крайна сметка зависи от вас и вашия стил. PhpStorm има своите предпочитания; ако искате да ги замените, изключете тази конкретна проверка. Тази проверка обаче е там, за да ви помогне да пишете по-добър код; ще ви предупреди, ако наистина сте забравили да присвоите някъде върната стойност.

person deceze♦    schedule 27.01.2015
comment
Има разлика между вашите 2 примера и моя. Вашият код не прави нищо; моята го прави. (Е, someFunc може да направи нещо, но 1 + очевидно е безполезен. В моя фрагмент няма „безполезен“ код.) - person Sherlock; 27.01.2015
comment
Точно това е въпросът, прави ли 1 + someFunc() прави нещо или не? Върнатата стойност не се използва, така че не прави нищо... или го прави? Вашият код е същият: $foo ? 1 : bar(). Тааааа.... има ли просто правописна грешка и сте забравили да използвате върнатата стойност, или bar() има страничен ефект...? Всичко това е много по-ясно, ако напишете if ($foo) bar(). - person deceze♦; 27.01.2015
comment
е очевидно безполезно --- и ако беше език за програмиране, който приема претоварване на оператори? Ще има ли повече смисъл за вас? - person zerkms; 27.01.2015
comment
@Sherlock Не пропускайте допълнението в последния ми параграф. Тези проверки са налице, за да ви помогнат да пишете по-добър код и да ви заяждат, когато може би допускате грешка. В този случай той не може да разбере дали е грешка или нарочно и ви дразни за това. Добра идея е да напишете код за учебник, който преминава всички валидации, те са там с цел. Да бъдеш умен и сладък рядко води до по-добър код. Писането на код в учебник може да е скучно и многословно, но целта на кода е да свърши нещата и да бъде четим, а не да упражнява синтаксиса на езика. - person deceze♦; 27.01.2015
comment
@deceze Съгласен съм! Затова питам тук. Не ми изглеждаше толкова грешно, но със сигурност IDE го докладва с причина. Все още не съм напълно убеден, но вече промених кода си към по-ясния вариант, преди да публикувам този въпрос. - person Sherlock; 27.01.2015
comment
@Oli Все още не разбирам защо това е нечетливо, но нормалната троична операция не е. - person Sherlock; 27.01.2015
comment
Тъй като никой не го пише по този начин, следователно не сте свикнали да го виждате така, така че анализът отнема повече време. - person Oli; 27.01.2015
comment
@Sherlock защо не? Този код може да причини странични ефекти. - person zerkms; 27.01.2015
comment
@Oli: не сте свикнали да го виждате така, така че анализът отнема повече време. --- в допълнение към тази 110% правилна фраза: когато видите нещо странно, започвате да си мислите, че е направено с някаква специална цел и отделяте още повече време за дешифрирането му. - person zerkms; 27.01.2015