Правила форматирования кода в Java (ч. 5.2)

Вторая часть статьи, посвященной форматированию кода в Java. Из нее вы узнаете, как форматировать классы, методы и массивы.

2.5. Правила для методов

1
Если имя метода состоит из более, чем одного слова, то для именования используется camelCase
неправильно:
void addnumber(int number)
boolean isexist()
void makemove()
правильно:
void addNumber(int number)
boolean isExist()
void makeMove()
2
Имя метода должно начинаться с глагола и состоять из одного или более слов. Но бывают исключения. А в тех случаях, когда контекст программы или класса очевидно указывает, что делает метод, то его имя может состоять из существительного. Такой подход часто используют для математических вычислений или каких-то устоявшихся операций, где использование простых и понятных имен для методов не приводит к неоднозначности или путанице
неправильно:
void endGame()
int calculation()
void attemptsClear()
правильно:
void finishGame()
int calculate()
void clearAttempts()

void factorial()
int max()
3
Классическое именование boolean-методов происходит по схеме:
is/has/can/should + прил. (сущ.) + сущ. (опционально) + глагол (опционально). Но встречаются и другие схемы
неправильно:
boolean getPermission()
boolean LogEvent()
boolean check()
boolean findNext()
boolean errorStatus()
правильно:
1) is + прил. (сущ.) + сущ. (опционально):

boolean isActive()
boolean isValidEmail()
boolean isLetter()

2) has + прил. (сущ.) + сущ. (опционально):

boolean hasPermission()
boolean hasErrors()
boolean hasNextPage()
boolean hasUnreadMessages()

3) can + глагол + сущ. (опционально):

boolean canRead()
boolean canSendMessage()
boolean canGenerateReport()

4) should + глагол + сущ. (опционально):

boolean shouldUpdate()
boolean shouldLogEvent()
boolean shouldSaveChanges()
4
Имена методов всегда должны начинаться с маленькой буквы
неправильно:
char GetLetter()
void ClearEnteredNumbers()
Player CreatePlayer()
правильно:
char getLetter()
void clearEnteredNumbers()
Player createPlayer()
5
Между именем метода и круглой скобкой ( пробел не ставится
неправильно:
public static void main (String[] args)
public int getIndex (String uuid)
System.out.println ("Math operator is wrong!")
правильно:
public static void main(String[] args)
public int getIndex(String uuid)
System.out.println("Math operator is wrong!")
6
После запятой, используемой для перечисления аргументов метода, требуется пробел
неправильно:
void addAttempt(int index,int number)
void compareNumbers(int hiddenNum,int playerNum,String name)
правильно:
void addAttempt(int index, int number)
void compareNumbers(int hiddenNum, int playerNum, String name)
7
Размещайте { на той же строке, что и конструкция к которой она принадлежит
неправильно (так форматируют в C# и C++):
foo()
{
}
правильно:
foo() {
}
8
После объявления метода пустая строка не ставится
неправильно:
я это называю программерской клаустрофобией. Ей страдают по началу все новички. В интернете полно примеров, где пустая строка ставится. Но не делайте так. Нет никаких правил или обоснований это делать
public static void main(String[] args) {

    int number = 5;
}
правильно:
public static void main(String[] args) {
    int number = 5;
}
9
Используйте this в методах только при конфликте имен. Если конфликта нет, писать this избыточно
избыточно:
int getIndex() {
    return this.index;
}
правильно:
int getIndex() {
    return index;
}

void setIndex(int index) {
    this.index = index;
}
10
Отделяйте реализацию методов друг от друга пустой строкой
неправильно:
public void setName(String name) {
    this.name = name;
}
public String getName() {
    return name;
}
public void move() {
    // some code
}
public void fire() {
    // some code
}
правильно:
public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void move() {
    // some code
}

public void fire() {
    // some code
}
11
При именовании геттера для boolean-поля вместо get используйте префикс, например, is. В имени сеттера наоборот — префикс уже не пишется. Также часто опускают префикс для переменных, переданных в методы в качестве параметра
неправильно:
private boolean active;

// вместо get должен быть префикс is
boolean getActive() {
    return active;
}

void setActive(boolean active) {
    this.active = active;
}
неправильно:
private boolean isValidEmail;

boolean isValidEmail() {
    return isValidEmail;
}

// префикс is можно опустить в имени метода и переданной переменной
void setIsValidEmail(boolean isValidEmail) {
    this.isValidEmail = isValidEmail;
}
правильно:
private boolean active;

boolean isActive() {
    return active;
}

void setActive(boolean active) {
    this.active = active;
}
правильно:
private boolean isValidEmail;

boolean isValidEmail() {
    return isValidEmail;
}

void setValidEmail(boolean validEmail) {
    this.isValidEmail = validEmail;
}
12
Группируйте геттеры и сеттеры по именам переменных, для которых они созданы. При этом не «приклеивайте» их друг к другу
неправильно:
public class Jaeger {

    private String mark;
    private String origin;

    public String getMark() {
        return mark;
    }
    public String getOrigin() {
        return origin;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }
    public void setOrigin(String origin) {
        this.origin = origin;
    }
}
правильно:
public class Jaeger {

    private String mark;
    private String origin;

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    public String getOrigin() {
        return origin;
    }
    
    public void setOrigin(String origin) {
        this.origin = origin;
    }
}
13
Размещайте геттеры и сеттеры в порядке следования полей, к которым они относятся
неправильно:
class Player {

    private String name;
    private int number;

    int getNumber() {
        return number;
    }

    void setNumber(int number) {
        this.number = number;
    }

    String getName() {
        return name;
    }

    void setName(String name) {
        this.name = name;
    }
}
правильно:
class Player {

    private String name;
    private int number;

    String getName() {
        return name;
    }

    void setName(String name) {
        this.name = name;
    }
    
    int getNumber() {
        return number;
    }

    void setNumber(int number) {
        this.number = number;
    }
}
14
Если геттеры (сеттеры) не используются, то в классе их можно не писать
15
Приватные методы размещайте в конце класса по мере их вызова из публичных методов. Располагать приватные методы среди публичных допускается только в случае, если они используются только в данном методе. В этом случае размещайте методы в классе тоже в порядке их вызовов. Код должен читаться сверху вниз, как текст в книге
неправильно:
private boolean makeMove() {
    inputNumber();
    return compareNumbers();
}

private void inputNumber() {
    // some code
}

public void start() {
    makeMove();
}

private boolean compareNumbers() {
    return true;
}
правильно:
public void start() {
    makeMove();
}

private boolean makeMove() {
    inputNumber();
    return compareNumbers();
}

private void inputNumber() {
    // some code
}

private boolean compareNumbers() {
    return true;
}

2.6. Правила для классов

1
После package и import требуется пустая строка
неправильно:
package com.webapp.storage;
import java.util.Scanner;
public class ArrayStorage {
правильно:
package com.webapp.storage;

import java.util.Scanner;

public class ArrayStorage {
2
Имена классов должны начинаться с большой буквы
неправильно:
public class math { }
public class random { }
public class board { }
правильно:
public class Math { }
public class Random { }
public class Board { }
3
Если имя класса состоит из более, чем одного слова, то для именования используется CamelCase
неправильно:
class Guessnumbermain
class Calculatortest
class Arraystorage
правильно:
class GuessNumberMain
class CalculatorTest
class ArrayStorage
4
Имя класса должно начинаться с существительного и может состоять из одного или более слов. Оно также может начинаться с прилагательного, но за ним обязательно должно следовать существительное. При этом имя класса не должно содержать глагол
неправильно:
class Sit
class SaveInteger
class CalculateSum
правильно:
class SortedArrayStorage
class CalculatorMain
class VirtualThread
class Resume
5
Между именем класса и { необходим пробел
неправильно:
public class Calculator{
правильно:
public class Calculator {
6
Между объявлением класса и объявлением полей требуется пустая строка
неправильно:
public class Resume {
    private String uuid;
    private String fullName;

    ...
}
правильно:
public class Resume {

    private String uuid;
    private String fullName;

    ...
}
7
Поля следует размещать только в начале класса (перед конструкторами)
неправильно:
public class Wolf {

    private String sex;

    public String getSex() {
        return sex;
    }

    private String name;

    public String getName() {
        return name;
    }
}
правильно:
public class Wolf {

    private String sex;
    private String name;

    public String getSex() {
        return sex;
    }

    public String getName() {
        return name;
    }
}
8
В одной строке объявляйте за раз только одну переменную
неправильно:
class Person {

    String uuid, name;
    double height, weight;
}
правильно:
class Person {

    String uuid;
    String name;
    double height;
    double weight;
}
9
Не используйте в именах полей и методов имя класса, в котором они размещаются, т. к. и так понятно, что все, что в нем находится, относится к данному классу
неправильно:
public class Player {
	
    private String playerName;

    public int getPlayerName() {
        return playerName;
    }
}
правильно:
public class Player {
	
    private String name;

    public int getName() {
        return name;
    }
}
10
Между блоком полей и конструктором необходима пустая строка
неправильно:
public class Resume {

    private String uuid;
    private String name;
    public Resume(String uuid) {
        this.uuid = uuid;
    }
}
правильно:
public class Resume {

    private String uuid;
    private String name;

    public Resume(String uuid) {
        this.uuid = uuid;
    }
}
11
Конструкторы следует размещать после блока с полями
неправильно:
class BankAccount {

    private String name;

    String getName() {
        return name;
    }

    public BankAccount(String name) {
        this.name = name;
    }
}
правильно:
class BankAccount {

    private String name;

    public BankAccount(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }
}
12
Между именем конструктора и ( пробел не ставится
неправильно:
Player (String name)
Resume (String uuid)
new Cat ()
правильно:
Player(String name)
Resume(String uuid)
new Cat()
13
Конструкторы следует размещать в порядке, зависящем от принимаемых ими числа аргументов: от меньшего к большему
неправильно:
class Resume {

    Resume(String name, int number) {}

    Resume() {}

    Resume(String name) {}
}
правильно:
class Resume {

    Resume() {}

    Resume(String name) {}

    Resume(String name, int number) {}
}
14
Перенесенные на новую строку аргументы конструктора необходимо смещать вправо на 8 пробелов относительно первой строки. При этом старайтесь, чтобы на каждой строке было примерно равное количество аргументов
неправильно:
public Jaeger(String modelName, String mark, String origin,
    float height, float weight, int strength) {
    this.modelName = modelName;
    this.mark = mark;
    ...
}

Jaeger jaeger = new Jaeger("Guardian Bravo", "Mark-6", "Japan",
    73.21f, 2.18f, 35, 70);
правильно:
public Jaeger(String modelName, String mark, String origin,
        float height, float weight, int strength) {
    this.modelName = modelName;
    this.mark = mark;
    ...
}

Jaeger jaeger = new Jaeger("Guardian Bravo", "Mark-6", "Japan",
        73.21f, 2.18f, 35, 70);
15
В начале и в конце класса не должно быть пустых строк
неправильно:
// лишняя пустая строка
public class Player {

    private String name;

    public String getName() {
        return name;
    }
    // лишняя пустая строка
}
// лишняя пустая строка
правильно:
public class Player {

    private String name;

    public String getName() {
        return name;
    }
}
16
Порядок объявления членов класса
class Name {
    константы
    статические поля
    final-поля
    поля
    конструкторы
    геттеры/сеттеры
    методы
    перегруженные методы
    вложенные классы
}

2.7. Правила для массивов

1
При создании переменной для хранения ссылки на массив и самого массива, размещайте [] в Java-стиле, а не в Си или С++, а также не ставьте лишних пробелов
неправильно:
int numbers[]
int [] numbers
int numbers []
new int [10]
правильно:
int[] numbers = new int[10]
2
Не используйте множественное число в имени сеттера и передаваемого в него аргумента для работы с массивом (если метод за один раз принимает одно значение, а не массив целиком)
неправильно:
private int[] enteredNums;

void setEnteredNums(int nums) {
    enteredNums[index] = nums;
}
правильно:
private int[] enteredNums;

void setEnteredNum(int num) {
    enteredNums[index] = num;
}

или

void addNum(int num) {
    enteredNums[index] = num;
}
3
Используйте this в методах для работы с массивами только при конфликте имен. Если конфликта нет, писать this избыточно
неправильно:
public void setNumber(int number) {
    this.numbers[index] = number;
}
правильно:
public void setNumber(int number) {
    numbers[index] = number;
}

Заключение

В данной статье была представлена очень важная информация для начинающих программистов, которую многие недооценивают. А зря, т. к. форматирование кода можно сравнить с правилами правописания в литературе: любой текст, каким бы гениальным он не был, без должного оформления будет выглядеть небрежно и плохо читаемым. Так же качество и читабельность кода во многом зависят от его оформления.
Автор: Чимаев Максим
Оцените статью, если она вам понравилась!