Czy powinienem używać średników do ograniczania instrukcji Scala?

9

Jestem przyzwyczajony do ograniczania instrukcji średnikiem w Javie, więc oczywiście robię to również w kodzie Scala. Uważam również, że kod jest łatwiejszy do odczytania, ponieważ jest oczywiste, gdzie kończy się jedna instrukcja, a zaczyna inna. Ale wiele razy, gdy umieszczam fragment kodu Scala na SO, kod jest edytowany tylko po to, aby usunąć średniki.

  1. Czy powinienem używać średników, czy nie? Czy istnieją jakieś „oficjalne” wytyczne lub styl kodowania?
  2. Czy są przypadki, w których wymagane są średniki, w przeciwnym razie kod jest niejednoznaczny?
Petr Pudlák
źródło
5
Czy Haskell niczego cię nie nauczył? ; P usuwam niepotrzebną składnię, średników należy używać tylko do rozbicia wielu klauzul / instrukcji w tym samym wierszu
Jimmy Hoffa
@JimmyHoffa Haskell nauczył mnie, że składnia musi być piękna i spójna :).
Petr Pudlák,
2
Pierwszą częścią tego jest to, dlaczego denerwuję się, gdy widzę fragmenty Scali ...
Jimmy Hoffa

Odpowiedzi:

9

Nie ma oficjalnie „właściwego” sposobu, aby to zrobić, ale większość praktykujących omija średniki wszędzie, gdzie jest to możliwe (dlatego tak wiele osób odruchowo usuwa średniki).

Język bardzo stara się sprawić, że w ogóle zapomnisz o konieczności kończenia instrukcji. Niestety, nie do końca się udaje, więc istnieją różne skomplikowane sytuacje, w których średniki, dodatkowy zestaw nawiasów lub podobne „wskazówki” są konieczne, aby uniknąć niechcianej semantyki. Takie sytuacje są prawie tak rzadkie, że zwykle nie musisz o nich myśleć. Opinie różnią się od tego, czy oznacza to, że powinieneś interpunkować defensywnie (tak myślę), czy nigdy nie przerywać, dopóki nie napotkasz kłopotów (tak myśli większość użytkowników). Ostatecznie zależy to od tego, czy identyfikujesz się jako renegat czy modelowy obywatel.

Kilian Foth
źródło
Dzięki, czy mógłbyś podać przykład (lub kilka :)) takich skomplikowanych sytuacji?
Petr Pudlák,
3
Bałem się, że mnie o to zapytają ... Programowanie w Scali wymienia kilka z nich, które mnie zaskoczyły, ale w tej chwili nie mam przy sobie książki i zapominam o szczegółach. Właśnie o to mi chodziło: gdybym pamiętał te wyjątkowe sytuacje, nie byłoby tak źle, ale w tej chwili zawsze nie jestem pewien, czy naprawdę mogę pominąć średnik - więc nie.
Kilian Foth,
Huh Nigdy nie spotkałem się z sytuacją, w której brak średnika w Scali mnie zranił. I nigdy nie obejmują ich. Scalę zaprogramowałem także tylko dla rzeczy podobnych do hobby, więc może prędzej czy później mnie ugryzie.
KChaloux,
4

Jak bardzo chcesz zrozumieć, jakich języków używasz? Chcesz zagrać w jego mocne strony, czy nie? Składnia Scali zachęca do przejrzystego i zwięzłego kodu; kilka skrajnych przypadków, w których skorzystanie z tej przyczyny powoduje problemy dla parsera Scala, jest pouczające (to znaczy, że można dowiedzieć się więcej o Scali, spotykając się z nimi i ucząc się, jak ich unikać) i stopniowo naprawiać (np. notację sufiksową ). Defensywne użycie średnika może oznaczać, że nigdy nie będziesz musiał się uczyć o tych problemach, ale czy naprawdę uważasz to za dobrą rzecz? Rozwiązania tych problemów zwykle mają inne implikacje, ale nie wykorzystasz tych możliwości.

Inną kwestią jest to, że, jak przyznaje Kilian, większość programistów Scali domyślnie pomija średniki. Jak zamierzasz pracować z kodem innych osób, jeśli sam unikniesz używania idiomatycznej Skali? Przekonasz się, że jest to o wiele trudniejsze niż to konieczne.

Nie mogę wystarczająco podkreślić, że te funkcje parsera Scala zostały wybrane w celu zachęcenia do czystego, wielokrotnego użytku i funkcjonalnego (w sensie fp) kodu. Weźmy na przykład składnię operatora infix; zachęca programistów do dostarczania klas prostych, jednozadaniowych metod, które dobrze komponują się razem. Biblioteka kolekcji Scali pokazuje, jak pięknie to może działać. Klasycznie wyszkoleni deweloperzy Java, którzy to przyjmą, będą mieli tendencję do rozwijania lepszych nawyków i nowych sposobów myślenia o swoim kodzie. Ci, którzy trzymają się tych wszystkich znanych kropek i nawiasów, przegapią. Twierdzę, że dotyczy to również tych, którzy są zbyt nieśmiali, aby porzucić średnik.

itsbruce
źródło
8
-1 tak, będąc „zmuszonym” do nauki języka z powodu problemów z kompilatorem, nie działa już w C ++. Poza tym niewiele jest dowodów za twierdzeniami, których chciałbym uzyskać w odpowiedzi z tak stronniczym tonem.
Telastyn
(1) Co powiedział @Telastyn - jeśli naprawdę chcesz nauczyć się języka w ten sposób, zdobądź kota, uwielbiają siedzieć na klawiaturze, ponieważ dbają o twoje wykształcenie. (2) Pominięcie średnika nie ma nic wspólnego z czystym stylem ani zachęcaniem do niego - jeśli już, upuszczanie średników ukrywa fakt, że są to oddzielne instrukcje, które są wykonywane sekwencyjnie i mogą mieć skutki uboczne. Pozostawienie średników powoduje, że zdajesz sobie z tego sprawę i dlatego wolisz bardziej funkcjonalny styl. Decyzja jest zatem czysto syntaktyczna (np. Styl, parsowanie itp.).
Eli Barzilay,
Chociaż „zmuszony do nauki języka” nie lata, „ważne jest odniesienie do używania języka w sposób zamierzony przez jego autorów” i „jak go używa większość programistów”. Przydatne jest utrzymanie spójnego stylu między wieloma programistami. Zarówno tej odpowiedzi, jak i @Killan Foth, opiekunowie i większość programistów najwyraźniej postrzega średnik jako obcy.
Sarah Messer