Java: рекомендации по стилю кода

 

Рекомендуемая литература

  1. Effective Java
  2. Java Concurrency in Practice
  3. Code Complete 2 - Не Java спецификация, но хорошее руководство по Best-Practices

Используйте разрывы строк с умом

Есть как правило две причины делать разрыв строки

  1. Ваш оператор превышает лимит колонок
  2. Вы хотите логически отделить мысль.

Отступы и фигурные скобки

Всегда ставьте фигурные скобки, старайтесь не избегать их. Так же придерживайтесь отступов.

// Хорошо
if (x < 0) {
negative(x);
} else {
nonnegative(x);
}

// Плохо
if (x < 0)
negative(x);

// А это еще хуже.
if (x < 0) negative(x);

 Форматирование текста с большим количеством строк

// Не правильно.
// - Разрывы строк произвольны, неудобо читаемы и не логичны.
throw new IllegalStateException("Failed to process request" + request.getId()
+ " for user " + user.getId() + " query: '" + query.getText()
+ "'");

// Правильно.
// - Текст легко читаем, логично разделен.
throw new IllegalStateException("Failed to process"
+ " request " + request.getId()
+ " for user " + user.getId()
+ " query: '" + query.getText() + "'");

Не переносить объявление переменных когда это не нужно

// Не правильно.
final String value =
otherValue;

// Правильно.
final String value = otherValue;

Методы с большим количеством аргументов

// Суб-оптимально. Разрывы строк являются произвольными
String downloadAnInternet(Internet internet, Tubes tubes,
Blogosphere blogs, Amount<Long, Data> bandwidth) {
tubes.download(internet);
...
}

// Допустимо.
String downloadAnInternet(Internet internet, Tubes tubes, Blogosphere blogs,
Amount<Long, Data> bandwidth) {
tubes.download(internet);
...
}

// Хороший вариант, легко читаемый код
public String downloadAnInternet(
Internet internet,
Tubes tubes,
Blogosphere blogs,
Amount<Long, Data> bandwidth) {

tubes.download(internet);
...
}

Вызовы методов по цепочке

// Не правильно, читать сложно, все сливается в одну строку
Iterable<Module> modules = ImmutableList.<Module>builder().add(new LifecycleModule())
.add(new AppLauncherModule()).addAll(application.getModules()).build();

// Приемлемо
Iterable<Module> modules = ImmutableList.<Module>builder().
add(new LifecycleModule()).
add(new AppLauncherModule()).
addAll(application.getModules()).
build();

// Правильно
Iterable<Module> modules = ImmutableList.<Module>builder()
.add(new LifecycleModule())
.add(new AppLauncherModule())
.addAll(application.getModules())
.build();

Табуляция

Не используйте табуляцию при написании исходного кода, настройте свою IDE на конвертирование TAB'ов в пробелы. Идельный вариант если вы настроете табуляцию на конвертацию в 4 пробела.

100 колонок - лимит!

Установите себе в IDE ограничение на 100 колонок символов в длину. Это соглашение принято корпорацией google. Сделано это для того, чтобы можно было на средних мониторах сделать разделение рабочей области по горизонтали и работать сразу с двумя файлами.

Используйте UpperCamelCase для именования классов, lowerCamelCase для именования свойств и переменных и UPPER_SNAKE для именования констант.

public class Cart {
private final static int MAX_ITEMS = 10;
private Set<Item> itemsInCart;
}

Модификаторы доступа

Соблюдайте java language specification при объявлении модификаторов доступа.

// Не правильно.
final volatile private String value;

// Правильно.
private final volatile String value;

Именование переменных

Если переменная находится не в цикле, то давайте ей полное и понятное имя.

// Не правильно.
class User {
private final int a;
private final String m;

...
}

// Правильно.
class User {
private final int ageInYears;
private final String maidenName;

...
}

Включайте единицы измерения в имена переменных

// Не правильно.
long pollInterval;
int fileSize;

// Правильно.
long pollIntervalMs;
int fileSizeGb.

Не вставляйте информацию о метаданных в имена переменных

// Не правильно.
Map<Integer, User> idToUserMap;
String valueString;

// Правильно.
Map<Integer, User> usersById;
String value;

Вставляйте пробелы при использовании операторов

// Не правильно.
int foo=a+b+1;

// Правильно.
int foo = a + b + 1;

Всегда помните о приоритетах операций

Приоритеты операций можно посмотреть в официальной документации языка.

// Плохо.
return a << 8 * n + 1 | 0xFF;

// Хорошо.
return (a << (8 * n) + 1) | 0xFF;

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

Java
05.11.2016
1 ответ
Алекс@coaperator

Хорошие статьи, когда еще будут? )

Vyacheslav@proweber1

))Сегодня собираюсь написать

Алекс@coaperator

И где статья обещаная? =)

авторизуйтесь чтобы ответить