Să stabilesc contextul, deşi nu e foarte relevant: fac o aplicaţie care va permite utilizatorilor să platească cu cardul încarcarea abonamentelor Focus Sat.
Dilema mea este una pur filosofică, legată de modul în care pot fi tratate erorile care pot apărea în momentul în care îmi vine notificare de la euplatesc.ro, iar aplicaţia mea va trebui să încerce să încarce abonamentul.
Callback-ul apelat de euplatesc.ro apelează la rândul lui API-ul de la Focus Sat, iar aici erorile pot fi diverse (autentificare eşuată, timeout, smartcard incorect etc).
Well, în acest punct este foarte tentant să adaug în log o intrare în care să descriu detaliile erorii şi execut die(“ERR”) exact în punctul în care mi-a apărut eroarea, un soi de “sudden death”. Abordarea asta este tentantă pentru cel care dezvoltă aplicaţia, pentru îi simplifica mult munca. Însă va fi un coşmar pentru nefericitul care va trebui să întreţină în viitor aplicaţia, pentru că aplicaţia va avea exit-uri random peste tot.
Exemplu de cod:
[...]
auth_focus($username, $password);
[...]
function auth_focus($username, $password)
{
$result = executa_api_focus();
if(!$result)
die("ERR");
}
Cealaltă abordare este să laşi caller-ul să se ocupe să decidă ce să facă cu eroarea, callee-ul urmând doar să-l anunţe că s-a întamplat ceva. Codul va arăta mai profi, dar s-ar putea da în extrema cealaltă, pe care o detest la fel de mult, şi anume over-engineering-ul. Exemplu de cod.
[...]
if(auth_focus($username, $password))
die("ERR");
[...]
function auth_focus($username, $password)
{
$result = executa_api_focus();
if(!$result)
return false;
}
O altă abordare ar fi una intermediară, bazată pe excepţii. Exit-urile tot ar fi random, dar măcar ar fi în limitele blocului try/catch, deci nu ar fi la fel de mult de săpat ca în varianta sudden-death.
Exemplu cod:
[...]
try
{
auth_focus($username, $password);
incarca_abonament($serie_smartcard, $tip_abonament);
}
catch(Exception $e)
{
error_log($e->getMessage());
die("ERR");
}
[...]
function auth_focus($username, $password)
{
$result = executa_api_focus_auth();
if(!$result)
throw new Exception("Parola incorecta");
}
function incarca_abonament($serie_smartcard, $tip_abonament)
{
$result = executa_api_focus_incarca_abonament();
if(!$result)
throw new Exception("Serie smartcard incorecta");
}
M-ar interesa cum procedaţi voi, eventual cu nişte argumente. Sau poate există variante care la care nu m-am gândit.