„Idealna liczba argumentów dla funkcji wynosi zero” jest po prostu błędna. Idealna liczba argumentów to dokładnie liczba potrzebna do tego, aby twoja funkcja była wolna od efektów ubocznych. Mniej niż to, a niepotrzebnie powodujesz, że twoje funkcje są nieczyste, zmuszając cię do ucieczki od otchłani sukcesu i wspinania się po gradiencie bólu. Czasami „wujek Bob” jest na miejscu z jego radami. Czasami jest spektakularnie w błędzie. Jego rada zero argumentów jest przykładem tego ostatniego
( Źródło: komentarz @David Arno pod innym pytaniem na tej stronie )
Komentarz zyskał spektakularną liczbę 133 pozytywnych opinii, dlatego chciałbym zwrócić większą uwagę na jego treść.
O ile mi wiadomo, istnieją dwa oddzielne sposoby programowania: czyste programowanie funkcjonalne (co zachęca ten komentarz) i mów, nie pytaj (co od czasu do czasu jest również zalecane na tej stronie). AFAIK te dwie zasady są zasadniczo niekompatybilne, bliskie wzajemnym przeciwieństwom: czysta funkcjonalność może być streszczona jako „tylko zwracają wartości, nie mają skutków ubocznych”, podczas gdy powiedz, nie pytaj może być streszczona jako „nie zwracaj niczego, mają tylko skutki uboczne ”. Poza tym jestem trochę zakłopotany, ponieważ myślałem, że powiedz, nie pytaj było uważane za rdzeń paradygmatu OO, podczas gdy czyste funcitony były uważane za rdzeń paradygmatu funkcjonalnego - teraz widzę czyste funkcje zalecane w OO!
Przypuszczam, że programiści powinni wybrać jeden z tych paradygmatów i trzymać się go? Cóż, muszę przyznać, że nigdy nie mogłem zmusić się do naśladowania. Często wydaje mi się, że warto zwrócić wartość i tak naprawdę nie widzę, jak mogę osiągnąć to, co chcę osiągnąć, tylko z efektami ubocznymi. Często wydaje mi się, że mam skutki uboczne i tak naprawdę nie widzę, jak mogę osiągnąć to, co chcę osiągnąć, zwracając wartości. Często też (myślę, że to okropne) mam metody, które robią oba.
Jednak z tych 133 głosów twierdzę, że obecnie czyste programowanie funkcjonalne „wygrywa”, ponieważ staje się konsensusem, że lepiej jest powiedzieć, nie pytaj. Czy to jest poprawne?
Dlatego na przykładzie tej gry opartej na antypatternach staram się stworzyć : Gdybym chciał dostosować ją do czysto funkcjonalnego paradygmatu - JAK ?!
Wydaje mi się rozsądne mieć stan bitwy. Ponieważ jest to gra turowa, trzymam stany bitewne w słowniku (multiplayer - może być wiele bitew rozgrywanych jednocześnie przez wielu graczy). Za każdym razem, gdy gracz wykonuje swoją turę, wzywam odpowiednią metodę w stanie bitwy, która (a) odpowiednio modyfikuje stan i (b) zwraca aktualizacje graczom, które są serializowane do JSON i po prostu mówią im, co właśnie się wydarzyło na tablica. Przypuszczam, że jest to rażące naruszenie ZARÓWNO, a jednocześnie.
OK - Mógłbym uczynić metodę POWRÓT stanem bitwy zamiast modyfikować ją, jeśli naprawdę tego chcę. Ale! Czy będę musiał niepotrzebnie kopiować wszystko w stanie bitwy, aby przywrócić całkowicie nowy stan zamiast go modyfikować?
Może teraz, jeśli ruch jest atakiem, mógłbym po prostu zwrócić postacie zaktualizowane HP? Problem w tym, że nie jest to takie proste: zasady gry, ruch może i często będzie miał znacznie więcej efektów niż tylko usunięcie części HP gracza. Na przykład może zwiększyć odległość między postaciami, zastosować efekty specjalne itp.
Wydaje mi się o wiele prostsze modyfikowanie stanu i zwracanie aktualizacji ...
Ale jak doświadczony inżynier poradziłby sobie z tym?