Mój problem opiera się na przypadku użycia funkcji w JavaScripcie, ale sądzę, że jego rozwiązanie (o ile jakieś istnieje) jest cross-language.
Najlepiej wyjaśnię na przykładzie, o co mi chodzi. Mam w projekcie JavaScriptowym funkcję, która przyjmuje jako parametr ciąg znaków i konfigurację, i na tej podstawie tworzy drugi ciąg znaków. (Dla formalności: pisałem o niej już tutaj). Wynik funkcji jest nazywany w domenie programu "pudełkiem". Jej sygnatura wygląda tak:
function createBox(config, content)
Przykład działania: dla wywołania
createBox({ width: 5 }, "to-jest-ciąg-znaków"}
funkcja zwraca
to-je
st-ci
ąg-zn
aków
(Na wszelki wypadek napiszę: to nie są 4 oddzielne ciągi znaków, tylko jeden ciąg znaków zawierający znaki nowej linii).
I teraz dwa pytania z nią powiązane:
- W jakich sytuacjach ta funkcja mogłaby, a w jakich powinna mieć domyślne parametry?
- Według jakich kryteriów w tych sytuacjach należałoby to oceniać?
Mnie przychodzą do głowy dwa kryteria (dla wszystkich funkcji, nie tylko dla tej):
- założenia domenowe (= co funkcja powinna robić według projektu);
- rzeczywiste wywołanie (= co funkcja powinna robić przy konkretnym wywołaniu); nie chodzi mi tutaj o to, że np. w programie (tym samym) funkcja zwróci pusty ciąg znaków w miejscu, w którym go być nie może – wtedy będzie rzeczywiście błąd w projekcie, ale to nie jest zmartwienie tej funkcji, tylko innej.
Te kryteria są (albo jedynie: mogą być?) w pewnej mierze ze sobą sprzeczne. Mam na przykład następującą dychotomię w sobie. Ta funkcja ma w założeniu zwracać ciąg znaków. To założenie nie precyzuje, czy domenowo ma sens zwrócenie pustego ciągu znaków, czy nie. Więc, jeśli jej implementacja odpowiada założeniu (nie jest ani mniej, ani bardziej ścisła), to dla braku parametru reprezentującego ciąg znaków (lub posiadającego wartość typu undefined
oznaczającą, że wywołujący intencjonalnie "nie podał" wartości parametru) (UPDATE:) nie wiadomo, czy ona zwróci pusty ciąg znaków (nie wyrzuci wyjątku ani nie poda żadnego domyślnego tekstu). I dychotomia jest taka: Z jednej strony w domenie programu może to nie mieć sensu (z jakiegokolwiek powodu) – czyli należałoby wyrzucić ten wyjątek w tej sytuacji; z drugiej strony dla użytkownika może to mieć sens – czyli należałoby nie wyrzucać wyjątku, tylko powiedzieć: "OK, argument niepodany, ale musimy coś zwrócić; dajmy pusty ciąg znaków".
Czyli jeszcze raz moje wątpliwości w tym wątku:
- W jakich sytuacjach funkcja (jakakolwiek) mogłaby, a w jakich powinna mieć domyślne parametry? W jakich sytuacjach funkcja może, a w jakich powinna wyrzucać wyjątek w przypadku podania mniejszej/większej liczby argumentów niż zostało to określone w projekcie? W jakich sytuacjach mają sens wartości domyślne typu "pusty ciąg znaków" dla parametru o typie "ciąg znaków", lub "zero" dla parametru o typie "liczba całkowita dodatnia z zerem", lub
undefined
/null
(dla jakiegokolwiek typu)? - Według jakich kryteriów w tych sytuacjach należałoby to oceniać? Czy powyższe dwa (przykładowe) kryteria brzmią sensownie?
Jeśli powyższy przykład jest zbyt prosty, by zrozumieć, o co mi chodzi, podawać inne przykłady; postaram się na ich podstawie to wyjaśnić.
Jeśli trudno zrozumieć, o co mi chodzi, pytać. Idzie mi o to, bym był dobrze zrozumiany. :)
Jeśli w ogóle moje pytanie nie ma sensu, pisać, dlaczego.
UPDATE:
Doszedłem do wniosku, że mój problem jest trochę inny i zawiera się w pytaniu:
Kiedy funkcja powinna kończyć się sukcesem, a kiedy nie (np. wyrzucać wyjątek)?
Względem tego zmieniłem tytuł wątku. Nie zmieniam jednak jego treści, gdyż oceniam, że w dużej mierze jednak ma ona sens nawet przy zmienionym tytule. Jeśli ktoś będzie chcieć odpowiedzieć od strony parametrów, niech tak odpowie; jeśli od strony wyrzucania wyjątków, też będzie dobrze. Poprzedni tytuł: Kiedy parametry funkcji powinny być opcjonalne?
Poza tym zauważyłem, że pod mój problem podpada także wątpliwość: co w sytuacji, gdy parametry będą ze sobą sprzeczne? Dla powyższego przykładu: czy zwracać cokolwiek, czy nie, jeśli użytkownik poda jako pierwszy parametr { width: 5 }
, a jako drugi undefined
? Może to przeoczenie użytkownika – że nie sprawdził swoich wartości?
UPDATE2: Zmieniłem tytuł wątku raz drugi. Poprzedni tytuł: Kiedy funkcja powinna kończyć się sukcesem, a kiedy nie (np. wyrzucać wyjątek)?