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"; }
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
@b0lec: każda funkcja w JS ma zmienną arguments i możesz np sprawdzać jej length, nie będziesz wiedział dokładnie której zmiennej brakuje, ale jeśli wszystkie są potrzebne to dość proste rozwiazanie. Ładniej też moim zdaniem wprowadzać taki zapis if (typeof name !== ''), ale co kto lubi :)
@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
@Ginden @quiteflame @PanDziobaku @adios @xyleen Dzięks :-) argumentsy chyba najlepsze, ale coś w stylu assertów też wydaje mi się niegłupie. Temat w sumie (chyba) zahacza trochę o testy jednostkowe- coś za co powinienem się zabrać zamiast robić se wymówki że nie ma czasu ( ͡°͜ʖ͡°)
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
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ć.
@b0lec: Zrób funkcję assert i pokrewne, jeśli potrzebujesz.
Dzięks :-) argumentsy chyba najlepsze, ale coś w stylu assertów też wydaje mi się niegłupie.
Temat w sumie (chyba) zahacza trochę o testy jednostkowe- coś za co powinienem się zabrać zamiast robić se wymówki że nie ma czasu ( ͡° ͜ʖ ͡°)
Komentarz usunięty przez autora
Komentarz usunięty przez autora