„Cześć, Amigo! Dzisiaj opowiem ci o stylach kodu i znaczeniu stylu kodu”.

„Zacznę od tego, co najważniejsze.  Kod Java powinien być łatwy do odczytania.  Ogólne podejście do kodu jest takie: kod jest napisany raz, ale czytany sto razy”.

„Załóżmy, że wraz z 10 innymi programistami piszecie aplikację. Pracujecie nad aplikacją przez trzy lata, a pośrednie wersje pojawiają się co trzy miesiące”.

"Tak długo?"

"To jest Java, mój młody pasikoniku! "Co powiesz na system korporacyjny działający na tuzinie serwerów i napisany przez 100 osób przez ponad 6 lat? To też się czasem zdarza”.

"Wow."

„W każdym razie główną zasadą, głównym wymaganiem dla kodu jest to, że musi być łatwy do odczytania dla innych programistów”.

„W innych językach programowania ludzie często pracują w małych zespołach nad małymi zadaniami, więc mogą mieć inną główną zasadę, na przykład „To działa? Doskonale”.

„W ciągu kilku lat wszyscy członkowie twojego zespołu wprowadzą kilka zmian w napisanym przez ciebie kodzie. I za każdym razem będą musieli zrozumieć, jak działa kod”.

„A niezrozumiały kod, który działa idealnie, jest trudny do zmiany.  Odrzucą go i przepiszą na swój własny sposób.  Więc pisz kod, który inni mogą zrozumieć.  Jeśli możesz poprawić swój kod, popraw go. w takim razie trzeba to poprawić!

„Jeśli piszesz kod przez 15 minut, a następnie spędzasz dwie godziny na ulepszaniu go, robisz to dobrze. Ile czasu oszczędzasz zespołowi?”

„„2 godziny, aby zrozumieć Twój kod” x „100 razy, kiedy ludzie będą musieli go zrozumieć” = 200 godzin.”

„Wyciągnąłem te liczby znikąd, ale chcę, żebyś zrozumiał problem i jego zakres.  Twój kod jest tworzony do czytania przez innych programistów.  Wszystko inne jest drugorzędne”.

„Czy kod nie działa poprawnie? Naprawimy to. Niezoptymalizowany? Zoptymalizujemy. Nieudokumentowany? Dodamy komentarze.”

" Czy kod jest trudny do odczytania? Wyrzuć to gówno do kosza i napisz wszystko od nowa! "

– Nie sądziłem, że to taka wielka sprawa.

„Jednym z powodów, dla których Java jest wiodącym językiem programowania, jest to, że cały kod Java jest napisany tak, aby mógł być czytany przez innych programistów”.

„Przejdźmy teraz do drugiego pytania: jak uczynić swój kod tak łatwym do odczytania, jak to tylko możliwe?

„Każdy może zrozumieć, kiedy ktoś mówi znajome słowa w swoim ojczystym języku. Tak samo jest w tym przypadku. Kod jest łatwy do odczytania, gdy programista może łatwo odgadnąć:

A)  Co robi każda metoda

B)  Cel każdej klasy

C)  Dokładnie to, co przechowuje każda zmienna.

Wszystko to jest przekazywane w nazwach: nazwach klas, nazwach metod i nazwach zmiennych. Ponadto istnieje styl, jeśli chodzi o nazewnictwo zmiennych. I jest styl kodu”.

„Jestem gotów słuchać”.

" Programowanie opiera się na dobrym angielskim!  Dobrze napisany program czyta się jak zwykłą dokumentację techniczną. "

Zacznijmy od imion ” .

„Nazwa metody powinna krótko opisywać, co robi metoda. Wtedy kod można czytać jak prostą prozę”.

Program
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

„Oto, jak czyta się taki program”.

Linia 1.

„Metoda nazywa się „downloadPhoto”. Wygląda na to, że pobiera plik ze zdjęciem z Internetu. Skąd pobiera? Jeszcze nie wiemy. Skąd? Metoda ma parametr o nazwie url — prawdopodobnie jest to adres URL pobieranie”.

Linia 3.

„Zmienna resultFileName została zadeklarowana i przypisana jej wartość przez TempHelper.createTempFileName();”

Więc to musi być lokalna ścieżka do pliku, w którym zapiszemy nasz pobrany plik.

„Nazwa „TempHelper” nic nam nie mówi. Sufiks „Helper” mówi, że jest to rodzaj klasy narzędziowej, która nie zawiera ważnej logiki biznesowej, ale służy raczej do uproszczenia rutynowych zadań, które często występują.

„Nazwa metody „createTempFileName” wskazuje, że ta metoda tworzy i zwraca nazwę pliku tymczasowego (pliku tymczasowego). Plik tymczasowy to plik tymczasowy, który jest tworzony na jakiś czas, a następnie zwykle usuwany do czasu zamknięcia programu. "

Linia 5.

„Obiekt SingleFileDownloader jest tworzony i przypisywany do narzędzia do pobierania zmiennych”.

Jest to obiekt, który pobierze nasz plik z Internetu.

„Do zmiennej downloader przypisany jest obiekt SingleFileDownloader. Z nazwy można wnioskować, że program posiada kilka typów klas downloaderów. Jedna została napisana do pobierania pojedynczych plików i prawdopodobnie możemy spodziewać się napotkania innych downloaderów w kodzie dla grup plików o nazwach takich jak: MultiFileDownloader, FileGroupDownloader lub DirectoryDownloader"

Linia 6.

„Ustawiliśmy właściwość resultFileName obiektu downloadera na równą wartości zmiennej resultFileName. Innymi słowy, mówimy programowi ładującemu, gdzie zapisać pobrany plik. Jak można się spodziewać. Więc zasadniczo przewidujemy kod!”

Linia 7.

„Nazywamy metodę start. Rozpoczyna się pobieranie. To ma sens. Zastanawiam się, jak odbywa się pobieranie: w częściach, w osobnym wątku, czy w całości tutaj? Jeśli pobierzemy całość tutaj, może to potrwać długi czas i mieć konsekwencje”.

Linie 8-11.

„Ach. Tutaj widzimy standardową pętlę napisaną przez kogoś, kto czeka na zakończenie pobierania. Obiekt downloder ma właściwość done, która jest zwracana przez metodę isDone(). Ponieważ metoda nazywa się isDone(), a nie getDone( ), dochodzimy do wniosku, że zmienna done jest wartością logiczną lub być może wartością logiczną”.

Linie 13-14.

„Jeżeli podczas pobierania wystąpi błąd, to metoda downloadPhoto zwraca wartość null. Dobrze, że obsługuje błędy. Źle, że po prostu zwraca wartość null – nie wiadomo, co to za błąd. Lepiej byłoby rzucić wyjątek z informacją o błąd."

Linia 16.

„Zwracamy ścieżkę do pliku lokalnego, który zawiera pobrany plik”.

"Wow!"

„Kod tego programu sprawia, że ​​jest absolutnie jasne, co on robi. Możesz nawet zgadywać, jak program jest zorganizowany i jakie inne klasy/metody znajdziemy”.

„Teraz rozumiem, jak ważne są imiona”.

„Więcej o nazwach. Często można odgadnąć, jakie metody ma obiekt/klasa. Na przykład, jeśli obiekt jest kolekcją, najprawdopodobniej będzie miał metodę size() lub count(), aby uzyskać liczbę elementów. Także , prawdopodobnie będzie miał metodę add() lub insert(). Elementy są pobierane z klas kolekcji za pomocą metod get/getItem/getElement."

„Jeśli zmienna nosi nazwę i, j lub k, najprawdopodobniej jest to licznik pętli”.

„Jeśli zmienna nazywa się m lub n, najprawdopodobniej ma rozmiar tablicy/kolekcji”.

„Jeśli zmienna nazywa się nazwa, najprawdopodobniej jest to ciąg znaków zawierający czyjeś imię”.

„Jeśli klasa nazywa się FileInputStream, jest jednocześnie plikiem i strumieniem wejściowym”.

„Im więcej kodu widzisz, tym łatwiej jest odczytać kod innych osób”.

„Ale czasami jest kod, który jest bardzo trudny do odczytania. W tym przypadku oto bardzo praktyczna rada:”

Wskazówka
Pisz kod tak, jakby był obsługiwany przez brutalnego psychopatę , który wie, gdzie mieszkasz .

– To zabawne i nieśmieszne jednocześnie.

„Teraz trochę o stylach używanych do nazywania zmiennych”.

„Programiści Javy starają się nadawać zmiennym i metodom nazwy zawierające wiele informacji. W rezultacie nazwy często składają się z kilku słów. Istnieją 4 style pisania wielkich liter nazw złożonych”.

1) Małe litery  — Wszystkie słowa są pisane małymi literami. Na przykład:

„Szklarnia”  staje się „szklarnią”

„Dziewczyna z Hollywood”  staje się  „Dziewczyną z Hollywood”

Ten styl jest używany do nazw pakietów.

2) Wielkie litery  — wszystkie słowa są pisane wielkimi literami i oddzielone podkreśleniem. Na przykład:

„Wartość maksymalna”  zmieni się na MAX_VALUE

„Liczba kotów”  zmieni się na CAT_COUNT

„Ten styl jest używany w nazwach stałych (końcowe pola statyczne).”

3) CamelCase  – Wszystkie słowa są pisane małymi literami, z wyjątkiem pierwszej litery każdego słowa jest wielka. Na przykład:

„Szklarnia”  staje się  „Szklarnią”

„Dziewczyna z Hollywood”  staje się „Dziewczyną z Hollywood”

Ten styl jest używany do nazw klas i interfejsów.

4) Lower CamelCase (wielkość liter mieszana)  — Wszystkie słowa są pisane małymi literami, z wyjątkiem pierwszej litery każdego słowa, z wyjątkiem pierwszej litery, która jest wielka. Na przykład:

„Pobierz szerokość” staje się „pobierz szerokość”

„Get Hollywood girl name” staje się  „getHollywoodGirlName”

„Ten styl jest używany do nazw zmiennych i metod”.

– Więc nie ma zbyt wielu zasad.

1)  Wszystko jest napisane w Lower CamelCase.

2)  Nazwy klas i interfejsów są zawsze pisane wielką literą.

3)  Nazwy pakietów są zawsze pisane małymi literami.

4)  Stałe są zawsze pisane wielkimi literami.

„Jest kilka niuansów, ale ogólnie tak to jest”.

"Teraz o metodach.  "Nazwy metod prawie zawsze zaczynają się od czasownika! „liczba” to zła nazwa metody. Lepiej nazwać to getCount(). Metoda wykonuje pewne działania na obiekcie:  startDownload , interrupt  , sleep  , loadPirateMusic ”.

„Jak już wiesz, istnieją moduły pobierające i ustawiające do pracy z właściwościami/polami obiektu:  getName / setName , getCount / setCount itd.”

„Jedynym wyjątkiem są booleany. W przypadku booleanów nazwy getterów używają 'is', a nie 'get', np. isDone, isEmpty. W ten sposób jest to bliższe zwykłej mowie."

„Co powiesz na pracę przez dwie godziny dziennie zamiast 8? Kusi?”

"Tak!"

„Tak jak powinno być. Dla młodszego programisty Java podstawowym wymogiem jest doskonałe zrozumienie podstaw języka Java, czyli Java Core.”

„Mam jeszcze jedno pytanie. Dlaczego mamy takie różne metody uzyskiwania liczby elementów?”

Klasa Metoda/właściwość uzyskiwania liczby elementów
Strunowy długość ()
Szyk długość
lista tablic rozmiar ()
Grupa wątków aktywny licznik ()

„Po pierwsze, Java została wynaleziona ponad 20 lat temu, zanim ustanowiono wymagania takie jak setCount / getCount , i istniało powszechne podejście zaczerpnięte z języka C, aby„ uczynić go tak krótkim, jak to tylko możliwe ”.

„Po drugie, semantyka odgrywa tutaj rolę. Mówiąc o tablicy, mówimy o jej długości. Mówiąc o kolekcji, mówimy o jej rozmiarze”.

„Cóż za ciekawa lekcja”.

„Chciałbym powiedzieć ci więcej, ale obawiam się, że nie zapamiętasz wszystkiego od razu. Lepiej podawać ci to w małych porcjach”.

„Ale chcę poruszyć kwestię stylu w odniesieniu do używania nawiasów klamrowych: {}. Istnieją dwa podejścia:”

1)  Nawias przechodzi za każdym razem w nowej linii

2)  Nawias otwierający znajduje się na końcu poprzedniej linii, podczas gdy nawias zamykający przechodzi na nową linię. Ten styl nazywa się „egipskimi szelkami”.

„Szczerze mówiąc, możesz wybrać sposób kodowania. Wiele osób używa nawiasu otwierającego w tej samej linii. Wiele osób umieszcza go w nowej linii. To jak debata nad tym, który koniec jajka rozbić: mały koniec czy duży koniec."

„Jedyne, co mogę polecić, to trzymać się stylu, który jest używany w projekcie, nad którym pracujesz. Nie zmieniaj kodu innej osoby, aby pasował do preferowanego stylu.  Ludzie są niedoskonali. Mówię ci to jako doktor Bilaabo. "

„Dzięki za interesującą lekcję, Bilaabo. Pójdę przemyśleć to, co powiedziałeś”.