— Привіт, Аміго! Сьогодні я розповім тобі про стилі коду та важливість стилів коду.
Почну з найголовнішого. Код 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) Відкриваюча дужка ставиться наприкінці попереднього рядка , що закриває – на новій. Такий стиль ще називають «єгипетськими дужками».
Чесно кажучи, тобі вибирати, як писати. Багато хто пишуть дужку на тому ж рядку, багато хто — на новій. Це як суперечка – з якого кінця розбивати яйце: з тупого чи гострого.
Єдине, що можу порадити – це дотримуйся того ж стилю, що й у проекті, в якому ти працюєш . Не варто міняти чужий код, як тобі зручніше. Люди недосконалі, це я тобі як доктор Білаабо говорю.
— Дякую за цікаву лекцію, Білаабо.Піду обмірковувати почуте.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ