Czy powinienem wstawiać znaki nowej linii przed operatorami binarnymi lub po nich? [Zamknięte]

11

Kiedy korzystasz z Pythona lub Javascript, zawsze powinieneś umieszczać operatory binarne na końcu poprzedniego wiersza, aby zapobiec przedwczesnemu kończeniu kodu przez nowe wiersze; pomaga złapać błędy.

Ale w C lub C ++ to nie jest problem, więc zastanawiam się:

Czy jest jakiś powód, dla którego wolę drugą wersję od pierwszej?

return lots_of_text
       + 1;

przeciw

return lots_of_text +
       1;

(Na przykład, czy jeden z nich pomaga zapobiegać innym rodzajom błędów? Czy jeden z nich jest uważany za bardziej czytelny?)

użytkownik541686
źródło
Nie, nie powinieneś tego robić w Pythonie, głównie dlatego, że nie ma efektu, który, jak twierdzisz, ma. Końcowy operator nie powoduje kontynuacji linii; robi odwrotny ukośnik lub ma zamknięte nawiasy, nawiasy klamrowe lub nawiasy klamrowe.
@delnan: Nigdy (bardzo ostrożnie) nigdy nie powiedziałem, że powoduje to kontynuację linii. Wiem, że nadal potrzebujesz dołączania postaci grupujących. Powiedziałem, że pomaga zapobiegać błędom z linią kończącą się przedwcześnie, co robi, dając ci błąd.
user541686,
Rozumiem, ale też tego nie robi. Przynajmniej nigdy tego nie widziałem (i ściśle przestrzegam zasady PEP 8 dotyczącej wstawiania znaków nowej linii po operatorach) i nie wyobrażam sobie nieskonstruowanego kodu, który jest ważny z nową linią przed operatorem, ale nie po nim. Na przykład kod, taki jak w pierwszym fragmencie, również zawiera błędy (z powodu wcięcia). Czy ktoś nie dodaje wcięć podczas podziału linii?
@delnan: W rzeczywistości bardzo łatwo jest przypadkowo zepsuć wcięcie za pomocą edytora tekstu, np. podczas edycji zbiorczej lub zaznaczania prostokątnego. A jeśli / kiedy zdarzy się to podczas konserwacji, nie dostaniesz błędu w pierwszym przypadku i po cichu ześlizgnie się, ale dostaniesz ładny błąd w drugim przypadku.
user541686,
4
Nie jestem pewien, dlaczego zostało to odrzucone. Wydaje się, że to rozsądne pytanie w stylu kodowania.
Stuart Marks

Odpowiedzi:

18

Jak widać z odpowiedzi, nie ma zgody w tej sprawie. Jeśli nie pracujesz w zespole, korzystaj z tego , co jest dla ciebie wygodniejsze.


I wolą wstawienie nowej linii przed operatorami.

Ilekroć muszę łamać linie, zwykle umieszczam co najwyżej jeden wyraz tego samego „poziomu” w wierszu:

Prawo grawitacji Newtona w Pythonie:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

Porównaj to z:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Chcę wiedzieć, że „dzielę przez kwadrat do kwadratu”, nie chcę wiedzieć, że „mass_2 się dzieli”, ponieważ nie tak myślę o wyrażeniach matematycznych.

Co więcej, zwykle chcę najpierw wiedzieć, co robię (operator), zanim zacznę dbać o to, co robię (operandy).

Lub rozważ tę zwiniętą instrukcję SQL:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

To pozwala mi zobaczyć, jak poszczególne warunki są łączone bardzo łatwo, po prostu przesuwając od góry do dołu, bez konieczności czytania każdej linii do końca, aby znaleźć operatora, w przeciwieństwie do:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Myślę o tym pierwszym w kategoriach „ Xjest prawdą”, a następnie poprawiam to, mówiąc: „ ORAZ to także prawda”, co wydaje mi się bardziej naturalne niż na odwrót. Ponadto uważam, że pierwszy jest znacznie łatwiejszy do analizy wizualnej.

Lub przykład PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Ponownie mogę po prostu przeglądać w pionie, aby zobaczyć, że po prostu łączę tekst, ponieważ przez większość czasu czuję, że tak naprawdę nie obchodzi mnie, co jest w łańcuchach / warunkach.

Oczywiście nie zastosowałbym tego stylu bezwarunkowo. Jeśli umieszczenie nowego wiersza za operatorem wydaje mi się bardziej sensowne, zrobiłbym to, ale nie mogę teraz wymyślić żadnego przykładu.

phant0m
źródło
Dodano brakujący nawias do pierwszego przykładu.
kevin cline
1
+1: dokładnie prawda; matematyka jest zawsze składana tak, że linie kontynuacji zaczynają się od operatora.
kevin cline
+1 z tych samych powodów, które opisujesz, ale twój przykład PHP wygląda dla mnie dość dziwnie. Czy te płaszcze nie powinny być ., prawda .=?
Izkata,
@Izkata o tak, oczywiście masz rację. Dzięki. kevin: force
Nawiasy
11

Prawie zawsze łamię wiersze przed operatorami binarnymi, aby czytelnikom kodu było jasne, że jest to kontynuacja wyrażenia, a nie następna instrukcja. Jest to ważne, jeśli następne zdanie byłoby normalnie wcięte. Rozważmy na przykład instrukcję if , która ma złożone wyrażenie warunkowe:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Drugą część wyrażenia warunkowego łatwo pomylić z pierwszym stwierdzeniem części wówczas. Może to być mylące, jeśli pierwsza część warunku jest długa, a && kończy się po prawej stronie. Porównaj to z alternatywą:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Wygląda to nieco dziwnie, ale wyraźnie pokazuje, że druga część warunku nie jest początkiem instrukcji.

Robię to również w innych kontekstach, ale instrukcja if jest najważniejsza, ponieważ wcięcie jest niejednoznaczne. Oczywiście można zmienić wcięcie lub położenie nawiasu klamrowego, ale to również wygląda dziwnie.

tl; dr lewy koniec linii ma większe znaczenie dla szybkiego czytania ze zrozumieniem, więc umieszczenie operatora na lewym końcu jest bardziej widocznym znacznikiem, że jest to ciągłe wyrażenie, a nie stwierdzenie.

Znaki Stuarta
źródło
Interesująca myśl, ale nadal uważam to za dość mylące (szczególnie gdy jest to zrobione +i -które można również rozumieć jako jednoargumentowe operatory prefiksów). Zwykłym rozwiązaniem, które wyróżnia linie ciągłe, jest ich wcięcie bardziej (tj. O dwa poziomy).
Konrad Rudolph,
„Drugą część wyrażenia warunkowego łatwo pomylić z pierwszą instrukcją części wówczas.”: Nie dzieje się tak, jeśli wyrównasz „{” i „}” pionowo (ta sama kolumna), aby utworzyć początek i koniec bloku wyróżniają się wyraźniej.
Giorgio,
8

Zawsze używałbym pierwszego. Chcesz, aby było jasne, co robisz z tym 1 tam. Gdybym to zobaczył, a nad tym 1 był tekst, nie miałbym pojęcia, co się dzieje, jeśli chodzi o użycie tego 1.

Znak „+” obok 1 wyjaśnia, że ​​przynajmniej robię coś z 1, o którym mowa, zamiast spotykać się z „Jestem cały w twoim kodzie ...” bez wyraźnego powodu.

Inżynier świata
źródło
oddelegowany ...........
James
7

Wydaje mi się, że pomaga to w znacznym stopniu czytać ze zrozumienia, gdy wiersz wskazuje, że instrukcja kontynuuje w następnym wierszu, mając operator binarny na końcu, a tym samym czyni instrukcję niekompletną. Brakujący średnik nie wystarczy, abym natychmiast to zrozumiał.

Może to być po prostu kwestia przyzwyczajenia, ale chyba, że ​​pracujesz wyłącznie w językach, które wymagają średnika (co wydaje mi się dość nierealne, biorąc pod uwagę wszechobecność skryptów powłoki, plików makefile i języków takich jak Python), prawdopodobnie nie będziesz miał tego nawyku.

EDYCJA: Giorgio doskonale podkreśla w komentarzach: to użycie odzwierciedla powszechną interpunkcję , zarówno w matematyce, jak i językach naturalnych. Piszesz

Tonę,
dlatego pływałem

Byś nie pisać

Tonę
, dlatego pływałem

Konrad Rudolph
źródło
3
+1: Staram się również czytać + na końcu linii jako przecinek oddzielający dwa elementy na liście operandów. Z tego powodu wolę umieścić znak + na końcu linii, tak jak w przypadku przecinka (nigdy nie zaczynam linii przecinkiem).
Giorgio,
@Giorgio Ten punkt jest tak doskonały, że ukradłem go dla mojej odpowiedzi. Mam nadzieję, że mi wybaczysz.
Konrad Rudolph,
Śmiało: Czuję się zaszczycony. ;-)
Giorgio
7
Kod nie jest angielski i myślę, że fałszywą analogią jest używanie angielskich reguł składniowych jako sposobu uzasadnienia konwencji kodowania. Nie podoba mi się styl operatora końcowego, ale przyznaję, że Konrad ma dobre zdanie na temat języków takich jak Python.
M. Dudley,
3
W składzie matematycznym łamanie linii następuje zawsze przed operatorem, nigdy po nim. W prozaicznym przykładzie operatorem jest „dlatego”. W prozie angielskiej przecinki są w zasadzie śladami oddechu.
kevin cline