W książce C ++ autor mówi, że nie potrzebujemy już funkcji z długą listą parametrów, ponieważ większość parametrów można przekształcić w zmienne stanu w klasie. Z drugiej strony, funkcjonalny podręcznik programowania mówi, że zmienne stanu są złe, ponieważ powodują skutki uboczne, które powodują podatność na błędy i trudność do zrównoleglenia kodu. Jestem zakłopotany. Czy kod powinien unikać polegania na zmiennych stanu w jak największym stopniu, przenosząc jego zmienną stanu na listę parametrów funkcji?
10
Odpowiedzi:
Zależy, jeśli programujesz w paradygmacie
procedural
lubfunctional
. Stan zmienny jest wymagany dla pierwszego, a okaleczający dla drugiego. To są jabłka i pomarańcze. Obaj mają rację w sprawie bailiwick!Możesz zastosować pojedyncze przypisanie i inne techniki funkcjonalne do imperatywnych języków proceduralnych, stan niezmienny sprawia, że współbieżne programowanie jest bardziej deterministyczne, ale uczynienie każdego obiektu niezmiennym w języku takim jak Java lub C ++ jest prawie niemożliwe, ponieważ ich modele pamięci nie obsługują łatwo tego paradygmatu.
źródło
Jeśli dobrze rozumiem twoje pytanie, zastanawiasz się, jakie warunki kwalifikują albo użycie parametru lub zmiennej klasy / member / field / etc? Zakładam, że masz na myśli metodę, a nie funkcję. Jeśli chodzi konkretnie o C ++, sugeruję przeniesienie pytania do przepełnienia stosu.
Długa lista parametrów może być znakiem, że może być konieczne przeformułowanie metody na zestaw bardziej szczegółowych. Zasadniczo użycie parametrów sprawi, że kod będzie luźniej sprzężony. Nie jestem pewien, czy jest to prawdą w przypadku większości współczesnych języków OO, ale tworzenie obiektów może być kosztowne, zwłaszcza jeśli w grę wchodzi wiele zmiennych klas; tak więc, jeśli zmienne klasy były obiektami i były często przywoływane w programie, można je uzasadnić jako zmienne klasy.
Również:
źródło
Nie, zmienne stanu same w sobie nie powodują skutków ubocznych.
Wywołanie metody settera (w strukturze danych widocznej gdzie indziej) to efekt uboczny.
Możesz mieć struktury danych, aby ukryć długie listy parametrów i uniknąć skutków ubocznych, jeśli odpowiednio je skonstruujesz. Oto mały przykład (w Javie, niesprawdzony):
Oczywiście konstruktor ManyParams nadal będzie miał długą listę parametrów w ten sposób. Ale jest ukryty.
źródło