Czy piszesz estetyczny wizualnie, zgodny z konwencjami danego języka kod?

1

Jak u Was jest z estetyką kodu? Przyznam, że mam na tym punkcie świra, gdy widzę jakieś białe znaki na końcu linii, to dostaję białej gorączki. Gdy widzę niespójność w projekcie (jedna osoba otacza wszystkie nawiasy spacjami, druga nie daje spacji nawet po if/for/while i przed klamrą otwierającą blok w Javie), to automatycznie rzucam kurvami na lewo i prawo. Jak słyszę "a co to za różnica? przecież to tylko spacja", to mi ręce opadają. Jeżeli nie robi Ci to różnicy, to rób zgodnie z konwencjami języka! Ale nie, "przecież to jest tak samo czytelne". Dlaczego ludzie nie zdają sobie sprawy z tego, że kod wygląda na zdecydowanie czytelniejszy, gdy jest sformatowany i ułożony tak, jak w oficjalnych dokumentacjach i milionach porządnych listingów w sieci? Gdy w każdym miejscu projektu wygląda tak samo? Kod nie trzymający oficjalnych konwencji lub konwencji projektu wygląda niechlujnie (tu dam spację po ifie, a tu nie - i tak na zmianę, jak się klawisz wciśnie)! Dlaczego ludzie nie używają formatterów, a jak używają, to formatują cały plik, nawet wtedy, gdy fragmenty były formatowane ręcznie w celu polepszenia czytelności względem standardowego formattera? Dlaczego ludzie mają w dupie kwestię estetyki wizualnej kodu?

KUWA! JA PIEDOLĘ!

Co Wy o tym myślicie?

0

Dubel, proszę o usunięcie.

0

Temat oklepany już.

Z moich obserwacji wynika, że mało jest ludzi z pasją, a co za tym idzie - mało jest ludzi biorących sobie do sera czysty i czytelny kod. Nie rozumieją jak ważne to jest i jakie korzyści to za sobą niesie )a jakie wady niesie "brudny" kod).

Ludzie, często nawet pracujący zawodowo piszą kod tak by "działał" i na tym poprzestają. Kod natomiast wymaga dopieszczenia.

Na moje - za dużo jest ludzi - idiotów by cokolwiek się z tym dało zrobić.
Jak widzę kod na więcej jak 15 linijek to też mnie szał dopada.

0

Chciałbym podkreślić, że mówimy tutaj o samej estetyce - najmniejsze spacje, wcięcia, nawiasy, formatowanie. Czytelność strukturalną kodu odstawmy na razie na bok (ten temat jest oklepany).

Zauważam, że zdecydowana większość ludzi nie tylko z pracy ma to w dupie.

2

ale co mamy Ci współczuć czy co bo nie rozumiem? Większość normalnych IDE ma wbudowane/przez plugin formatowanie kodu, VS nawet robi to "w biegu". Jak mam jakiś obcy kod to pierwsze co robię to go przepuszczam przez formatter i mam dokładnie tak jak ja chcę i jak mi się podoba. A jak pracuję z kimś w zespole to albo stosuje się do zasad formatowania jakie narzucony ma CAŁY zespół albo zmienia pracę/nie dostaje premii - przetestowane i mobilizuje lepiej niż jakiekolwiek prośby/groźby.

1

Każde normalne IDE ma autoformatter. Do Eclipse masz też takie cudo jak Checkstyle które bedzie wyświetlać warningi jak ktoś nie będzie się stosował do zasad ;)

0

Jeżeli nie robi Ci to różnicy, to rób zgodnie z konwencjami języka!

Konwencje języka nie mówią o tym, czy stosować spację po if czy nie.

Chciałbym podkreślić, że mówimy tutaj o samej estetyce - najmniejsze spacje, wcięcia, nawiasy, formatowanie.

Najgorsze to jest jak ktoś narzuca komuś swoją estetykę, bo takiemu się najtrudniej dostosować do obowiązujących zasad formatowania, które mu nie pasują. I będzie się kłócił godzinami o położenie spacji.

1
Mr Obvious napisał(a):

Jeżeli nie robi Ci to różnicy, to rób zgodnie z konwencjami języka!

Konwencje języka nie mówią o tym, czy stosować spację po if czy nie.

Spoko. Spójrz misiu:
http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141388.html#475

Mr Obvious napisał(a):

Chciałbym podkreślić, że mówimy tutaj o samej estetyce - najmniejsze spacje, wcięcia, nawiasy, formatowanie.

Najgorsze to jest jak ktoś narzuca komuś swoją estetykę, bo takiemu się najtrudniej dostosować do obowiązujących zasad formatowania, które mu nie pasują. I będzie się kłócił godzinami o położenie spacji.

</quote>

Umiesz czytać ze zrozumieniem? Mówię wyraźnie, że formatuję zgodnie z zasadami, czy to projektu, czy ogólnymi, A NIE SWOIMI! Akurat w moim obecnym projekcie nie ma narzuconego formattera, dlatego uważam, że powinno się stosować konwencje oficjalne, które są stosowane w oficjalnej dokumentacji, tysiącach książek i setkach tysięcy listingów w sieci. Kłócę się godzinami o położenie spacji, gdy nie jest zgodne z jakimikolwiek konwencjami. Jesteś chyba przykładem typa, który ma w dupie konwencje.

Gardzę tobą.

1

biedne dziecko skrzywdzone przez los. Podaj numer KRS na który mogę przekazać mój 1% podatku aby ci pomóc...

0

Nie mogę patrzeć na chu**** źle napisany kod. Musi być czytelnie, a to czy ktoś stosuje spację w nawiasach czy nie akurat mi wisi, tak i tak jest czytelnie. Bardziej mnie przeraża nie stosowanie spacji po i przed = . Kod powinien być sformatowany tak, aby był czytelny, nie ważne jak dokładnie.

1

No bez kitu... jakby ktoś się do mnie przyczepił, że nie robię spacji między if/while/nazwią funkcji a nawiasem to bym go wyśmiał.
Osobiście nie lubię pisać tam spacji, niezależnie od języka w jakim akurat piszę.

Za to nie trawię klamerek w tej samej linii co wyrażenie, brrr!

0

Ja też staram się kodować estetycznie. Takie pytanie mam, kiedy stosować odstęp w postaci pustej linijki ?

0

jeśli chodzi o formatowanie kodu, to zawsze mam idealnie tak samo. jeśli chodzi o nazwy zmiennych/funkcji/metod to staram się mieć spójnie tak samo (zazwyczaj w tym samym projekcie mam tak samo). jeśli chodzi o czytelność kodu to czasami zdarza mi się napisać brzydki kod na szybko, ale mam z tego powodu wyrzuty sumienia. jeśli chodzi o spacje na końcu to są dla mnie strasznie denerwujące.

asd(...);
if (...)
{
  asd(...);
}
asd(...);

taki sposób pisania mnie drażni, wolę tak:

asd(...);
if (...)
  {
    asd(...);
  }
asd(...);

zapis if (...) { (klamra w tej samej linii) powoduje u mnie dwukrotne zwiększenie czasu analizy tego fragmentu. kiedyś drażniło mnie to bardziej, teraz raczej odrobine dekoncentruje.

3

A jakie to konwencje oficjalne? Czy jeśli np. Oracle mówi, że mam stosować spację a MS, że nie, to którą mam przyjąć?

To chyba oczywiste, że konwencję twórców danego języka - pisałem o tym wyraźnie. Javę stworzyło Sun, przejęte przez ORACLE. Te konwencje na stronie ORACLE'a, które podałem, są stworzone przez twórców języka Java i ich należy się trzymać. W C# powinieneś pisać tak, jak to robi wszędzie MS (dokumentacje itp.) - nie wiem czy mają podobny dokument z zaleceniami. Oczywiście robimy tak tylko wtedy, gdy w projekcie nie narzucono wewnętrznego formattera. Jak piszemy sami, to też jak nam w duszy gra (osobiście stosuję wtedy konwencję twórców języka).

1

jeśli jakiś fragment kodu dotyczy jednej rzeczy, a drugi drugiej i czujesz, że poprawi to czytelność. - krwq

zamiast pustej linijki stosuję komentarz-separator: np. //------------------------------ - bogdans

Oba te sposoby to wielki błąd. No może nie wielki, ale dość poważny.
Jeśli w funkcji występują wyrażenia, które nie są ze sobą powiązane, to należy je nie tylko oddzielić (czy to pustą linią, czy też komentarzem), ale należy umieścić te wyrażenia w osobnych funkcjach.
To jest w sumie podstawa omawiana w książce "czysty kod"...

3
ClearCode napisał(a):

Jeśli w funkcji występują wyrażenia, które nie są ze sobą powiązane, to należy je nie tylko oddzielić (czy to pustą linią, czy też komentarzem), ale należy umieścić te wyrażenia w osobnych funkcjach.

Każde jednolinijkowe wyrażenie w oddzielnej funkcji?

Funkcja często wygląda tak:

  1. asercje;
  2. logowanie rozpoczęcia operacji;
  3. pętla przetwarzające dane;
  4. logowanie zakończenia operacji;
  5. zwrócenie wyniku

Ja każdą z tych sekcji oddzielę pustą linią. Ale na pewno nie będę tworzył funkcji, która ma przyjmować coś, tylko po to, żeby to zwrócić. :D

0

Jeśli "coś" ma 2 linijki to lepiej stworzyć funkcję dla tych dwóch linijek, a następnie wywołać tę funkcję.
Tym bardziej, że z tego samego wyrażenia możesz chcieć skorzystać gdzieś indziej w kodzie.
Gdybyś w takim przypadku nie stworzył osobnej funkcji to złamał byś zasadę DRY.

Dla jedno-linijkowych wyrażeń także czasami warto zrobić oddzielną funkcję.

1

Programowanie funkcyjne FTW!
:D

0

Jeśli "coś" ma 2 linijki to lepiej stworzyć funkcję dla tych dwóch linijek, a następnie wywołać tę funkcję.
Tym bardziej, że z tego samego wyrażenia możesz chcieć skorzystać gdzieś indziej w kodzie.
Gdybyś w takim przypadku nie stworzył osobnej funkcji to złamał byś zasadę DRY.

Dla jedno-linijkowych wyrażeń także czasami warto zrobić oddzielną funkcję.

Wygłupiasz się czy piszesz poważnie? Jeśli to drugie to znaczy że nie zrozumiałeś książki którą przeczytałeś.

Co byś powiedział na (pierwszy z brzegu, zakładka na której mam otworzone IDE) taką funkcję:

var context = CreateRenderContext();
context.BeginScene();

state.Render(context);

context.EndScene();
base.SwapBuffers();

Co tutaj ma iść do oddzielnej funkcji? Z drugiej strony z ostępów rezygnować nie chcę bo odgraniczają wstęp funkcji, część właściwą i zakończenie.
Dalej, właściwie zawsze stosuję odstęp przed for, while, etc. Dla każdego for-a ma być oddzielna funkcja?
To tylko dwa przykłady sytuacji kiedy stosowanie odstępów jest sensowne. Można je mnożyć.

0

MSM:
Hmm mniej więcej coś takiego można by zrobić:

def otaczająca(body: () => Unit) {
val context = Create()
context.BeginScene()
body()
context.EndScene()
base.SwapBuffers()
}

No chyba, że nie zrozumiałem intencji kodu.

1

Co do formatowania, to - o ile nikt mi go nie narzuca - zawsze stosuję to, które używa samo IDE. Zwykle lekko konfiguruję formattera Eclipse i potem co jakiś czas cisnę ctrl+shift+F. Chociaż zwykle jesteśmy zgodni i przydaje się to głównie podczas pisania dokumentacji, bo równo zawija wiersze. Praktycznie nie poprawiam, bo i tak musiałbym to robić za każdym razem po sformatowaniu (dodaję jedynie drugą pustą linię między polami a konstruktorami a metodami - tego się Eclipse nie czepia).

Nie cierpię za to ślaczków w komentarzach, jak to bogdans pokazał i ogłupia mnie położenie klamerek w innym miejscu niż zaraz po wyrażeniu (chyba że jest to C/C++, tam raczej przeważa konwencja w nowej linii).

0

@Wibowit - i musiałem się namęczyć żeby zrozumieć o co chodzi :P. Ale OK, nie piszę w Scali i składnia trochę obca.

Ładniej by może było tak

using (var ctx = CreateRenderContext())
{
    state.Render(ctx);
}

base.SwapBuffers();

Tylko że trochę to wtf-owe.

Albo lepiej tak:

ExecuteContext((ctx) => state.Render(ctx));

base.SwapBuffers();

Ale z istniejącym API nijak się nie da dyskutować a dwie linie to dość nieduża cena za czytelność.

0

iooi:
Ja w Eclipse ustawiłem, żeby nie łączył już podzielonych linii, bo już mnie doprowadzał do szału jak mi dzielił w idiotyczny sposób linie.

1

Naprawdę nie rozumiem, co ja takiego niezrozumiałego napisałem.

SomeClass DoSomething(Class1 arg1, Class2 arg2)
{
    this.AssertNotNull(arg1);
    this.AssertNotNull(arg2);
    
    if (arg1.Count != arg2.Count)
    {
         throw new ArgumentException("args count should be equal");
    }

    this.logger.Info("process started: {0} {1} at {2}", arg1, arg2, DateTime.Now);

    SomeClass result = new SomeClass(arg1.Description, arg2.Number);
    for (int i = 0; i < arg1.Count; i++)
    {
         result[i] = arg1.Prices[i] + arg2.Prices[i] * arg1.BonusRate[i];
    }

    this.logger.Info("process finished: {0} {1} at {2}", arg1, arg2, DateTime.Now);

    return result;
}

Życzę powodzenia w dzieleniu z zachowaniem jednocześnie DRY i KISS, a przede wszystkim zdrowego rozsądku.

0

Dokładając się do tematu, który system nawiasów preferujecie dla własnych nowych projektów (http://astyle.sourceforge.net/astyle.html#_Bracket_Style_Options)? Ja przez długi czas używałem -A2, ale ostatnio bardziej spodobał mi się ten lispowaty.

0

No nie wiem jak Ty, ale ja bym to doprowadził chociaż do takiej postaci:

void IsCorrect()
{
    this.AssertNotNull(arg1);
    this.AssertNotNull(arg2);
    this.CheckCorrect(arg1, arg2);
}

SomeClass DoSomething(Class1 arg1, Class2 arg2)
{
    if (IsCorrect() == false) return;
    this.logger.Info("process started: {0} {1} at {2}", arg1, arg2, DateTime.Now);
    
    SomeClass result = new SomeClass(arg1.Description, arg2.Number);
    result = this.Operation(arg1, arg2);
 
    this.logger.Info("process finished: {0} {1} at {2}", arg1, arg2, DateTime.Now);
 
    return new SomeClass(arg1.Description, arg2.Number);
}

Ten kod jest dużo lepszy i czytelniejszy.

0

W IsCorrect oczywiście jeszcze dodać parametry trzeba :)

0

źeby się jeszcze kompilował

No jeśli Twoje zdolności poprawienia mojego kodu do kompilacji Cię przerastają to cóż...
Pisałem tutaj na forum bez kompilatora, nic dziwnego, że się nie skompiluje. Kilka poprawek nie mających żadnego znaczenia i już. Wystarczy lekko ruszyć szarymi komórkami.

2
ClearCode napisał(a):

No nie wiem jak Ty, ale ja bym to doprowadził chociaż do takiej postaci:

void IsCorrect()
{
    this.AssertNotNull(arg1);
    this.AssertNotNull(arg2);
    this.CheckCorrect(arg1, arg2);
}

SomeClass DoSomething(Class1 arg1, Class2 arg2)
{
    if (IsCorrect() == false) return;
    this.logger.Info("process started: {0} {1} at {2}", arg1, arg2, DateTime.Now);
    
    SomeClass result = new SomeClass(arg1.Description, arg2.Number);
    result = this.Operation(arg1, arg2);
 
    this.logger.Info("process finished: {0} {1} at {2}", arg1, arg2, DateTime.Now);
 
    return new SomeClass(arg1.Description, arg2.Number);
}

Ten kod jest dużo lepszy i czytelniejszy.

[glowa]
Zaiste, dużo lepszy i czytelniejszy.

IsCorrect przyjmuje parametry a Ty go wywołałeś bez. Niepokalane poczęcie?
IsCorrect - świetna nazwa na funkcję... Wybacz, ale mam wrażenie że powinieneś jeszcze raz przeczytać swoją książkę.
if(IsCorrect() == false) return; - genialne.
Po pierwsze, po ludzku będzie if (!IsCorrect())
Po drugie, IsCorrect zwraca void, nie bool.
Po trzecie DoSomething nie zwraca void a ty próbujesz wyjść z funkcji bez zwracania czegokolwiek.

Inaczej mówiąc, napisałeś dwie linijki (licząc deklarację funkcji) i zrobiłeś w nich pięć błędów. Nieźle, nieźle.

2

Zwyczajnie zepsułeś tę metodę, już nie mówiąc o tym, że spadła jej czytelność.

Zaczynając od dodatkowej metody na sprawdzenie parametrów, od jej nazwy: co jest poprawne? Obiekt klasy? Bo to sugeruje jej nazwa, która bardziej by się nadawała na właściwość.
W samej metodzie, ta początkowa instrukcja warunkowa jest zupełnie bez sensu. Nie dość, że IsCorrect nic nie zwraca, a rzuca wyjątki (ten return jest więc zbędny) to dodatkowe porównywanie tego z wartością logiczną jest nadmiarowe.

No i po co cokolwiek obliczać, skoro zwracasz nową instancję klasy?

Zamiast zwiększyć czytelność, rozbiłeś jedną metodę na co najmniej trzy powodując, że nie da się już jej ogarnąć wzrokiem. Sama metoda była na tyle krótka, że wystarczało jedno spojrzenie, teraz trzeba skakać po całym pliku szukając odpowiednich metod i wracając do miejsca ich wywołania.
Spieprzyłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1