Java Code Style: как правильно оформлять код Java
Статья об именах переменных, классов и методов, скобках, комментариях, форматировании кода и других правилах хорошего тона, принятых в языке Javа.
vlada_maestro / shutterstock
В языке Java, как и во многих других языках программирования, есть неофициальные, но принятые сообществом разработчиков соглашения по оформлению кода. Давайте попробуем разобраться, что это такое, как работает и почему важно.
Зачем нужен единый стиль кода
Java Code Style — это рекомендации и соглашения о стиле кода, собранные вместе. Например:
- как использовать отступы;
- когда и как ставить скобки всех видов;
- как оформлять комментарии;
- в каком стиле давать названия классам, переменным, константам;
- какой должна быть максимальная длина строки кода.
Регламентируется множество вещей, связанных с оформлением исходного текста программ, и приводятся требования, которые необходимо учитывать. Почему возникли эти стандарты?
Причины, по которым разработчики пришли к таким соглашениям, логичны и просты:
- 70 — 80% расходов при создании ПО приходится на поддержку и развитие кода.
- Над кодом обычно работают команды программистов, а не один человек. Состав команд меняется со временем, и единый стиль позволяет легче вводить новых разработчиков в проект.
- Код больше читают, чем пишут. Прежде чем внести изменение, которое может состоять из пары новых строк, приходится изучить сотни, а иногда и тысячи старых.
- Правильное оформление кода облегчает чтение. Даже если текст программы пишут разные команды, он будет понятен каждому разработчику, а скорость восприятия будет высокой.
- Гораздо проще поддерживать программы и сравнивать версии кода, когда у файлов согласованный стиль.
Использование общепринятых соглашений по оформлению позволяет сделать код более аккуратным, избежать ошибок, связанных с разными стилями написания у людей, работающих над одним проектом.
Форматирование на практике
Стиль не играет роли для компьютера, но важен для чтения кода человеком. Наше зрение устроено так, что сперва получает и анализирует образы, а только затем мы вдаёмся в детали. А если блоки исходного текста унифицированы, разработчик понимает, что перед ним за конструкция, даже не вникая в сам код.
Видя такую конструкцию, программист сразу же понимает, что это if … else. Он прочитает это мгновенно и пойдёт изучать код дальше. А если глазу попадается что-то отличающееся от привычного, чтение сразу переходит в медленный побуквенный режим. Вот здесь, например, потребуется детально изучить код, чтобы понять его смысл:
Если стиль форматирования меняется от конструкции к конструкции, это затрудняет считывание паттернов — мы спотыкаемся глазом на каждой нестандартно написанной строчке.
Единый стиль повышает скорость чтения кода, облегчает взаимодействие между командами, а также имеет эстетическую составляющую. Оркестр не сможет хорошо сыграть, пока все участники не договорятся и не станут попадать в один ритм.
Автоформатирование в IDE
В каждой популярной среде разработки есть встроенные средства для автоформатирования кода. В таблице приведены горячие клавиши для форматирования открытого файла в популярных IDE.
JetBrains IntelliJ IDEA | Eclipse IDE | |
---|---|---|
Windows\Linux | Ctrl + Alt + L | Ctrl + Shift + F |
MacOs | ⌘ + ⌥ + L | ⌘ + Shift + F |
Форматирование пакета или всего проекта в IntelliJ IDEA
Выберите в дереве проекта нужный пакет и вызовите Reformat, используя горячие клавиши. Как вариант, можно нажать по пакету правой кнопкой мыши и выбрать Reformat Code. Откроется диалоговое окно, в котором, кроме форматирования, будет предложено оптимизировать импорты (удалить лишние и привести в порядок существующие в соответствии с Code Style). Рекомендуется отметить этот пункт и нажать ОК.
Результат выполнения команды автоформатирования:
Подключение правил в IDE
Соглашения по стилю кода Java различны, а, кроме того, разработчики могут использовать свои модификации. Чтобы у всей команды был один стиль кода, его можно задать в среде разработке.
Один из популярных наборов правил по оформлению кода для Java написала компания Google. Он называется Google Java Style Guide и доступен на GitHub. Вы можете без труда установить его в любимую IDE, с которой работаете. Для примера рассмотрим, как это сделать в среде разработки JetBrains IntelliJ IDEA:
- Скачайте файл intellij-java-google-style.xml c правилами форматирования с GitHub.
- Откройте IntelliJ IDEA, зайдите в настройки File → Settings… (Ctrl + Alt + S) и выберите загрузку файла в пункте Scheme, как на скриншоте:
- В диалоговом меню выберите скачанный файл и в поле Scheme выберите GoogleStyle. Затем сохраните изменения, нажав Apply/OK.
Теперь при форматировании будут использоваться правила Java Google Style.
Используйте автоформатирование после окончания работы над блоком кода и перед отправкой кода в удалённый репозиторий. Да пребудет ваш код чистым и красивым!
Code Style на практике
Теперь разберём основные правила, которые есть в Code Style, и как их использовать в ваших рабочих проектах.
1. Название файла должно совпадать с именем главного класса в нём
Классы в java располагаются в отдельных файлах расширения.java, и название файла строго должно соответствовать имени класса, включая регистр.
❗️ Неправильно: файл main.java
✅ Правильно: файл называется как класс — Main.java
2. Названия классов и интерфейсов
Классы и интерфейсы именуются с большой буквы. Если имя состоит из нескольких слов, то каждое слово также начинается с большой буквы. Подчёркивания, тире не используются. Такой стиль нейминга называется UpperCamelCase.
❗️ Неправильно: phoneBook, full_name, main, result-list
✅ Правильно: PhoneBook, FullName, Main, ResultList
Класс принято называть существительным: Car, Bird, ArrayList, Book. Возможно добавлять уточняющее прилагательное ImmutableList.
Интерфейс, как и класс, может быть существительным: List, Set, Map. А также прилагательным, если указывает на свойство: Readable, Сomparable, Closable.
Отдельно стоить отметить классы тестов, к ним принято добавлять слово Test в окончании: HashTest, HashIntegrationTest
3. Названия методов
Методы именуются со строчной (маленькой) буквы; если имя состоит из нескольких слов, то каждое последующее слово начинается с большой буквы. Подчёркивания, тире не используются. Такой стиль нейминга называется lowerCamelCase.
❗️ Неправильно: Print(), get-Size(), Main(), is_hidden()
✅ Правильно: print(), getSize(), main (), isHidden()
Методы — это действия, поэтому их принято называть глаголами: sendMessage (), stop (), parse (), add ()
Отдельно можно отменить геттеры и сеттеры. Название метода геттера формируется из названия переменной и префикса get. Если переменная length, то геттер: getLength (). Если переменная типа boolean и названа isAlive, то геттер будет также называться isAlive (), являясь ответом на вопрос в названии метода.
Сеттеры формируются по такому же принципу, но с префиксом set. Продолжая примеры выше: для length сеттер будет setLength (). Для переменной типа boolean isAlive, сеттер будет без приставки setAlive ().
4. Названия переменных
Переменные именуются со строчной (маленькой) буквы; если имя состоит из нескольких слов, то каждое последующее слово начинается с большой буквы. Подчёркивания, тире не используются. Такой стиль нейминга называется lowerCamelCase.
Имена переменных в общем случае — это существительные либо составные существительные с добавлением прилагательных.
❗️ Неправильно: PostService, e_mail, post-id, _email
✅ Правильно: postService, email, postId, isAlive
Данные правила относятся к локальным переменным (внутри методов), параметрам класса, а также к не статическим константам.
5. Названия констант
Константы именуются в стиле SNAKE_CASE, то есть слова разделены нижним подчёркиванием и все буквы прописные (большие)
Константами считаются static final поля, но не все. Поле должно быть примитивом, String или иммутабельным классом. То есть параметры класса константы не должны иметь возможности изменяться, а его методы — иметь побочные эффекты, влияющие на другие классы. Элементы Enum тоже являются константами.
✅ Константы:
❗️ Не именуются как константы:
Как и у переменных, названия констант — это существительные либо составные существительные с добавлением прилагательных.
6. Не используйте транслитерацию
Для наименования методов, переменных, классов используйте только английский язык. Использование английского — это принятый стандарт, чтобы ваш код был всем понятен. Транслит намного хуже читается, а если кто-то не знаком с русским, он и вовсе не поймёт смысл наименования. Если затрудняетесь в выборе названия, воспользуйтесь гугл-переводчиком. Так, кстати, вы пополните свой словарный запас.
❗️ Неправильно: schet, kolichestvo, soderjitImya, fio
✅ Правильно: account, amount, containsName, fullname
7. Фигурные скобки
Фигурная скобка открывается на той же строке, что и код перед ней.
Тело условного оператора или цикла всегда размещайте в {}, даже если это одна строка. Так можно избежать ошибок, если попробуете добавить вторую строчку, но забудете заключить её в фигурные скобки.
❗️ Неправильно: schet, kolichestvo, soderjitImya, fio
✅ Правильно: account, amount, containsName, fullname
8. Аббревиатуры и сокращения
Нежелательно при именовании использовать сокращения. Это связано как с пониманием расшифровки, так и с поиском по классам и методам. Коллеги, которые будут читать код, могут не найти их с такими названиями и посчитают, что надо создать заново.
❗️ Неправильно: class Btn, int lstId, class CurPage, String lName
✅ Правильно: class Button, int lastId, class CurrentPage, String lastName
Аббревиатуры представляйте в виде слов. Это более удобочитаемо, особенно если название состоит из нескольких.
❗️ Неправильно: class HTMLPage, int userID, class HTTPRequest, String URL, class XML
✅ Правильно: class HtmlPage, int userId, class HttpRequest, String url, class Xml
Используйте эти несложные правила и помните: ваш код должны понимать не только вы, но и ваши коллеги. Так им будет значительно легче разобраться в коде и приступить к решению задачи, вместо того чтобы продираться через дебри сложных и непонятных названий методов, классов и переменных.