Konrad Mruk

Konrad Mruk Młodszy programista
Java

Temat: Nested if spaghetti

Mam prosty case prowadzący do zabawnego rezultatu.
W skrypciku na mojej astro stronce podmieniam wartość fazy Księżyca na zdefiniowaną literę.
Well, rozrysowanych stanów fazy jest 28 i tyleż mam możliwych odpowiedzi. Pierwsze podejście za pomocą operatora warunkowego wyglada tak:


<?php
/**
*
*/
class MoonPhaseChar {
public static function getMoonPhaseChar($val){
$out = '0';
$out = ($val < 1/28.0) ? '0':
(($val < 2/28.0) ? 'A':
(($val < 3/28.0) ? 'B':
(($val < 4/28.0) ? 'C':
(($val < 5/28.0) ? 'D':
(($val < 6/28.0) ? 'E':
(($val < 7/28.0) ? 'F':
(($val < 8/28.0) ? 'G':
(($val < 9/28.0) ? 'H':
(($val < 10/28.0) ? 'I':
(($val < 11/28.0) ? 'J':
(($val < 12/28.0) ? 'K':
(($val < 13/28.0) ? 'L':
(($val < 14/28.0) ? 'M':
(($val < 15/28.0) ? 'N':
(($val < 16/28.0) ? 'O':
(($val < 17/28.0) ? 'P':
(($val < 18/28.0) ? 'Q':
(($val < 19/28.0) ? 'R':
(($val < 20/28.0) ? 'S':
(($val < 21/28.0) ? 'T':
(($val < 22/28.0) ? 'U':
(($val < 23/28.0) ? 'V':
(($val < 24/28.0) ? 'W':
(($val < 25/28.0) ? 'X':
(($val < 26/28.0) ? 'Y':
(($val < 27/28.0) ? 'Z':
'1')))))))))))))))))))))))))) ;

return $out;
}
}
?>


Wszystko działa, ale dwie rzeczy nie dają mi spokoju:
- natury estetycznej: mnie jako Javowca urzekła ta nieprzeliczalna ilość nawiasów, więc czy da się to zrobić bez nich?
- natury wydajnościowej: czy taki stos warunków jest ok, czy takie sytuacje rozwiązuje się inaczej (switch-case-break)?
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Nested if spaghetti

Jedno co przychodzi mi na myśl, to $val*28 i ceil() do określenia górnego zakresu. Gdy to już mamy, to możemy określić liczbę odpowiadającą wartości. Tu najlepiej posłużyć się ASCII (65 to A, 66 to B itd) i funkcją chr(). To powinno zredukować ciało funkcji i liczbę porównań.

Edit: Dolny i górny chyba ręcznie trzeba będzie ręcznie określić na 0 i 1.Ten post został edytowany przez Autora dnia 05.09.17 o godzinie 03:56
Konrad Mruk

Konrad Mruk Młodszy programista
Java

Temat: Nested if spaghetti

Skorzystałem z podpowiedzi kolegi, i ostatecznie mam to:

public static function getMoonPhaseChar($val){
$chars = array( '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1' );
if ($val>=0 && $val<1) {
$day = (int)($val * 28);
return $chars[$day];
} else {
return '.';
}
}

Jest to na tyle czytelne, że nie wymaga chyba dalszego poprawiania.
Dzięki za wskazówkę, tak czy inaczej.

konto usunięte

Temat: Nested if spaghetti


public static function getMoonPhraseChar($val)
{
return ($val < (1 / 28.0)) ? '0'
: (($val < (27 / 28.0)) ? chr(ceil($val * 28) + 64)
: '1');
}
Ten post został edytowany przez Autora dnia 09.09.17 o godzinie 09:05

Następna dyskusja:

drzewo html tree doctrine n...




Wyślij zaproszenie do