Oświadczenia jednowierszowe i dobre praktyki

11

Niedawno nabrałem nawyku, o którym wiem, że wielu z was może się nie podobać, ale który ostatecznie pomaga mi pilnować globalnej struktury kodu, a nie struktury pojedynczej (czasem) powtarzalnej metody: grupowania liczb instrukcji w jednym wierszu, na przykład:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

w przeciwieństwie do

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Robię to w przypadku powtarzających się zadań, aby zachować ogólny „piękno” kodu i pomóc w łatwym śledzeniu struktury programu, ale przyznaję, że może to nie być dobrą praktyką. Właściwie to często go używam, więc chciałbym wiedzieć, co o tym myślisz. Czy uważasz, że ktoś, kto kiedykolwiek musiałby utrzymywać mój kod, ma problemy z tym podejściem?

Użytkownik
źródło
5
To może być dobre pytanie dla codereview.stackexchange.com
1
Będę miał problem, gdybym miał utrzymać. Pierwszą rzeczą, którą bym zrobił, to CTRL + F dla „;” i przełamać linię. Ale to tylko ja :-). Podoba mi się tylko jeden wiersz, jeśli mam ponowny przykład, na przykład zainicjuj włączone właściwości kilku pól tekstowych z domyślną wartością false: textBox1.Enabled = textBox2.Enabled = false;
Arun
2
Jeśli zadajesz pytanie dotyczące stylu kodowania, pomocne byłoby określenie języka.
Caleb
3
Chociaż może nie wystąpić w podanym przykładzie, jak zamierzasz umieścić punkt przerwania w drugim lub trzecim lub ... instrukcji, jeśli umieścisz je wszystkie w jednym wierszu?
Marjan Venema
1
Poza tym jestem przyzwyczajony do automatycznego formatowania (Java), w którym kod i tak ma jednolity wygląd.
Kwebble,

Odpowiedzi:

22

Naprawdę uważam, że czytelność bardzo ucierpiałaby zarówno dla ciebie, jak i na pewno dla każdego, kto czytałby kod. Wszystko ma sens, gdy piszesz go po raz pierwszy, ponieważ jest to aktywnie w twoim umyśle. Inaczej jest, gdy skanujesz kod, aby zobaczyć, jakie zmienne i funkcje są tam, gdzie ... niszczysz swoją zdolność do skanowania własnego kodu. To ogromne nie-nie, a poza tym źle, jeśli ktokolwiek będzie musiał przeczytać Twój kod.

Pomyśl także o tym, jak czytasz kod. Jest zawsze z góry na dół, przewija w dół. Twoja metoda tego nie łączy, a nawet wprowadza jeden z najbrzydszych możliwych problemów w czytaniu kodu; przewijanie w poziomie . Nigdy nie lekceważ, jak trudne może to być czytanie kodu. Nigdy nie przewijasz w poziomie, nigdy nie zmuszasz ludzi do przewijania w poziomie, w prawie każdym kontekście jest to wyjątkowo nienaturalne.

Ponadto, jeśli problem dotyczy powtarzającego się kodu ... nie zapomnij Ctrl-C. Z twojego przykładowego kodu może być bardziej wydajne wpisywanie tego wszystkiego ręcznie, ale jeśli musisz skopiować kilka wierszy kilka razy, wydaje się, że równie skuteczne byłoby skopiowanie pierwszego wiersza i nowego wiersza, wklej go x razy i dokonaj zmian, rzadziej literówka też.

Aha i literówki! Pogorszenie czytelności kodu w ten sposób może sprawić, że koszmarem będzie stwierdzenie, która z 50 deklaracji zmiennych została ustawiona nieprawidłowo. Większość kompilatorów podaje teraz błędy w wierszach ORAZ numerach kolumn, ale znalezienie błędu w wierszu jest DUŻO łatwiejsze niż znalezienie kolumny.

Ben Brocka
źródło
2
a) Odczytywanie / skanowanie kodu - większość ludzi podczas skanowania kodu czyta kilka pierwszych znaków linii, a następnie przechodzi dalej, chyba że jest to „interesujące”, a następnie czyta jeszcze kilka. Błędy kompilatora: przez większość czasu interpretuję błąd kompilatora jako „Problem z linią <x>”. tylko wtedy, gdy mogę; t natychmiast to rozpracowuję (rzadko), więc właściwie czytam błąd.
mattnz
19

Jedna instrukcja w wierszu ułatwia także sprawdzenie, co zmieniło się w różnicach side-by-side.

Hugo
źródło
2
Jest to prawdopodobnie największy powód, jeśli ktoś musi scalić ten kod, prawie wszystkie narzędzia scalające ułatwią izolowanie i przenoszenie linii zamiast podciągów wierszy.
anon
@ anon Dobra uwaga na temat narzędzi do scalania; jedna instrukcja w wierszu oznacza mniej konfliktów scalania do wyczyszczenia.
Hugo,
10

Chociaż przykład tego nie pokazuje, istnieje inny problem z grupowaniem wielu instrukcji w jednym wierszu. Co jeśli jedno z pięciu stwierdzeń, które masz w jednym wierszu, zgłasza wyjątek?

Twój ślad stosu powie „EBlah w linii N” ... a teraz nie masz pojęcia, które z tych pięciu stwierdzeń spowodowało wyjątek.

(To samo dzieje się z nadmiernie długim stwierdzeniem dowolnego rodzaju).

Frank Shearar
źródło
2
Ta sama koncepcja dotyczy debugowania, w którym ziarnistość jest zwykle numerem linii.
David Hammen
2
O tak, to może być problem. „Ulubionym” jest sytuacja, gdy tracisz wskaźnik zerowy w czymś takim jak foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(składnia Java / C #). Sortowanie tego rodzaju bałaganu jest zawsze lepsze dzięki dodatkowym wierszom (i zmiennym tymczasowym… oraz klockowi wskazówek 2D6 dla oryginalnego programisty).
Donal Fellows
7

Jedna instrukcja na linię to powszechnie stosowany styl kodowania. W rezultacie większość programistów, którzy patrzą na twój kod w przyszłości, prawdopodobnie skrzywi się, gdy zobaczy wiele instrukcji w wierszu. Kiedy jesteś przyzwyczajony do patrzenia na coś w jedną stronę, może to być dezorientujące, gdy patrzysz na to w inny sposób.

Z tego powodu odradzam to, z wyjątkiem rzadkich okoliczności.

Igby Largeman
źródło
4

Ostatnio robiłem to 25 lat temu, używając języków zinterpretowanych na małych mikroprocesorach pracujących z niskimi częstotliwościami zegara, gdzie każde wyeliminowane miejsce lub powrót karetki dawało wzrost wydajności.

Skrzywiłem się na samą myśl o tym (choć zrobiono to z ważnego powodu).

Niestety taki kod jest trudny do odczytania, a zatem trudny do utrzymania.

szybko
źródło
1
Więc piszesz to poprawnie, a następnie usuwasz białe znaki i wszelkie inne przygotowania do „kopii maszynowej”. Tak jak w dzisiejszych czasach minimalizowanie javascript.
CaffGeek
1
Tak - napisałem program do ponownego przetwarzania takiego kodu źródłowego - już w 1986 roku. Mam nadzieję, że już nigdy więcej nie będę musiał tego robić.
Szybko_nie
1

Składniowo, naprawdę nie ma w tym nic złego. To zależy od stylu kodowania twojego zespołu.

Ponieważ większość kodu, który widziałem (w tym kod znajdujący się w standardowych nagłówkach c ++) jest wykonywany w ten sposób, wybrałbym twoją pierwszą metodę.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";
Ciekawski George
źródło
0

To naprawdę niezwykły styl kodowania.

Zalecałbym zamiast tego używać pustych wierszy do rozdzielania logicznych części kodu.

svick
źródło
0

Posunięcie się zbyt daleko w prawo może spowodować tyle samo problemów, co wielu linii.

Musiałem poradzić sobie z niektórymi instrukcjami SQL z dziesiątkami pól. Zwykle umieszczałbym po jednym w wierszu, ale przy kilku okazjach konsolidowałem 3 lub 4 w jednym rzędzie. To wydaje się dobrym pomysłem podczas programowania, gdy musisz przewijać kilka razy w górę i w dół.

Żałuję powrotu do tego kodu. Wydaje się, że posiadanie dodatkowych rzędów nie stwarza większego problemu, więc zwykle to usuwam.

JeffO
źródło
0

Czy uważasz, że ktoś, kto kiedykolwiek musiałby utrzymywać mój kod, ma problemy z tym podejściem?

Po minucie, gdy położył dłonie na głowie, użyje swoich ulubionych funkcji IDE Regex, aby automatycznie rozdzielić cały ten nieczytelny kod na jedną instrukcję w wierszu.

Wystarczy krótkie spojrzenie na pokazany przykład, aby zrozumieć, o ile bardziej czytelne jest drugie podejście.

Znacznie łatwiej jest śledzić pionowy przepływ stron bez konieczności ciągłego przesuwania oczu w poziomie.

Spójrz na swój przykład: od razu wiesz, że kod dotyczy Textwłaściwości różnych textBoxobiektów i zawierają ciąg znaków jako wartości. Całkiem proste.

Jose Faeti
źródło
0

Nie użyłbym takiego stylu osobiście. Podsumowując

Plusy

  • mniej linii kodu do przewijania
  • można użyć do semantycznego grupowania kodu w celu wyrażenia: „dużo rzeczy do przypisania”. ALE zawsze możesz przekształcić taki blok w funkcję, jeśli zbytnio ci to przeszkadza.

Cons

  • trudny do odczytania, ogólnie łatwiej jest czytać kod w poziomie (przeglądanie, brak ruchu oczu, ...)
  • diff łatwo staje się koszmarem, w tym scalaniem
  • trudniejsze do zmiany (kopiuj i wklej, komentowanie, ...)
  • debugowanie może stanowić problem w wielu środowiskach IDE, ponieważ działają one na liniach zamiast na pojedynczych wyrażeniach.
Zniszczyć
źródło
Niektóre „minusy” mogą czasem być zaletami. Załóżmy na przykład, że fragment kodu ma osiem kolejnych operacji formularza if (x > maxX) {x=maxX; peggedAny = true;}. Jeśli każda taka operacja z łatwością zmieści się w jednej linii, wolałbym mieć osiem takich linii niż dziesiątki linii, które dzielą instrukcje. Gdyby takie porównania były stosowane w wystarczającej liczbie miejsc, cztery zdania formularza peggedAny |= pegValueMinMax(ref x, minX, maxX);mogłyby być lepsze, ale ktoś, kto czytałby, musiałby przeczytać, pegValueMinMaxaby zobaczyć, co robi.
supercat
Ponadto, jeśli zmieni się mały fragment linii, „diff” potraktuje to jako zmianę całej linii. Gdyby linia zachowywała się funkcjonalnie jako jednostka, byłoby dobrze. W przeciwnym razie, jeśli operacja semantyczna zostanie podzielona na wiele linii, zmiany niektórych linii mogą wpłynąć na operację w sposób, który nie byłby widoczny.
supercat