Czy powinno się unikać metod, które nic nie zwracają (void)?

0

Czy powinno się unikać method, które nic nie zwracają? Jakie są alternatywy? Np. mamy metodę, która po walidacji dodaje usera do bazy danych. Co mogłaby zwrócić taka metoda? Tego usera? Boola w zależności od powodzenia operacji?

3

Generalnie to nie widzę nic zdrożnego w tym, żeby metoda zwracała void.

Z alternatyw to możesz zwrócić ciąg opisujący poszczególne operacje i potem wykonać przy pomocy jakiegoś nadrzędnego bytu. Takie podejście ma chyba nazwę na m...

Jeśli w wyniku takiej operacji coś powstaje to dobrze jest to zwrócić. W przypadku zapisu usera do bazy to jak najbardziej można zwrócić.

Zwracanie boola jak dla mnie jest słabe, bo łatwo to zignorować. Jak się coś wywali to albo rzuć wyjątkiem albo zwracaj Either/Result/jakkolwiek to się nazywa w Twoim języku.

0
Edelner napisał(a):

Czy powinno się unikać method, które nic nie zwracają? Jakie są alternatywy? Np. mamy metodę, która po walidacji dodaje usera do bazy danych. Co mogłaby zwrócić taka metoda? Tego usera? Boola w zależności od powodzenia operacji?

Mam wrażenie że niechęć do void'a wywodzi się z paradygmatu obiektów niezmienniczych (immutable). W tym patrzeniu void to metoda zmieniająca stan, więc wróg.

bool jest kiepski, to jest bardzo w stylu "C".
Jak się nie uda nie daje żadnej informacji. Rzuca się wyjątkami, dla zwolenników programowania funkcyjnego Either

12

Czy powinno się unikać method, które nic nie zwracają?

Tak, bo ciężko testuje się side-effecty, są też generalnie mniej czytelne i jeśli masz coś void to wiadomo że to musi robić pod spodem jakieś mutacje stanu, więc automatycznie nie będzie też thread-safe.

Jakie są alternatywy?

Zwracać wynik xD

Np. mamy metodę, która po walidacji dodaje usera do bazy danych. Co mogłaby zwrócić taka metoda? Tego usera? Boola w zależności od powodzenia operacji?

Moim zdaniem niech zwraca Either<Error,User> dzięki czemu można sobie jeszcze wygodnie składać kilka walidatorów za pomocą flatMap i na koniec wychodzisz z errorem albo z jakimś użytecznym obiektem.

1

Rzadko kiedy jest tak, że kod który nie jest pure (no bo od tego zazwyczaj jest programowanie - robienie side effectów)

jest również "safe", czyli nie robi nic takiego, co mogłoby pójść nie tak, a zatem prawdopodobnie da się w najgorszym wypadku boola zwrócić lub coś lepszego typu jakiś Result

ale nie ma co na siłę uciekać przed voidem

1

Ciężko uniknąć takich metod w przypadku GUI. Alternatywa? Metody w stylu boolean isError(); i Error getLastError();. Nie są one idealne, ale w tym przypadku to ma sens. Wiem, to wymyka się poza OOP, ale programowanie to nie utopijny świat programów bez błędów.

5

Metody void są mocno błędogenne, szczególnie przy refaktoringu (łatwo zapomnieć, wykomentować, łatwo przestawić je w "złej" kolejności).

Alternatywa nieczysta:

  • zwracaj identyfikator użytkownika (ewentualnie razem z błędem Validation<Error, UserId>),
    (jak piszę w javie, w dysfunkcjonalnym zespole to szukam takich rozwiązań (zwykle się da))

Alternatywa czysta:

  • zwracaj monadę (IO),
    ale tu raczej trzeba chcieć, lubieć pisać funkcyjnie - w całym zespole no i java średnio się do tego nadaje

Nie chce tutaj tego rozwijać - robię to przydługo w tym video:

(gdzieś w połowie są naleśniki - czyli monady)

5
Edelner napisał(a):

Czy powinno się unikać method, które nic nie zwracają? Jakie są alternatywy? Np. mamy metodę, która po walidacji dodaje usera do bazy danych. Co mogłaby zwrócić taka metoda? Tego usera? Boola w zależności od powodzenia operacji?

"metodę, która po walidacji dodaje usera do bazy" - to znaczy, że prawidłowy user wchodzi do tej metody, czy ta jedna metoda i waliduje, i dodaje do bazy?
Bo jeśli to drugie, to to nie jest jedna metoda tylko dwie metody, na dodatek w dwóch klasach.

Jeśli chodzi o sam wynik takiej metody dodającej do bazy, to zwróciłbym obiekt usera lub obiekt błędu z konkretnymi informacjami na temat tego, co zaszło.

0

@somekind: To jest agregat. Ma wstrzyknięty validator userów i repository. Metoda tego agregatu przyjmuje usera, potem następuje walidacja przez ten validator i w zależności od wyniku user jest zapisywany lub nie w bazie.

1

Czemu agregat ma walidator, jakiego rodzaju jest to walidacja?
Po co mu repozytorium? Repozytorium powinno zapisywać agregat wywołane z poziomu jakiegoś serwisu aplikacyjnego albo domenowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0