Wpis z mikrobloga

W javascripcie tworzymy jakąś "ładną" funkcję. O taką na przykład:

var showUserInfo = function(name, surname, age) {
sendDataToEventLogger(name,surname,age);
var formatedData = formatData(name, surname, age);
return formatedData;
}

(Genrealnie nie chodzi mi tu o kod- tylko raczej o dobre praktyki związane z "przeciążaniem" funkcji w js.)
No i jest cacy. Jest cacy, dopóki użyszkodnik danej metody nie zrobi tak:
showUserInfo(name, surname) -> age jak można się domyślić będzie undefined
i pół biedy jak się wysypie- przynajmniej od razu będzie wiadomo że jest błąd- jeżeli funkcja formatData albo sendDataToEventLogger korzysta gdzieś z referencji age.
Dużo gorzej, jeżeli te dane trafiają do jakiegoś przedziwnego API gdzie undefined jest po prostu ignorowany i nic się nie wyświetli.
No z drugiej strony to przeciążanie funkcji w javascripcie jest fajne- bo jest bardzo elastyczne i można pisać mniej kodu. I pisząc przeciążanie mam tu na myśli jedynie ilość parametrów, bo w js ni ma klasycznego przeciążania z uwzględnieniem typów.

No to spróbujmy inaczej:

var showUserInfo = function(name, surname, age) {
if (name === undefined) {
throw "name parameter required";
}

if(surname === undefined) {
throw "name parameter required";
}

if(age === undefined) {
throw "age parameter required";
}

var formatedData = formatData(name, surname, age);
return formatedData;
}

Czy te wypociny powyżej mają wg was jakiś sens? Rzucać wyjątkiem jeżeli userowi zapomni się podać parametr?
Bo stosowanie czegoś takiego na każdym kroku to bez sensu - raczej jest to rozwiązanie gdy piszemy jakieś API, z którego będzie ktoś korzystał.
I wogóle czy taki problem istnieje.
Jestem już dzisiaj zmęczony i być może napisałem bzdury, więc napiszcie co o tym sądzicie drogie miraski.
#javascript #js #programowanie
  • 10
@b0lec: Co do zapisu twojego pomysłu to zrób sobie funkcję do sprawdzania argumentów (i użyj ternary operatora :) ).

Co do pomysłu @quiteflame: zrób switcha

switch (arguments.length - rozmiar wymaganych argumentów) {
case 0:
arg1 = 'sth';
case 1:
arg2 = 'sth';
}

bez breaków :)

EMCA 6 ma domyślne wartości parametrów. Też można tego użyć.
@adios: a czy parametry funkcji wprowadzone jako null lub undefined wpadają do tablicy arguments bo nie bardzo pamiętam, jeśli tak to spoko, jeśli nie to ten switch zadziałała tylko w przypadku jeśli funkcję wywołamy z argumentami np (arg, arg, null, null) a już nie zadziała gdy np (arg, null, null, arg) bo nadpiszesz ostatni argument