Metody bez parametrów i puste-Paren w Scali

10

W tej chwili uczę się Scali poprzez Skalę programistyczną Odersky'ego (2. miejsce). Przechodzę do rozdziału 10, w którym zaczyna wprowadzać metody bez parametrów i puste pareny. Po prostu nie mogę tego obejść.

Jak dotąd rozumiem tylko, że powinienem używać pustych parens, jeśli metoda ma skutki uboczne i metody bez parametrów.

Nie mogę ustalić, jaka jest zaleta tej konwencji. Przeczytałem posty na Stack Exchange, ale szczerze mówiąc, kiedy posty zaczęły dogłębnie omawiać ten temat, byłem zagubiony.

Szukam prostego wyjaśnienia, jakie są typowe przypadki użycia tej funkcji języka i jakie są zalety, które pomogą mi lepiej ją zrozumieć.


źródło

Odpowiedzi:

14

Przyjąłem twoje pytanie, dlaczego nie zaprojektować języka, aby w pierwszej kolejności uniknąć konieczności zjazdu? Innymi słowy, dlaczego Scala nie wymusza po prostu używania nawiasów przez cały czas, zamiast pozwolić programistom czasami je pomijać?

Odpowiedź znajduje się w przejrzystości referencyjnej . Zasadniczo, jeśli funkcja nie ma skutków ubocznych, wywołanie funkcji można zastąpić wynikiem, bez zmiany zachowania programu.

Oznacza to, że funkcja bez parametrów lub skutków ubocznych jest semantycznie równoważna z valwartością zwrotną tej funkcji. Ze względu na tę właściwość, w miarę ewolucji klasy, programista może przełączać się pomiędzy używaniem a vallub używaniem funkcji, jak wymaga tego wygoda lub wydajność.

Ponieważ możesz pominąć nawiasy, oznacza to, że wywoływanie kodu coś takiego queue.sizenie musi wiedzieć ani przejmować się, czy sizejest funkcją czy val. Implementator Queueklasy może więc swobodnie zmieniać między nimi bez konieczności zmiany kodu wywołującego (chociaż uważam, że będzie to wymagało ponownej kompilacji). Stabilizuje interfejs publiczny klasy. Na przykład możesz zacząć queue.sizeod wywołania sizeinstrumentu bazowego List, który jest potencjalnie O(n), a następnie zmienić sizena a valze względu na wydajność.

Konwencja sugeruje nawiasy, gdy występują skutki uboczne, aby wyjaśnić, że ten element klasy jest zdecydowanie wywołaniem funkcji, a zatem potencjalnie nie jest referencyjnie przejrzysty. Ważne jest, aby wywoływać kod, aby wiedzieć, czy występują działania niepożądane, aby mogli uniknąć wielokrotnego wywoływania go. Jeśli nie obchodzi cię, czy jest to funkcja, czy nie, równie dobrze możesz potraktować ją, jakby nie była.

Karl Bielefeldt
źródło
6

To konwencja, a nie część projektu językowego. Jest używany jako drogowskaz, aby pomóc ludziom, którzy muszą przeczytać kod po jego napisaniu, aby lepiej go zrozumieć.

Z przewodnika po stylu Scali na temat wywoływania metod:

Scala pozwala pominąć nawiasy w metodach arity-0 (bez argumentów):

reply() 

// is the same as 

reply

Jednak ta składnia powinna być stosowana tylko wtedy, gdy dana metoda nie ma skutków ubocznych (czysto funkcjonalna). Innymi słowy, dopuszczalne byłoby pominięcie nawiasów podczas dzwonienia queue.size, ale nie podczas dzwonienia println().

Religijne przestrzeganie tej konwencji znacznie poprawi czytelność kodu i znacznie ułatwi zrozumienie na pierwszy rzut oka najbardziej podstawowej operacji dowolnej metody. Oprzyj się pokusie pominięcia nawiasów, aby po prostu zapisać dwa znaki!

W .NET konwencja polega na użyciu metod, gdy uruchomienie kodu może zająć trochę czasu (powiedzmy, dłużej niż 50 ms), oraz właściwości (zasadniczo metod pustych paren), gdy nie jest możliwe (tzn. Jest to proste wyszukiwanie).

Robert Harvey
źródło