Java code convention

  • Рубрика записи:Чистый код

Соглашение о кодировании (code convention) – это набор правил и рекомендаций, которые определяют, как нужно писать код на определённом языке программирования (для разных языков – разные соглашения).

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

Поэтому были разработаны специальные конвенции. Познакомимся с конвенцией по написанию кода на языке Java.

Файлы и пакеты

Файлы

Файлы с исходным кодом на Java должны называться по названию класса и иметь расширение “.java”.

🔴

Неправильно:

🟢

Правильно:

В каждом файле исходного кода, как правило, размещается только один класс. Когда private-классы и интерфейсы связаны с public-классом, их можно поместить в тот же исходный файл, что и public-класс. Публичный класс (или интерфейс) должен идти первым в файле.

Длина файлов в общей сложности не должна превышать 2000 строк. Первая строка файла, не являющаяся комментарием, должна содержать в себе название пакета:

Пакеты

Пакеты именуются с маленькой буквы и разделяются точками.

🔴

Неправильно:

🟢

Правильно:

Импорты

Инструкции import должны размещаться в файле через одну пустую строку после названия пакета:

Для импортирования класса следует использовать import-инструкцию для отдельного класса, а не сокращённую запись с *. Например, импортирование списка ArrayList.

🔴

Неправильно:

🟢

Правильно:

Строки

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

Открывающая фигурная скобка не должна располагаться на отдельной строке. Закрывающая фигурная скобка располагается на отдельной строке.

🔴

Неправильно:

🟢

Правильно:

Длина строки

“Избегайте строк длиной более 80 символов, так как они плохо обрабатываются многими терминалами и инструментами” – так написано в Java Code Convention 1997-го года. На текущий момент экраны стали удобнее и шире, потому можно поднять этот предел до примерно 120 символов в строке. Но лучше не перебарщивать с длинными строками.

Переносы строк

Если выражение не помещается в одну строку, разбивайте его в соответствии с общими принципами:

  • Разрыв после запятой.
  • Разрыв перед оператором.
  • Предпочитайте разрывы более высокого уровня разрывам более низкого уровня.
  • Выравнивайте новую строку по началу выражения того же уровня на предыдущей строке.
  • Если вышеуказанные правила приводят к путанице в коде или к тому, что код прижимается к правому краю, просто сделайте отступ слева в 8 пробелов (2 табуляции по 4 пробела).
🔴

Неправильно:

🟢

Правильно:

Отступы

В качестве единицы отступа следует использовать четыре пробела. Однако точная конструкция отступа (пробелы и табуляции) не определена.

Отделение операторов друг от друга

Один оператор – одна строка. Одно объявление – одна строка.

🔴

Неправильно:

🟢

Правильно:

Пустые строки

Пустыми строками следует отделять:

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

Пробелы

Нужно обрамлять пробелами все операторы.

🔴

Неправильно:

🟢

Правильно:

Названия

Классы и интерфейсы

Названия классов и интерфейсов должны начинаться с большой буквы и продолжаться CamelCase-ом.

🔴

Неправильно:

🔴

Неправильно:

🔴

Неправильно:

🟢

Правильно:

Методы

Методы должны начинаться с маленькой буквы и продолжаться CamelCase-ом.

🔴

Неправильно:

🟢

Правильно:

Переменные

Все переменные должны начинаться с маленькой буквы и продолжаться CamelCase-ом.

🔴

Неправильно:

🟢

Правильно:

Константы

Все названия констант должны прописываться SneakCase-ом верхнего регистра.

🔴

Неправильно:

🟢

Правильно:

Аббревиатуры и сокращения

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

🔴

Неправильно:

🟢

Правильно:

Аббревиатуры следует представлять в виде слов (а не в верхнем регистре). Это более удобочитаемо, особенно, если название состоит из нескольких слов.

🔴

Неправильно:

🟢

Правильно:

Транслитерация

В общем-то, просто не используйте транслитерацию.

🔴

Неправильно:

🟢

Правильно:

Операторы

If-then-else

Блоки условий if-then-else должны иметь следующий вид:

🔴

Неправильно:

For

Цикл for должен иметь следующий вид:

Пустой цикл for выглядит так:

While

Цикл while должен принимать следующую форму:

Пустой цикл while:

Do-while

Цикл do-while в коде должен выглядеть так:

Switch-case

Блок switch-case по правилам должен иметь такой вид:

Каждый раз, когда case не завершается (то есть не содержит оператора break), добавляйте комментарий там, где обычно находится оператор break. Это показано в предыдущем примере кода. Каждый оператор switch должен содержать default. Прерывание в случае default является избыточным, но это предотвращает ошибку, если позже будет добавлен другой case.

Try-catch

Выражение try-catch в Java должно принимать следующий вид:

Return

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

Местоположение

Фрагменты класса

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

Локальные переменные

Объявления должны располагаться в начале блоков (блок – это любой код, ограниченный фигурными скобками { и }). Не тяните с объявлением переменных до их первого использования; это может запутать другого программиста и помешать переносимости кода в пределах области видимости.

Единственным исключением из правила являются переменные-счётчики циклов for, которые в Java могут быть объявлены в самом операторе for:

Старайтесь инициализировать локальные переменные там, где они объявлены. Единственная причина не инициализировать переменную там, где она объявлена, – это если её начальное значение зависит от того, какие вычисления сперва произойдут.

Комментарии

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

Обычные комментарии

Программы могут иметь четыре стиля обычных комментариев: блочный, однострочный, трейлерный и end-of-line-комментарий.

Блочные комментарии используются для описания файлов, методов, структур данных и алгоритмов. Блочные комментарии внутри функции или метода должны быть отступом того же уровня, что и описываемый ими код. Перед блочным комментарием должна быть пустая строка, чтобы отделить его от остального кода. Блочные комментарии имеют звездочку “*” в начале каждой строки, кроме первой.

Короткие комментарии могут располагаться в одной строке с отступом до уровня следующего за ними кода.

Очень короткие комментарии (трейлерные) могут располагаться в той же строке, что и описываемый ими код, но должны быть сдвинуты достаточно далеко, чтобы отделить их от кода. Если в фрагменте кода появляется более одного короткого комментария в одном фрагменте кода, то все они должны быть сдвинуты на одно и то же расстояние. Избегайте ассемблерного стиля пометки каждой строки кода комментарием в конце.

Разделитель комментариев // начинает комментарий, который продолжается до новой строки. Он может комментировать как всю строку, так и только её часть. Однако его не следует использовать в нескольких строках подряд для текстовых комментариев.

Javadoc

Документирующие комментарии Javadoc описывают классы, интерфейсы, перечисления, конструкторы, методы и поля в Java. Каждый такой комментарий задаётся внутри разделителей комментариев /**/, по одному комментарию на API. Эти комментарии должны размещаться непосредственно перед документируемым фрагментом (перед его объявлением).

Что ж, правил немало. Однако всё приходит с опытом, и потихоньку даже можно перестать замечать, что вы их используете. В силу того, эти принципы начинают казаться чем-то базовым и неотъемлемым. Вместе с тем, это значительно упрощает восприятие кода. Потому всем рекомендую придерживаться конвенции по написанию кода на Java.

Добавить комментарий

У этой записи один комментарий