NamingConventions, CodeConventions - 1

— Привіт, Аміго! Сьогодні я розповім тобі про стилі коду та важливість стилів коду.

Почну з найголовнішого. Код Java повинен бути легко читаємо. Загальний підхід до коду такий – код пишеться один раз, а читається сто.

Наприклад, ти і ще 10 програмістів займаєтеся написанням програми. Програма пишеться три роки, з проміжними релізами кожні три місяці.

— Так довго?

— Це Java, дитинко! Як щодо Enterprise-системи, яка працює на десятці серверів та яку пишуть понад 6 років близько 100 осіб? Буває й таке.

— Нічого собі.

— Так ось, головний критерій, головна вимога до коду – він повинен легко читатися іншими розробниками.

В інших мовах програмування люди часто працюють маленькими командами над маленькими завданнями, тому вони можуть мати інший головний критерій, наприклад – « Це працює? От і чудово».

За пару років у написаний тобою код встигнуть кілька разів внести зміни всі члени команди. І щоразу їм доведеться розбиратися, а як працює цей код?

І якщо код просто відмінно робив свою справу, але був незрозумілий, то поміняти його важко. Його викинуть і напишуть по-своєму. Тому пиши код, зрозумілий іншим. Якщо можеш покращити код – покращи його. Якщо його можна покращити, значить, його потрібно покращити!

Якщо ти написав код за 15 хвилин і дві години покращуєш його – ти все робиш правильно. Скільки часу ти заощаджуєш команді?

«2 години на розбір твого коду» x «100 разів, коли люди будуть в ньому розбиратися» = 200 годин.

Ці цифри взяті зі стелі, але я хочу, щоб ти зрозумів проблему та її масштаб. Твій код створюється для читання іншими програмістами. Все інше – вдруге.

Код погано працює? Виправимо. Чи не оптимально? Оптимізуємо. Чи не документований? Прокоментуємо.

Код погано читаємо? Викинути його нафіг і написати все заново!

— Не думав, що це така проблема.

— Java тому і одна з лідируючих мов програмування, що весь її код пишеться, щоб читатися іншими програмістами. >

Будь-якому зрозуміло, коли з ним розмовляють рідною мовою, рідними знайомими словами. Так і тут. Код легко читаємо, коли програміст, який читає його, легко здогадується:

А) Що робить кожен метод;

Б) Якою метою є кожен клас;

В) Що саме зберігається в кожній змінній.

Все це визначається за назвою: імені класу, імені методу, імені змінної. Крім того, є ще стиль іменування змінних. І стиль коду.

— Я готовий слухати.

— В основі програмування лежить англійська мова! Добре написана програма читається, як звичайна технічна документація англійською мовою.

Почнемо з імен.

Ім'я методу має коротко описувати, що цей метод робить. Тоді програміст може читати програму як простий текст.

Програма
public String downloadPhoto(String url) { String resultFileName = TempHelper.createTempFileName(); Downloader downloader = новий SingleFileDownloader(new Url(url)); downloader.setResultFileName(resultFileName) downloader.start(); while(downloader.isDone()) { Thread.sleep(1000); } if (downloader.hasError()) return null; return resultFileName; }

Ось як читається така програма.

Рядок 1.

Метод називається «downloadPhoto», схоже, що він завантажує файл із фотографією з інтернету. Куди він завантажує? Поки невідомо. Звідки? У параметрах методу передано url - швидше за все це і є посилання для завантаження. TempHelper.createTempFileName();

Ім'я змінної resultFileName дослівно перекладається як «ім'я-файлу-результату». Значить це локальний шлях до файлу на диску, куди ми будемо зберігати наш файл, що завантажується.

Назва TempHelper – нічого не говорить. Суфікс Helper каже, що це різновид утилітних класів, які не містять у собі серйозної бізнес логіки, а використовуються для спрощення рутинних завдань, що часто виникають.

Ім'я методу createTempFileName говорить про те, що цей метод створює і повертає нам ім'я тимчасового файлу (temp-file). Temp file - це тимчасовий файл, який створюється на час, і зазвичай видаляються після закриття програми або раніше.

Рядок 5.

Створюється об'єкт типу SingleFileDownloader і кладеться в змінну downloader.

Назва змінної downloader перекладається як завантажувач. Цей об'єкт і завантажуватиме наш файл з інтернету.

У змінну downloader кладеться об'єкт типу SingleFileDownloader. З назви можна припустити, що у програмі є кілька видів класів-завантажувачів файлів. Один із них написаний для завантаження єдиного файлу (single file), і швидше за все можна очікувати зустріти в коді та завантажувачі для групи файлів з назвами на кшталт: MultiFileDownloader, GroupFileDownloader або DirectoryDownloader

Рядок 6.

Об'єкту downloader встановлюємо як resultFileName значення змінної resultFileName. Тобто. ми говоримо завантажувачу, куди зберігати файл, що завантажується ним. Що й слід було чекати. Тобто. ми вже практично прогнозуємо код!

Рядок 7.

Виклик методу start. Початок завантаження. Логічно. Цікаво, як відбуватиметься завантаження: шматочками, в окремій нитці або одразу до кінця. Якщо відразу, то це може бути довго і мати наслідки.

Рядки 8-11.

Ага. Тут ми бачимо звичайний цикл, який чекає на завершення завантаження. Об'єкт downloder має властивість done («готово») та метод, який його повертає isDone(). Т.к. метод називається isDone(), а не getDone(), то змінна done має тип boolean, ну або Boolean.

Рядки 13-14.

Якщо У процесі завантаження відбулася помилка, то метод downloadPhoto повертає null. Добре, що він опрацьовує стан помилки. Погано, що він просто повертає null – що це за помилка – не зрозуміло. Краще б кинув виняток з інформацією про помилку.

Рядок 16.

Повертаємо шлях до локального файлу, який містить завантажений файл.

— Нічого собі!

— З тексту цієї програми цілком ясно, що вона робить. Можна навіть робити припущення, як влаштована програма і які ще класи/методи ми зустрічатимемо.

— Тепер я зрозумів, наскільки важливі імена.

— Ще про імена. Дуже часто можна вгадати, які об'єкт/клас є методи. Ось наприклад, якщо об'єкт – колекція, то, швидше за все, у нього будуть методи size() або count(), щоб отримати кількість його елементів. Також, ймовірно, методи add(додати) чи put(вставити). Методи get/getItem, getElement використовуються для отримання елементів у класів-колекцій.

Якщо змінна називається i, j, k – швидше за все, це лічильник циклу.

Якщо змінна називається m, n – швидше за все, це розмір масиву/колекції.

Якщо змінна називається name, то, швидше за все, вона має тип String і містить чиєсь ім'я.

Якщо клас називається FileInputStream, то він одночасно є файлом (так і є) і потоком для читання – InputStream (так і є). Чим більше ти бачив коду, тим легше читати чужий код. Але іноді є код, який читати дуже складно. На цей випадок є одна дуже слушна порада:

Рада
Пишіть свій код так, начебто підтримуватиме його схильний до насильства психопат, який знає, де ви живете.

— Смішно і не смішно одночасно.

— Тепер трохи розповім про стилі іменування змінних.

У Java змінним та методам намагаються давати максимально інформативні імена. Тому такі назви часто складаються з кількох слів. Є 4 стилі написання складових імен.

1) Lowercase (нижній регістр) – усі слова з маленької літери. Приклад:

Green house перетворюється на greenhouse< /p>

Hollywood girl перетворюється на hollywoodgirl

У такому стилі пишуться назви пакетів (package).

2) Uppercase (верхній регістр) – всі слова пишуться з великої літери, розділені знаком підкреслення. Приклади:

Max value перетворюється на MAX_VALUE< /p>

Cats count перетворюється на CATS_COUNT

У такому стилі пишуться назви змінних-констант (final static).

3) CamelCase (верблюжий стиль) – усі слова пишуться з маленькими літерами, перша літера кожного слова – велика. Приклади:

Green house перетворюється на GreenHouse< /p>

Hollywood girl перетворюється на HollywoodGirl

У такому стилі пишуться назви класів та інтерфейсів.

4) Lower CamelCase (змішаний стиль) – усі слова пишуться маленькими літерами, перша літера кожного слова – велика, перша літера першого слова — маленька. Приклади:

Get width перетворюється на getWidth< /p>

Get Hollywood girl name перетворюється на getHollywoodGirlName

У такому стилі пишуться назв змінних і методів.

Тобто. правил не так вже й багато.

1) Все пишеться в Lower Camel Case.

2) Імена класів та інтерфейсів – завжди з великої літери.

3) Імена пакетів – завжди маленькими.

4) Константи — завжди більшими.

Є ще пара нюансів, але загалом так і є.

Тепер щодо методів. Імена методів практично завжди починаються з дієслова! Ім'я метод count – погане ім'я. Найкраще назвати getCount(). Метод виконує якусь дію над об'єктом: startDownload (почати завантаження), interrupt (перервати), sleep (спати), loadPirateMusic (завантажити піратську музику).

Для роботи з властивостями/полями об'єкта, як ти вже знаєш, є getter'и та setter'и. getName/setName, getCount/setCount і т.д.

Єдиний виняток робиться для типу boolean. Для нього getter пишеться не через get, а через is: isDone, isEmpty. Так ближче до англійської.

— Тобто. знання англійської обов'язково для вміння програмувати?

— Не обов'язково, але знаючи англійську мову і маючи кілька років досвіду за плечима, ти зможеш дуже швидко розбиратися в чужому коді. Як щодо витрачати на роботу не 8 годин на день, а дві? Приваблива пропозиція?

— Ага!

— Отож і воно. Основна вимога у Java Junior — це чудове знання основ Java - Java Core. Але чим досвідченішим ти стаєш, тим сильніше тобі потрібна англійська. Чим раніше почнеш його вчити – тим краще.

— В мене ще питання. Чому такі різні методи для отримання кількості елементів?

Клас для отримання кількості елементів
String метод length()
Array властивість length
ArrayList метод size( )
ThreadGroup метод activeCount()

По-перше, Java була придумана більше 20 років тому, коли вимог на кшталт setCount/getCount ще не було, і в ході був підхід з мови С++ «Зроби це якнайкоротше»

По-друге, тут грає роль семантика англійської мови. Так уже вийшло, що коли говорять про масив, вживають length, а коли про колекцію – size. strong> Тарілка на столі стоїть, а на підлозі – лежить.

2) Черевик на столі лежить, а на підлозі – стоїть.

— Яка цікава лекція.

— Хотілося б розповісти більше, але боюся, що ти все одно відразу не запам'ятаєш. Краще давати знову трохи.

Ще хотів би торкнутися стилю дужок {}. Є два підходи:

1) Кобка щоразу ставиться на новому рядку

2) Відкриваюча дужка ставиться наприкінці попереднього рядка , що закриває – на новій. Такий стиль ще називають «єгипетськими дужками».

Чесно кажучи, тобі вибирати, як писати. Багато хто пишуть дужку на тому ж рядку, багато хто — на новій. Це як суперечка – з якого кінця розбивати яйце: з тупого чи гострого.

Єдине, що можу порадити – це дотримуйся того ж стилю, що й у проекті, в якому ти працюєш . Не варто міняти чужий код, як тобі зручніше. Люди недосконалі, це я тобі як доктор Білаабо говорю.

— Дякую за цікаву лекцію, Білаабо.Піду обмірковувати почуте.