Co oznacza „dobry styl” w Javie? [Zamknięte]

9

Zadałem to pytanie na Stackoverflow i zanim się wygwizdało, otrzymałem pomocną sugestię od Pétera Töröka, że ​​może to być lepsze miejsce na opublikowanie go.

Programuję w Javie od kilku lat. Często omawiałem decyzje projektowe z kolegami na podstawie tego, co stanowi „dobry styl”. Rzeczywiście istnieje wiele pytań / odpowiedzi StackOverflow, które omawiają projekt na podstawie tego, czy coś jest „w dobrym stylu”.

Ale co sprawia, że ​​„dobry styl”? Jak wiele rzeczy, wiem o tym, kiedy to widzę ... ale chciałem mieć lepszy pomysł niż tylko sumienie, mówiąc, że ten projekt nie wydaje się odpowiedni.

O czym myślisz, aby stworzyć dobry, dobrze zaprojektowany kod?

(Przyznaję, że jest to nieco subiektywne, ponieważ to, co jest „dobrym stylem”, będzie zależeć od danego zadania). (Powinienem również dodać, że nie interesują mnie style zespołowe - np. „Używamy wcięć 2 spacji zamiast 4” ... i nie interesują mnie konwencje kodu Java).

Edycja: dziękuję za wszystkie dobre odpowiedzi / komentarze do tej pory. Szczególnie zależy mi na odpowiedziach, które pomogłyby skodyfikować te rzeczy, które powodują, że sumienie programisty (i być może żołądek) jest kluczem?

wypłata
źródło
Spośród wielu innych rzeczy wymienionych tutaj na pewno po prostu stwierdzę, że komputery mogą kompilować kod w dowolny sposób, w jaki go piszesz, ale ostatecznie kod musi być czytelny dla człowieka . Komentarz jak szalony! Dobry test, który lubię stosować: czy osoba może odczytać tylko moje komentarze, aby dowiedzieć się, co robi kod, jakie powinny być jego dane wejściowe i wyjściowe oraz jaki algorytm (y) to zrobił?
Brian
1
@brian, spraw, aby Twój kod wyjaśniał, jak to zrobić . Pozostaw rzeczywiste komentarze, aby wyjaśnić dlaczego . Innymi słowy, nie komentuj jak szalony (w ogólnym przypadku)
4
Brian: Ta technika zdecydowanie nie jest uważana za dobrą praktykę. Powszechną dobrą praktyką jest dążenie do tego, aby Twój kod był jak najbardziej samowydajny (z jasnymi nazwami zmiennych i spójnością funkcji), z komentarzami wyjaśniającymi „dlaczego”, a nie „jak”. Komentarze wyjaśniające każdy najmniejszy szczegół są ogólnie uważane za rozpraszające i często niebezpieczne, ponieważ ludzie rzadziej zachowują komentarze niż kod.
Casey Patton
1
@Brian: Twoje ostatnie zdanie mówi wszystko. Kod powinien być czytelny. Komentarze stają się nieaktualne. Kod nigdy nie robi. Jeśli odczuwasz potrzebę komentowania, zmieniaj kod do momentu, aż kod będzie tak wyraźny, że komentarze będą po prostu powtarzać to, co mówi kod. Jedynym dobrym komentarzem jest ten, który mówi, dlaczego kod działa w określony sposób - na przykład, aby uniknąć błędu w bibliotece strony trzeciej - aby ktoś nie wrócił i nie zmienił go na coś, co nie zadziała z jakiegoś powodu nie jest to od razu widoczne.
Ryan Stewart
2
Oficjalnie zostałem upokorzony. Przepraszam @idosowanie. Myślę, że muszę badać dobre standardy kodowania, jeśli chodzi o komentarze.
Brian

Odpowiedzi:

17

Kilka krótkich uwag:

Ryan Stewart
źródło
3
+1. Być może najbardziej krytyczny: zminimalizować zduplikowany kod. Jeśli masz ochotę wyciąć i wkleić więcej niż kilka tokenów, musisz wyodrębnić funkcję. Nawet jeśli funkcja jest pojedynczą linią kodu.
kevin cline
4
W przypadku powielonego kodu przyjmuję następujące stanowisko. Wytnij i wklej = dobrze. To tylko przenoszenie kodu (zakładając, że użyjesz raz wkleić). Skopiuj i wklej = okropnie. Jeśli po prostu usuniesz przycisk kopiowania ze słownika, bardziej prawdopodobne jest, że postąpisz właściwie.
jsternberg
@ jsternberg: +1 za rozróżnienie wycinania / kopiowania, ale zauważam, że wiele osób mówi „wycinaj / wklej”, gdy mają na myśli „kopiuj / wklej”. Nie wiem, jak zniknęło to rozróżnienie.
Ryan Stewart
5
Nie powtarzaj się. Nie powtarzaj się. Nie powtarzaj się.
konfigurator
1
@ konfigurator, pachniesz trochę śmiesznie ...
9

Dodawanie do listy Ryana:

  • Postępuj zgodnie z zasadami SOLID
  • Upewnij się, że kod nie ma zbyt dużej cyklicznej złożoności
  • Test Driven Java jest zawsze dobrą rzeczą
  • Jeśli masz xFactoryFactoryzajęcia, robisz to źle :-)
  • Biorąc pod uwagę biblioteki open source w ekosystemie Java, ponowne wynalezienie koła jest złym stylem
  • Użyj godziny Joda dla daty i godziny

Zatrzymam się tam.

Martijn Verburg
źródło
2
Ale co z HammerFactoryFactoryFactoryklasą? ;-)
Wayne Molina
@Wayne, fabryki są wskazówką, że niektóre decyzje muszą być opóźnione, a FactoryFactoryFactories wskazują, że istnieje decyzja, która naprawdę musiała zostać podjęta w czasie wykonywania, ale nie mogła.
Wiem, że byłem sarkastyczny i odniosłem się do tego artykułu, dlaczego ówczesny J2EE był zbyt skomplikowany, z HammerFactories i HammerFactoryFactories i myślę, że HammerFactoryFactoryFactories. :)
Wayne Molina
@Martijn - dzięki za link SOLID; Nie spotkałem się z tym wcześniej. Sugerujesz użycie JodaTime; czy to tylko (odpowiednia) awersja do klas Kalendarz / Data Java? Co z JSR310 (następcą JodaTime)?
płatność
Mam nadzieję, że JSR-310 przejdzie do Javy 8 (jest nas kilku, którzy przygotowują się do pomocy, aby tak się stało, skontaktuj się ze mną, jeśli chcesz się zaangażować). W międzyczasie czas Joda jest standardowym sposobem radzenia sobie z datą i godziną w Javie. Jest tak wiele rzeczy nie tak z systemem Data i kalendarza Javy, że nawet nie wiem od czego zacząć ;-). Zabójca polega na tym, że Daty są zmienne i że nie ma pojęcia o chwili ani kropce, albo ... nie, zatrzymam się tam :-).
Martijn Verburg,
1

Doceniając odpowiedzi innych, pomyślałem, że sprawiedliwe jest dzielenie się kilkoma rzeczami, o których myślę, próbując napisać dobry kod:

  • co trzeba wiedzieć o tej klasie / metodzie / zmiennej? tzn. gdzie powinna mieszkać ta wiedza?

  • jak ten kod może wpłynąć na pamięć / wydajność mojej aplikacji? (Przyznaję, że „przedwczesna optymalizacja jest źródłem wszelkiego zła”, więc nie sugeruję spędzania dużej ilości czasu na optymalizacji, ale raczej świadomość podczas pisania mojego kodu.)

  • czy jest jasne (z kodu i struktur kodu), co to robi? (Staram się przestrzegać maksymy: „Staraj się, aby ludzie nie mogli zrozumieć, staraj się, aby ludzie nie mogli zrozumieć”).

wypłata
źródło
1

Przeczytaj klasy String i ArrayList, aby uzyskać doskonałe przykłady prawidłowego programowania w języku Java. Ale są bardzo zwięzłe, prawie w stylu C, co niekoniecznie najlepiej nadaje się do utrzymania kodu w / minimalnej dokumentacji Java. Powszechną praktyką w moim sklepie jest brak komentarzy, więc staram się komentować za pomocą kodu przy użyciu pełnych nazw zmiennych camelCase i nadmiernego używania znaków nowej linii w celu oddzielenia jednej linii myśli od drugiej. Nadal debatuję za pomocą zakładek, aby oddzielić zmienne od ich wartości. Karty mogą poprawić czytelność, IMO, ale tylko przy minimalnym wykonaniu i jest to bardzo subiektywne. Uważam, że tak naprawdę chodzi o publiczność. Nie ma tutaj najlepszej odpowiedzi.

Carlmart
źródło