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 f
sł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ą void
funkcją (innymi słowy, nie VRP), a każda wartość, którą musi zwrócić, powinna zostać zwrócona w parametrze out
lub ref
parametrze.
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.