Код
#База знаний

Java Code Style: как правильно оформлять код Java

Статья об именах переменных, классов и методов, скобках, комментариях, форматировании кода и других правилах хорошего тона, принятых в языке Javа.

 vlada_maestro / shutterstock

В языке Java, как и во многих других языках программирования, есть неофициальные, но принятые сообществом разработчиков соглашения по оформлению кода. Давайте попробуем разобраться, что это такое, как работает и почему важно.

Зачем нужен единый стиль кода

Java Code Style — это рекомендации и соглашения о стиле кода, собранные вместе. Например:

  • как использовать отступы;
  • когда и как ставить скобки всех видов;
  • как оформлять комментарии;
  • в каком стиле давать названия классам, переменным, константам;
  • какой должна быть максимальная длина строки кода.

Регламентируется множество вещей, связанных с оформлением исходного текста программ, и приводятся требования, которые необходимо учитывать. Почему возникли эти стандарты?

Причины, по которым разработчики пришли к таким соглашениям, логичны и просты:

  • 70 — 80% расходов при создании ПО приходится на поддержку и развитие кода.
  • Над кодом обычно работают команды программистов, а не один человек. Состав команд меняется со временем, и единый стиль позволяет легче вводить новых разработчиков в проект.
  • Код больше читают, чем пишут. Прежде чем внести изменение, которое может состоять из пары новых строк, приходится изучить сотни, а иногда и тысячи старых.
  • Правильное оформление кода облегчает чтение. Даже если текст программы пишут разные команды, он будет понятен каждому разработчику, а скорость восприятия будет высокой.
  • Гораздо проще поддерживать программы и сравнивать версии кода, когда у файлов согласованный стиль.

Использование общепринятых соглашений по оформлению позволяет сделать код более аккуратным, избежать ошибок, связанных с разными стилями написания у людей, работающих над одним проектом.

Форматирование на практике

Стиль не играет роли для компьютера, но важен для чтения кода человеком. Наше зрение устроено так, что сперва получает и анализирует образы, а только затем мы вдаёмся в детали. А если блоки исходного текста унифицированы, разработчик понимает, что перед ним за конструкция, даже не вникая в сам код.

Видя такую конструкцию, программист сразу же понимает, что это if … else. Он прочитает это мгновенно и пойдёт изучать код дальше. А если глазу попадается что-то отличающееся от привычного, чтение сразу переходит в медленный побуквенный режим. Вот здесь, например, потребуется детально изучить код, чтобы понять его смысл:

Если стиль форматирования меняется от конструкции к конструкции, это затрудняет считывание паттернов — мы спотыкаемся глазом на каждой нестандартно написанной строчке.

Единый стиль повышает скорость чтения кода, облегчает взаимодействие между командами, а также имеет эстетическую составляющую. Оркестр не сможет хорошо сыграть, пока все участники не договорятся и не станут попадать в один ритм.

Автоформатирование в IDE

В каждой популярной среде разработки есть встроенные средства для автоформатирования кода. В таблице приведены горячие клавиши для форматирования открытого файла в популярных IDE.

JetBrains IntelliJ IDEAEclipse IDE
Windows\LinuxCtrl + Alt + LCtrl + 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 тоже являются константами.

✅  Константы:

static final int NUMBER = 5; //примитив
enum SomeEnum { ENUM_CONSTANT } // enum
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann"); // неизменяемый список, с неизменяемыми элементами String
static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32); // неизменяемый Map, с неизменяемыми элементами String

❗️ Не именуются как константы:

static String nonFinal = "non-final"; // не final
final String nonStatic = "non-static"; // не статична
static final Set<String> mutableCollection = new HashSet<String>(); // мы можем изменять содержимое Set
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable); // изменить количество элементов в коллекции нет возможности, но менять состояние самих элементов коллекции есть возможность
static final String[] nonEmptyArray = {"these", "can", "change"}; // поменять элементы массива возможно

Как и у переменных, названия констант — это существительные либо составные существительные с добавлением прилагательных.

6. Не используйте транслитерацию

Для наименования методов, переменных, классов используйте только английский язык. Использование английского — это принятый стандарт, чтобы ваш код был всем понятен. Транслит намного хуже читается, а если кто-то не знаком с русским, он и вовсе не поймёт смысл наименования. Если затрудняетесь в выборе названия, воспользуйтесь гугл-переводчиком. Так, кстати, вы пополните свой словарный запас.

❗️  Неправильно: schet, kolichestvo, soderjitImya, fio

✅  Правильно: account, amount, containsName, fullname

7. Фигурные скобки

Фигурная скобка открывается на той же строке, что и код перед ней.

public static void main(String[] args) {
 System.out.println("Hello, code style!");
}

Тело условного оператора или цикла всегда размещайте в {}, даже если это одна строка. Так можно избежать ошибок, если попробуете добавить вторую строчку, но забудете заключить её в фигурные скобки.

❗️  Неправильно: schet, kolichestvo, soderjitImya, fio

for (int i = 0; i < 10; i++)
 System.out.println(i);

✅  Правильно: account, amount, containsName, fullname

for (int i = 0; i < 10; i++) {
 System.out.println(i);
}

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

Используйте эти несложные правила и помните: ваш код должны понимать не только вы, но и ваши коллеги. Так им будет значительно легче разобраться в коде и приступить к решению задачи, вместо того чтобы продираться через дебри сложных и непонятных названий методов, классов и переменных.

Проверьте свой английский. Бесплатно ➞
Нескучные задания: small talk, поиск выдуманных слов — и не только. Подробный фидбэк от преподавателя + персональный план по повышению уровня.
Пройти тест
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована