Wolisz zwięzłość lub czytelność w swoim kodzie? [Zamknięte]

21

Skróty językowe mogą być często używane, aby kod był bardziej zwięzły.

Na przykład trójskładnikowi i zerowi operatorzy koalescencyjni mogą zmniejszyć ilość kodu, ale prawdopodobnie ze szkodą dla czytelności:

W C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

jest funkcjonalnie równoważny z:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

ale oczywiście dużo bardziej szczegółowe.

Gdzie wyznaczasz granicę, jeśli chodzi o zwięzłość a czytelność?

Damovisa
źródło
3
To subiektywne pytanie, ktoś, kto coś wdrożył, powiedziałby, że jego sposób ma sens, ktoś czytający to powiedziałby, że to nie ma sensu, a inna osoba czytająca to powiedziałaby, że rozumiem, ale wolę inny sposób. To tylko preferencja.
Chris
20
Myślę, że druga wersja jest bardziej czytelna.
Vaibhav,
2
Mylicie zwięzłość ze zwięzłością. Zwięzłość poprawia czytelność. Terseness szkodzi temu.
Ferruccio
1
@ ThorbjørnRavnAndersen: Odbiorcami kodu C # są zwykle „programiści z tłem C #”. Z tego, co widziałem, tutaj konsensus w sprawie programistów.se wydaje się być taki, że nie powinieneś unikać używania przydatnych funkcji językowych tylko dlatego, że ktoś może ich nie znać. (Zobacz także: programmers.stackexchange.com/q/101513/33843. )
Heinzi
1
duplikat ?: programmers.stackexchange.com/q/58630/15464 .. Och, ten jest starszy. :)
Steven Jeuris

Odpowiedzi:

63

Obie.

Twój pierwszy przykład jest z pewnością bardziej szczegółowy i prawdopodobnie bardziej wyraźny ... ale wymaga również ode mnie zeskanowania pięciu wierszy zamiast jednego. Co gorsza, podkreśla swój cel - przypisuje wartość newGuy.Boss.

Twój drugi przykład może kosztować mnie sekundę, jeśli nie jestem zaznajomiony z operatorem koalescencji zerowej, ale nie mam wątpliwości co do jego przeznaczenia, a jeśli skanuję większą procedurę w poszukiwaniu źródła wartości, będzie ona wybranie tego będzie dla mnie łatwiejsze.

Teraz kontrast:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...z:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

Ten drugi przykład jest znowu znacznie krótszy, ale teraz zaciemnia swój cel, sprawiając, że zadania uruchamiane przez ten sam test wydają się wyraźne. Tutaj uważam, że gadatliwość tego pierwszego jest uzasadniona.

Shog9
źródło
3
Doskonała odpowiedź! - Tu nie chodzi o gadatliwość, ale o cel.
Damovisa,
2
@Damovisa: dokładnie - celem kodu jest komunikacja i nie ma ogólnego powodu, dla którego nie powinno się tego robić tak zwięźle, jak to możliwe (ale nie więcej).
Shog9
1
Nauka zerowego operatora koalescencyjnego zajmie więcej niż sekundę - ale jeśli go nie znasz, powinieneś się go nauczyć!
Casebash,
2
Ah „??” byłoby miło w Javie.
Chociaż ostatni przykład jest krótszy pod względem kodu, w rzeczywistości ocenia boss3 razy, a nie tylko raz w przykładowym. Jest to kolejny powód, dla którego krótszy kod tylko dlatego, że jest krótszy, jest złym pomysłem. Myślę, że zwięzłość powinna być najważniejsza dla podstawowego celu, niezależnie od tego, czy jest to czytelność / łatwość konserwacji (w przypadku złożonego kodu), czy wydajność (w przypadku krytycznych sekcji wewnętrznych pętli itp.). Innymi słowy, nigdy nie optymalizuj wyłącznie pod kątem zwięzłości - chyba że planujesz wysłać swój kod przez połączenie 1bps;)
user193130
16

Chociaż oba są dobrymi celami, zawsze będę po stronie czytelności gdy zmuszony wybrać jeden.

Twierdziłbym, że twój przykład poprawia zarówno czytelność, jak i zwięzłość. Zastanów się jednak:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

w przeciwieństwie do

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

To ostatnie jest zwięzłe, ale trudne do odczytania. Ta pierwsza jest pełna, ale logika jest wyraźna.

Krótko mówiąc, zwięzłość nie służy większemu celowi niż umiejętność lepszego dopasowania się do ekranu. Czytelność ułatwia debugowanie i dlatego powinna być ogólnie preferowana.

Fishtoaster
źródło
11
Właściwe formatowanie może łatwo poprawić czytelność drugiego przykładu. To niesprawiedliwe porównanie. Po sformatowaniu w ten sposób nie jestem wcale pewien, czy jest tak źle.
Steven Jeuris
Próbki kodu nie są równoważne: brakuje pierwszego ?? whatever.something.
John B. Lambe,
11

Zasadniczo powiedziałbym, że nigdy nie poświęcaj czytelności ze względu na zwięzłość, ale nigdy nie oceniaj czytelności na podstawie braku wiedzy na ten temat u innych programistów.

Zwięzłość i czytelność nie są przeciwieństwami. Podobnie jak ta odpowiedź, czasami krótsza jest bardziej czytelna.

Brian R. Bondy
źródło
4
+1 za nieprzyjęcie braku wiedzy innego programisty. W podanym przykładzie druga opcja jest mniej czytelna, jeśli nie znasz operatora zerowego koalescencji. Nigdy nie napisałbym swojego kodu w oparciu o założenie, że moi współpracownicy nie znają składni języka. Nawet jeśli nie wiedzieli, co to ??znaczy, jeśli go użyję, a potem się nauczą, oboje skorzystaliśmy. I nie jest tak, że trudno jest wpisać „operator” na msdn.com
Tim Goodman,
4

Powiedziałbym, że wolę czytelność, choć czasem oznacza to użycie zwięzłego kodu. (To znaczy trójskładnikowe dla stosunkowo prostych warunków warunkowych w większym bloku warunkowym.)

Zasadniczo, jeśli jest to niepotrzebnie trudne do zrozumienia, nie rób tego.

George Marian
źródło
3

Czytelność jest najważniejsza tam, gdzie jest sprzeczna ze zwięzłością, ponieważ kod jest modyfikowany częściej niż jest początkowo napisany. Z drugiej strony:

  1. Hałas syntaktyczny i kod płyty głównej często zaciemniają intencje, a tym samym ograniczają czytelność. Czasami bardziej zwięzły kod jest również bardziej czytelny. Pomyślmy na przykład o funkcjach lambda lub funkcjach delegowanych / pierwszorzędnych w porównaniu z klasami z jedną metodą, które implementują interfejs z jedną metodą.

  2. Czytelność należy oceniać na podstawie tego, jak łatwy jest odczyt kodu dla dość doświadczonego programisty, który zna język i jego unikalne / zaawansowane funkcje dość dobrze, a nie dla mało kompetentnych małp kodowych, które znają tylko najniższy wspólny mianownik.

dsimcha
źródło
2

Jeden aspekt, który moim zdaniem nie został jeszcze wspomniany: jakie są twoje cele?

Jeśli zależy Ci tylko na bezpieczeństwie pracy, zwróć się o zwięzłość i zwartość w stosunku do wszystkiego innego. Pomiń też komentowanie swojego kodu.

Jeśli chcesz mieć możliwość łatwego przekazania kodu komuś innemu podczas pracy nad nowym, świetnym projektem, wybierz czytelność, przejrzystość i wiele solidnych komentarzy.

Uwaga: powyższe nie dotyczy ciebie osobiście, @Damovisa; jest dla każdego, kto wybiera pomiędzy dwiema pozycjami.

Dori
źródło
To brzmi jak zabezpieczenie pracy, ale jeśli chcesz zostać programistą, to bezpieczeństwo pracy w niewłaściwej firmie ...;)
Alois Mahdal
2

Zaletą tej pełnej wersji jest jedna rzecz.

Ma więcej linii, a większość debuggerów jest zorientowana liniowo ! Bardzo trudno jest ustawić punkt przerwania w środku wyrażenia, ale zwykle jest to banalnie proste, aby ustawić go w instrukcji blokowej.

Innymi słowy, który z nich chciałbyś zobaczyć w swoim edytorze, jeśli chcesz, aby debugger uruchomił się, kiedy boss == null?

(Powiedział, że podoba mi się operator ??)


źródło
0

Czytelność powinna być na pierwszym miejscu, w dłuższej perspektywie większość ludzi spędza najwięcej czasu na modyfikowaniu lub rozszerzaniu istniejącego kodu - czytelność jest dużą częścią łatwości konserwacji.

To powiedziawszy, zwięzłość jest czymś, co może przyczynić się do czytelności. Na przykład w twoim pytaniu drugi fragment jest bardziej czytelny i zwięzły.

FinnNk
źródło