Podejrzewam, że nie zajrzę do tego pytania, ale jestem bardzo doświadczonym programistą i mam nadzieję, że niektórzy czytelnicy o bardziej otwartych umysłach zwrócą na to uwagę.
Uważam, że lepiej pasuje do języków programowania zorientowanych obiektowo, ponieważ ich procedury zwracania wartości (VRP) są deterministyczne i czyste.
„VRP” to nowoczesna nazwa akademicka funkcji, która jest wywoływana jako część wyrażenia i ma wartość zwracaną, która teoretycznie zastępuje wywołanie podczas oceny wyrażenia. Np. W instrukcji takiej jak x = 1 + f(y)funkcja fsłuży jako VRP.
„Deterministyczna” oznacza, że wynik funkcji zależy tylko od wartości jej parametrów. Jeśli wywołasz go ponownie z tymi samymi wartościami parametrów, na pewno uzyskasz ten sam wynik.
„Czysty” oznacza brak skutków ubocznych: wywołanie funkcji nie robi nic poza obliczeniem wyniku. W praktyce można to interpretować jako brak istotnych skutków ubocznych, więc jeśli VRP wysyła komunikat debugowania za każdym razem, gdy jest wywoływany, prawdopodobnie można to zignorować.
Tak więc, jeśli w C # twoja funkcja nie jest deterministyczna i czysta, mówię, że powinieneś uczynić ją voidfunkcją (innymi słowy, nie VRP), a każda wartość, którą musi zwrócić, powinna zostać zwrócona w parametrze outlub refparametrze.
Na przykład, jeśli masz funkcję usuwania niektórych wierszy z tabeli bazy danych i chcesz, aby zwracała liczbę usuniętych wierszy, powinieneś zadeklarować ją mniej więcej tak:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Jeśli czasami chcesz wywołać tę funkcję, ale nie możesz jej uzyskać count, zawsze możesz zadeklarować przeciążenie.
Możesz chcieć wiedzieć, dlaczego ten styl lepiej pasuje do programowania obiektowego. Ogólnie rzecz biorąc, pasuje do stylu programowania, który można (trochę nieprecyzyjnie) nazwać „programowaniem proceduralnym” i jest to styl programowania proceduralnego, który lepiej pasuje do programowania obiektowego.
Czemu? Klasyczny model obiektów polega na tym, że mają one właściwości (czyli atrybuty), a Ty odpytujesz i manipulujesz obiektem (głównie) poprzez czytanie i aktualizowanie tych właściwości. Proceduralny styl programowania zwykle ułatwia to, ponieważ między operacjami pobierającymi i ustawiającymi właściwości można wykonać dowolny kod.
Wadą programowania proceduralnego jest to, że ponieważ możesz wykonać dowolny kod w dowolnym miejscu, możesz uzyskać bardzo tępe i podatne na błędy interakcje za pośrednictwem zmiennych globalnych i efektów ubocznych.
Tak więc po prostu dobrą praktyką jest zasygnalizowanie komuś czytającemu kod, że funkcja może mieć skutki uboczne, sprawiając, że nie zwraca wartości.