Java: рекомендации по стилю кода
Рекомендуемая литература
- Effective Java
- Java Concurrency in Practice
- Code Complete 2 - Не Java спецификация, но хорошее руководство по Best-Practices
Используйте разрывы строк с умом
Есть как правило две причины делать разрыв строки
- Ваш оператор превышает лимит колонок
- Вы хотите логически отделить мысль.
Отступы и фигурные скобки
Всегда ставьте фигурные скобки, старайтесь не избегать их. Так же придерживайтесь отступов.
// Хорошо
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;
В следующей статье из серии чистоты кода будет рассказано про документирование. Всем спасибо, задавайте вопросы.
Хорошие статьи, когда еще будут? )
))Сегодня собираюсь написать
И где статья обещаная? =)