-
Notifications
You must be signed in to change notification settings - Fork 5
Код стайл для языка Java
Georgiy Bagretsov edited this page Nov 1, 2015
·
3 revisions
- Отступ от начала предыдущей строки равняется четырём пробелам.
- Две пустых линии используются, чтобы разделять объявления классов и интерфейсов.
- Одна пустая линия должна разделять:
- Методы
- Локальные переменные в методе и первое выражение
- Блок или отдельную строку комментариев
- Логически разделенные части в методе, чтобы улучшить читабельность
Скобка переносится на новую строку при определении пространств имен (namespaces) и классов (classes). В остальных случаях скобка остается на той же строке.
class MyClass
{
int foo() {
makeStuff();
makeAnotherStuff();
}
}
- Максимальная длина строки равна 120 символам. Если аргументы метода не помещаются на одной строке, их следует разбивать на несколько строк; новую строку следует начинать на одну позицию правее открывающей скобки списка аргументов.
// Правильно
int lotsOfArgs(int anInteger, long aLong, short aShort,
double aDouble, float aFloat, String aString);
// Неправильно
int lotsOfArgs(int anInteger, long aLong, short aShort, double aDouble, float aFloat, String aString);
- В сложных выражениях размещайте каждое условие на отдельной строке.
// Правильно
if ((('0' <= inChar) && (inChar <= '9'))
|| (('а' <= inChar) && (inChar <= 'z'))
|| (('A' <= inСhar) && (inСhar <= 'Z'))) {
/* .... */
}
// Неправильно
if ((('0' <= inChar) && (inChar <= '9')) || (( 'а' <= inChar) && (inChar <= 'z')) || (( 'A' <= inСhar) && (inСhar <= 'Z'))) {
/* .... */
}
- Всегда располагайте один оператор на строке.
// Правильно
a = b + 1;
c++;
// Неправильно
a = b + 1; c++;
- Тело операторов
if
,else if
,do
,while
,for
необходимо всегда выделять фигурными скобками, а перед каждым оператором ставить отступ – четыре пробела.
// Правильно
if (x == y) {
makeSomeStuff();
makeSomeOtherStuff();
} else if (x > y) {
singleLine();
} else {
doThis();
doThat();
}
for (int i = 0; i < 10; i++) {
statements;
}
// Неправильно
if (x == y) {
makeSomeStuff();
makeSomeOtherStuff();
} else if (x > y)
singleLine();
else
{
doThis();
doThat();
}
for (int i = 0; i < 10; i++) statement;
- Слово
while
не переносится на новую строку
do {
doThis();
doThat();
} while (condition);
- Форма тернарного оператора:
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;
- Операторы
case
должны находиться в той же колонке, что и операторswitch
. - Каждый случай должен заканчиваться оператором
break
(илиreturn
) или комментарием, чтобы показать, что далее следует другой случай.
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
case Value3:
doSomethingElse();
// fall through
default:
defaultHandling();
break;
}
Выражение типа try-catch
должно иметь следующий вид:
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
doStuff();
}
- Необходимо вставлять пробел между операциями присваивания, логическими и арифметическими операциями.
// Правильно
if (i == 0) {
/* ... */;
}
a += 3;
a = b + c;
// Неправильно
if (i = = 0) {
/* ... */;
}
a+ =3;
a=b+c;
- Не следует оставлять пробел после унарной операции.
if (!flag) {
break;
}
- Все названия должны быть на английском языке.
- Названия пакетов должны быть написаны строчными буквами
mypackage, com.company.application.ui
- Названия классов должны быть существительными и написаны в PascalCase (название переменной пишется слитно, каждое новое слово начинается с заглавной буквы).
class Raster;
class ImageSprite;
- Названия интерфейсов должны быть в PascalCase.
interface RasterDelegate;
interface Storing;
- Названия методов должны начинаться с глагола и быть написаны в camelCase (название пишется слитно и начинается со строчной буквы, каждое новое слово начинается с заглавной буквы).
initialize();
cookApplePie();
- Имена переменных должны быть в camelCase. Старайтесь избегать однобуквенных имен, за исключением временных «ненужных» переменных (например для счётчиков удобно использовать название
i
).
float myWidth;
int i;
- Имена констант должны быть написаны заглавными буквами, слова разделяются нижним подчеркиванием.
int MIN_WIDTH = 4;
int MAX_WIDTH = 999;
int GET_THE_CPU = 1;
- Элементы перечисляемого типа должны быть написаны заглавными буквами, слова разделяются нижним подчеркиванием.
enum Season {
WINTER, SPRING, SUMMER, AUTUMN
}
- Следует избегать аббревиатур, кроме случаев, где аббревиатура более известна, чем полное название. Аббревиатуры должны быть в camelCase.
exportHtmlSource();
- В названиях переменных и методах типа
boolean
следует использовать префиксis
илиhas
.
isSet, isVisible, isFinished(), isOpen(); hasThis, hasThat
- Следует использовать
compute
в методах, где подсчитывается какое-то значение,find
– в методах, где что-то ищется.
valueSet.computeAverage();
matrix.computeInverse()
vertex.findNearestVertex();
matrix.findSmallestElement();
- Используйте множественное число для коллекций объектов.
Collection<Point> points;
int[] values;
- Избегайте отрицательных префиксов для переменных и методов типа
boolean
.
// Правильно
bool isError;
bool isFound;
// Неправильно
bool isNoError;
bool isNotFound;
- Все поля должны объявляться в начале класса.
- Классы и интерфейсы должны объявляться следующим образом:
- Статические переменные класса в порядке
public
,protected
,package-private
,private
- Остальные переменные класса в порядке
public
,protected
,package-private
,private
- Конструкторы
- Методы
- Статические переменные класса в порядке
- Объявляйте класс как
final
, если необходимо исключить наследование данного класса.
final class MyFinalClass {
/* body */
}
- Модификаторы метода должны идти в следующем порядке:
<access> static abstract synchronized transient final native
.
// Правильно
public static double square(double a);
// Неправильно
static public double square(double a);
- Объявляйте метод, переменную или аргумент метода как
final
, если он(-а) не должен(-на) подвергаться изменениям.
public final int doStuff(final int i) {
final int myFinalVar = i * 10;
/* body */
}
- Приведение типов следует писать в явном виде.
// Правильно
floatValue = (int) intValue;
// Неправильно
floatValue = intValue;
- Массивы следует объявлять скобками рядом с типом.
// Правильно
double[] coeffs;
int[] points;
// Неправильно
double coeffs[];
int points[];
- Все комментарии пишутся на английском языке.
- Комментарии описывают, что делает код, а не как.
- Не стоит писать комментарии ради комментариев.
- Блоки и отдельные строки комментариев должны быть сдвинуты так же, как и окружающий их код.
- Можно использовать различные формы записи комментариев.
// single-line comment
/*
* multi-line
* comment
*/
/*
* another
* multi-line comment */
- Используйте комментарии
TODO
для кода, который является временным, краткосрочным, или хорошим, но не идеальным. Также следует вставлять конкретную дату, к которой проблема должна быть решена, или же конкретное событие.
// TODO: Change this to use flag instead of constant by Dec 31
// TODO: Delete this method after v1.2 release
- Каждый класс и
public
метод должен содержать Javadoc, по крайней мере, с одной фразой, описывающей, что он делает. Фраза должна начинаться с описательного глагола 3-го лица.
/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
}
/**
* Constructs a new String by converting the specified array of
* bytes using the platform's default character encoding.
*/
public String(byte[] bytes) {
}
- Вам не нужно описывать Javadoc для тривиальных
get
иset
методов, таких какsetFoo()
, если ваш Javadoc говорит только/* Sets Foo */
. - Если при использовании метода необходимо выполнять какие-либо ограничения, или если действие метода имеет важный эффект в другом месте программы, обязательно опишите это в документации.
- Не пишите слишком длинных методов.
- Метод должен делать ровно то, что написано в его названии. Если метод делает что-либо еще, разделите его на несколько методов.
- Локальные переменные: ограничивайте область видимости.
- Следует избегать использования «магических» чисел в коде, любые числа кроме 0 и 1 должны быть записаны в константы.
// Правильно
private static final int TEAM_SIZE = 11;
...
Player[] players = new Player[TEAM_SIZE];
// Неправильно
Player[] players = new Player[11];
- Следует использовать аннотацию
@Override
, если метод переопределен.
@Override
public void overrideMe() {
doSomething();
}
- Стили кодирования
- [Java](Код стайл для языка Java)
- [C/C++](Стиль написания кода на С )
- [C#](Стиль написания кода на С# )
- [Swift](Руководство по оформлению кода на языке Swift )
- Написание комментариев к коммитам
- Android
- Android DevGuide
- [QR codes](Работа c QR на Android)
- [Полезные вещи](Полезные вещи для Android разработки)
- [Архитектура приложения](Архитектура приложения)
- [Используемые компоненты](Используемые компоненты)
- [Инструкция по сборке проекта](Инструкция по сборке проекта)
- iOS
- [Код на C++ под iOS](Использование кода и библиотек cpp при создании приложений на языке Swift)
- Стилевые таблицы NSS
- Структура проекта в Xcode
- Clean Architecture
- C и C++
- [Использование CMake для проектов на C++ и C ](Использование CMake для проектов на C и CPP)
- Форматы файлов
- [.bmp](Cтруктура хранения bmp файлов)
- [.jpg](Cтруктура хранения jpg файлов)
- [.png](Cтруктура хранения png файлов)
- Алгоритмы шифрования
- Кодирование информации псевдослучайными последовательностями чисел
- Визуальная криптография
- Схема разделения секретной визуальной информации
- Шифрование RGB изображения с помощью Фурье образа
- RSA-шифрование .bmp файлов
- Примеры использования
- [Библиотека матричной алгебры](Пример использования библиотеки матричной алгебры)
- Описание процесса кодирования файла
- Способ обезопасить использование приложения
- Java фасад библиотеки алгоритмов
- Алгоритм шифрования bmp на java заглушке
- Матричная арифметика
- [A+B](Сложение матриц)
- [A*p](Умножение матрицы на скаляр)
- [A*B](Умножение матриц)
- [Обратные матрицы](Нахождение обратной матрицы)
- Взятие по модулю
- [A
mod
p](Взятие матрицы по модулю простого числа) - [A
mod
P](Взятие матрицы по модулю - матрицы из простых чисел)
- Суперпозиция (модуль - простое число)
- [A+B
mod
p](Сложение матриц по модулю простого числа) - [A*c
mod
p](Умножение матрицы на скаляр по модулю простого числа) - [A*B
mod
p](Умножение матриц по модулю простого числа)
- Суперпозиция (модуль - матрицы из простых чисел)
- [A+B
mod
P](Сложение матриц по модулю - матрице простых чисел) - [A*c
mod
P](Умножение матрицы на скаляр по модулю - матрице простых чисел) - [A*B
mod
P](Умножение матриц по модулю - матрице простых чисел)
##Прочее
- [Утечки памяти](Memory Leaks)
- [Базовые цвета](Базовые цвета)
- [Clean Architecture](Clean Architecture)