На основе спецификации разработки Alibaba JAVA
Стиль именования
-
[Обязательно] Имя класса использует стиль UpperCamelCase и должно соответствовать регистру верблюдов, за следующими исключениями: DO / BO / DTO / VO / AO
Положительный пример: MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion.
Пример счетчика: macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion -
[Обязательно] Имена методов, имена параметров, переменные-члены и локальные переменные используют стиль lowerCamelCase, который должен следовать за верблюжьим регистром.
Положительный пример: localValue/getHttpMessage()/inputUserId
-
[Обязательно] Все имена констант в верхнем регистре, слова разделены символом подчеркивания, смысловое выражение должно быть полным и ясным, а имена не должны быть слишком длинными.
Положительный пример: MAX_STOCK_COUNT Отрицательный пример: MAX_COUNT
-
[Обязательно] Имя абстрактного класса начинается с Abstract или Base; имя класса исключений начинается с Exception; имя тестового класса начинается с имени тестируемого класса и заканчивается на Test.
-
[Обязательно] Не добавляйте is к переменным логического типа в классе Model, иначе синтаксический анализ некоторых фреймворков вызовет ошибки сериализации.
Пример счетчика: свойство, определенное как базовый тип данных Boolean isDeleted;, его метод также isDeleted().Когда инфраструктура RPC выполняет обратный синтаксический анализ, она «думает», что соответствующее имя свойства удалено, поэтому свойство не может быть удалено. получается, и выбрасывается исключение.
-
[Обязательно] Для классов службы и DAO, основанных на концепции SOA, предоставляемая служба должна быть интерфейсом, а класс внутренней реализации отличается от интерфейса суффиксом Impl. Положительный пример: CacheManagerImpl реализует интерфейс CacheManager.
-
[Рекомендуется] Для достижения цели понятного кода при именовании любого пользовательского элемента программирования используйте как можно более полную комбинацию слов, чтобы выразить его значение.
Положительный пример: класс, извлекающий код из удаленного репозитория, называется PullCodeFromRemoteRepository.
Контрпример: Произвольное наименование переменной int a;.
- [Рекомендуется] Не добавляйте символы-модификаторы (и общедоступные) к методам и свойствам класса интерфейса, сохраняйте лаконичность кода и добавляйте допустимые комментарии Javadoc. Старайтесь не определять переменные в интерфейсе.Если вы должны определить переменные, они должны быть связаны с методами интерфейса и являться базовыми константами всего приложения.
Положительный пример: сигнатура метода интерфейса: void f(), представление базовой константы интерфейса: String COMPANY = "alibaba";
Пример счетчика: определение метода интерфейса: public abstract void f();
Примечание. Интерфейсы в JDK8 допускают реализации по умолчанию, поэтому этот метод по умолчанию является реализацией по умолчанию, которая ценна для всех классов реализации.
-
[Ссылка] Имена классов перечисления рекомендуется добавлять с суффиксом Enum.Имена членов перечисления должны быть все в верхнем регистре, а слова должны быть разделены символами подчеркивания.
Примечание. Перечисления на самом деле являются специальными константными классами, и конструктор по умолчанию принудительно является закрытым.
Положительный пример: имя перечисления Имя члена ProcessStatusEnum: SUCCESS / UNKOWN_REASON. -
[Ссылка] Соглашения об именах для каждого слоя:
A) Соглашение об именовании методов уровня службы/DAO
1) Методы получения одного объекта имеют префикс get.
2) Метод получения нескольких объектов имеет префикс list.
3) Метод получения статистического значения имеет префикс count.
4) Вставляемый метод имеет префикс save/insert.
5) Метод удаления имеет префикс remove/delete.
6) Модифицированный метод имеет префикс update.
2. Определение переменной
- [Рекомендуется] Не используйте класс констант для поддержки всех констант, классифицируйте их в соответствии с их функциями и обслуживайте их отдельно. Примечание. Класс констант является большим и всеобъемлющим, и необходимо использовать функцию поиска, чтобы найти измененную константу, что не способствует пониманию и обслуживанию.
Положительный пример: константы, связанные с кэшем, помещаются в класс CacheConsts, константы, связанные с конфигурацией системы, помещаются в класс ConfigConsts.
3. Формат кода
-
[Обязательно] Используйте соглашения для фигурных скобок. Если фигурные скобки пусты, это можно записать как {} кратко без разрывов строки; если это непустой блок кода:
1) Нет разрыва строки перед открывающей фигурной скобкой.
2) Новая строка после открывающей скобки.
3) Новая строка перед закрывающей фигурной скобкой.
4) Если после закрывающей скобки стоит код типа else, то он не будет переноситься, это означает, что закрывающая скобка должна переноситься. -
[Обязательно] Между открывающей скобкой и символом нет пробела, точно так же нет пробела между закрывающей скобкой и символом.
Пример счетчика: if (пробел a == b пробел) -
[Обязательно] Необходимо добавить пробелы между зарезервированными словами, такими как if/for/while/switch/do и круглыми скобками.
-
[Обязательно] Пробел должен быть добавлен слева и справа от любого бинарного или тернарного оператора.
Примечание. К операторам относятся оператор присваивания =, логический оператор &&, символы сложения, вычитания, умножения и деления и т. д. -
[Обязательно] Используйте 4 пробела для отступа, а символы табуляции запрещены.
Описание: проект Vue имеет отступ в 2 пробела. -
[Обязательно] Между двойной косой чертой комментария и содержанием комментария есть один и только один пробел.
Положительный пример: // Содержимое комментария, обратите внимание, что между // и содержимым комментария есть пробел. -
[Обязательно] При определении и передаче параметров метода необходимо добавлять пробел после запятых нескольких параметров.
Положительный пример: за буквой «a» фактического параметра в следующем примере должен следовать пробел. метод("а", "б", "в"); -
[Обязательно] Для кодировки текстового файла в среде IDE установлено значение UTF-8; символ новой строки файла в среде IDE использует формат Unix, а не формат Windows.
-
[Рекомендуется] Вставьте пустую строку между группой операторов выполнения, группой операторов определения переменных, другой бизнес-логикой или другой семантикой в теле метода. Пустые строки не нужно вставлять между одной и той же бизнес-логикой и семантикой.
Описание: Нет необходимости вставлять несколько пустых строк для их разделения.
4. Протокол ООП
-
[Обязательно] Все переопределяющие методы должны быть аннотированы @Override.
-
[Обязательно] Нельзя использовать устаревшие классы или методы.
-
[Обязательный] Метод equals объекта склонен генерировать исключения нулевого указателя.Вы должны использовать константы или объекты с определенными значениями для вызова equals.
Положительный пример: "test".equals(object);
Пример счетчика: object.equals("test"); -
[Обязательно] Все значения однотипных объектов-оболочек сравниваются с помощью метода equals.
Описание: Для присвоения Integer var = ? в диапазоне от -128 до 127 объект Integer генерируется в IntegerCache.cache, и будет повторно использоваться существующий объект. Значение Integer в этом диапазоне можно непосредственно судить по == , но этот диапазон. Все остальные данные будут генерироваться в куче и не будут повторно использовать существующие объекты. Это большая яма. Для суждения рекомендуется использовать метод equals. -
[Обязательно] Возвращаемые значения и параметры методов RPC должны использовать типы данных-оболочек.
-
[Обязательно] Запрещено добавлять какую-либо бизнес-логику в конструктор, если есть логика инициализации, пожалуйста, поместите ее в метод init.
-
[Рекомендуется] Если в классе есть несколько конструкторов или несколько методов с одинаковыми именами, эти методы следует размещать вместе, чтобы их было легко читать.
-
[Рекомендуется] В теле цикла используйте метод append StringBuilder, чтобы расширить метод соединения строк. Примечание. Декомпилированный файл байт-кода показывает, что новый объект StringBuilder будет создаваться каждый раз при выполнении цикла, затем выполняется операция добавления, и, наконец, объект String возвращается через метод toString, что приводит к пустой трате ресурсов памяти.
Пример счетчика:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
- [Рекомендуется] Используйте метод clone объекта Object с осторожностью для копирования объектов. Примечание. Метод клонирования объекта по умолчанию является поверхностной копией.Если вы хотите реализовать глубокую копию, вам необходимо переопределить метод клонирования, чтобы скопировать объект атрибута.
5. Обработка коллекции
- [Обязательно] Для использования метода преобразования набора в массив необходимо использовать массив toArray(T[]) набора, а входящий массив - однотипный, а размер - list.size().
Описание: При использовании метода toArray с параметрами, когда пространство массива, выделенное входным параметром, недостаточно велико, метод toArray перераспределит пространство памяти и вернет новый адрес массива; если элементы массива больше фактического потребности, нижний индекс [ list.size() Элементы массива ] будут установлены в значение null, а другие элементы массива сохранят свои исходные значения, поэтому лучше всего определить размер группы входных параметров метода, чтобы он соответствовал количество элементов коллекции. Положительный пример:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
Пример счетчика: есть проблема с прямым использованием метода toArray без параметров.Возвращаемое значение этого метода может быть только класса Object[].Если вы приводите другие типы массивов, возникает ошибка ClassCastException.
- [Обязательно] Не выполнять операции удаления/добавления над элементами в цикле foreach. Для удаления элементов используйте метод Iterator. Если операция выполняется одновременно, вам необходимо заблокировать объект Iterator.
Положительный пример:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
Пример счетчика:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
- [Рекомендуется] Используйте entrySet для обхода набора классов Map KV вместо keySet.
6. Операторы управления
-
[Обязательно] В блоке переключателя каждый случай либо завершается прерыванием/возвратом и т. д., либо в комментарии указывается, в каком случае программа будет продолжать выполняться; в блоке переключателя должен быть включен оператор по умолчанию и помещен в конец , даже если у него нет кода.
-
[Обязательно] Фигурные скобки должны использоваться в операторах if/else/for/while/do. Даже если имеется только одна строка кода, избегайте однострочного кодирования: операторы if (условие);
-
[Рекомендуется] За исключением обычных методов (таких как getXxx/isXxx), не выполняйте другие сложные операторы в условной оценке и присваивайте результат сложной логической оценки осмысленному логическому имени переменной для улучшения удобочитаемости. Объяснение: Логика многих операторов if довольно сложна. Читатель должен проанализировать окончательный результат условного выражения, чтобы определить, какое условие для выполнения какого типа оператора. Затем, что, если читатель неправильно анализирует логическое выражение?
Положительный пример: // Псевдокод выглядит следующим образом
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
Пример счетчика:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
...
}
- [Рекомендация] Следует учитывать производительность операторов в теле цикла.Следующие операции должны быть максимально перемещены за пределы цикла, такие как определение объектов, переменных, получение соединений с базой данных и выполнение ненужных операций try-catch (будь то этот try-catch можно вынести за пределы цикла?).
- [Ссылка] В следующих случаях требуется проверка параметров:
1) Вызывать методы с низкой частотой.
2) Методы с большими затратами времени на выполнение. В этом случае время проверки параметров практически ничтожно, но если промежуточное выполнение откатится из-за ошибок в параметрах, или окажется неверным, это не будет стоить потерь.
3) Методы, требующие чрезвычайно высокой стабильности и доступности.
4) Открытый интерфейс, предоставляемый извне, будь то интерфейс RPC/API/HTTP. 5) Чувствительная запись разрешения.
7. Протокол аннотации
-
[Обязательно] Комментарии к классам, атрибутам классов и методам классов должны использовать спецификацию Javadoc, использовать формат /**content*/ и не могут использовать метод //xxx.
-
[Обязательно] Все абстрактные методы (включая методы в интерфейсах) должны быть аннотированы с помощью Javadoc.Помимо возвращаемых значений, параметров и описаний исключений, они также должны указывать, что делает метод и какие функции он реализует. Описание: Требования к реализации подклассов или меры предосторожности при вызове объясните вместе.
-
[Обязательно] Все классы должны указывать создателя и дату создания.
-
[Обязательно] Однострочный комментарий внутри метода, начинайте новую строку над закомментированным оператором и используйте // комментарий. Многострочные комментарии внутри методов Используйте /* */ комментарии, обратите внимание на выравнивание с кодом.
-
[Обязательно] Все поля типа перечисления должны иметь комментарии, описывающие назначение каждого элемента данных.
-
[Рекомендация] При изменении кода комментарии должны быть соответствующим образом изменены, особенно изменение параметров, возвращаемых значений, исключений, базовой логики и т. д. Примечание: обновления кода и аннотаций не синхронизированы, так же как не синхронизированы обновления дорожной сети и навигационного программного обеспечения.Если навигационное программное обеспечение серьезно отстает, смысл навигации будет потерян.
-
[Ссылка] Тщательно прокомментируйте код. Разработайте выше, а не просто комментируйте. Удаляйте, если бесполезно.
-
[Ссылка] Требования к комментариям: во-первых, точно отражать дизайнерские идеи и логику кода, во-вторых, описывать бизнес-значение, чтобы другие программисты могли быстро понять информацию, стоящую за кодом. Большой кусок кода без комментариев, как книга для читателя.Комментарии для себя, даже спустя долгое время, они могут четко понять мысли в то время, комментарии также для преемника, чтобы он мог быстро взять на себя.
-
[Ссылка] Хорошая структура именования и кода не требует пояснений, а комментарии должны быть краткими, точными и выразительными. Одна крайность избегания комментариев: слишком много комментариев, как только логика кода изменена, изменение комментариев становится значительным бременем.
-
【Ссылка】Специальная отметка, пожалуйста, укажите человека и отметьте время. Позаботьтесь о своевременной обработке этих меток и часто очищайте такие метки с помощью сканирования меток. Сбои линии иногда происходят из-за кода на этих маркерах.
1) TODO: (отмеченное лицо, отмеченное время, [ожидаемое время обработки]) Указывает на функцию, которая должна быть реализована, но еще не реализована. На самом деле это тег Javadoc, который в настоящее время не реализован в Javadoc, но широко используется. Может применяться только к классам, интерфейсам и методам (поскольку это тег Javadoc).
2) Ошибка, не может работать (FIXME): (отмеченное лицо, отмеченное время, [оценочное время обработки]) Состояние, отмеченное FIXME в комментарии, что какой-то код неверен и не работает, и его нужно вовремя исправить .
8. Другие
-
[Обязательно] При использовании регулярных выражений хорошо используйте его функцию предварительной компиляции, которая может эффективно ускорить регулярные выражения. Описание: Не определяйте в теле метода: Pattern pattern = Pattern.compile(rule);
-
[Обязательно] Обратите внимание, что метод Math.random() возвращает тип double.Обратите внимание, что диапазон значений 0≤x
-
[Обязательно] Получить текущую миллисекунду System.currentTimeMillis() вместо new Date().getTime();
-
[Рекомендуется] Размер любой структуры данных должен быть указан при построении или инициализации, чтобы предотвратить бесконечный рост структуры данных и потребление памяти.
Девять, обработка исключений
- [Обязательно] Цель перехвата исключения — его обработка. Не перехватывайте его, а ничего не делайте и отбрасывайте. Если вы не хотите его обрабатывать, отправьте исключение вызывающему. Самый удаленный бизнес-пользователь должен обрабатывать исключения и преобразовывать их в контент, понятный пользователям.
10. База данных MySQL
создать спецификацию таблицы
-
[Обязательно] В имени таблицы и имени поля должны использоваться строчные буквы или цифры, причем начало числа запрещено, а также запрещены только числа между двумя символами подчеркивания. Модификация имен полей базы данных требует больших затрат, поскольку предварительный выпуск не может быть выполнен, поэтому необходимо тщательно продумывать имена полей.
Примечание: MySQL нечувствителен к регистру в Windows, но по умолчанию чувствителен к регистру в Linux. Таким образом, база данных Имя, имя таблицы, имя поля не должны содержать заглавных букв, чтобы избежать посторонних ответвлений.
Положительный пример: aliyun_admin, rdc_config, level3_name Пример встречный: AliyunAdmin, rdcConfig, level_3_name -
[Обязательно] Отключите зарезервированные слова, такие как desc, range, match, delayed и т. д. Пожалуйста, обратитесь к официальным зарезервированным словам MySQL.
-
[Обязательный] Имя индекса первичного ключа — имя pk_field, имя уникального индекса — имя uk_field, имя общего индекса — имя idx_field. Описание: pk_ — первичный ключ, uk_ — уникальный ключ, idx_ — сокращение от index.
-
[Обязательный] Тип decimal — десятичный, использование float и double запрещено.
-
[Обязательно] Если сохраненные строки почти одинаковой длины, используйте тип строки фиксированной длины char.
-
[Обязательный] varchar — это строка переменной длины, место для хранения не выделяется заранее, и длина не должна превышать 5000. Если длина хранения больше этого значения, определите тип поля как текст.
-
[Обязательно] В таблице должно быть три поля: id, create_time, update_time, delete_flag
-
[Обязательно] Для полей логического типа используйте десятичный тип
-
[Обязательно] Комментарии обязательны как для таблиц, так и для полей.
-
[Рекомендуется] Сегментирование базы данных рекомендуется только в том случае, если количество строк в одной таблице превышает 5 миллионов строк или емкость одной таблицы превышает 2 ГБ. Примечание. Если ожидается, что объем данных через три года вообще не достигнет этого уровня, пожалуйста, не разделяйте базу данных и таблицу при создании таблицы.
-
[Ссылка] Соответствующая длина хранения символов не только экономит место в таблице базы данных и хранилище индексов, но, что более важно, повышает скорость поиска.
снижение индекса
-
[Обязательно] Поле с уникальными характеристиками в бизнесе, даже если оно представляет собой комбинацию нескольких полей, должно быть встроено в уникальный индекс.
Примечание: Не думайте, что уникальный индекс влияет на скорость вставки. Эту потерю скорости можно игнорировать, но очевидно, что она улучшает скорость поиска. Кроме того, даже если на прикладном уровне осуществляется очень совершенный контроль проверки, т.к. пока нет уникального индекса, согласно закону Мерфи должны быть сгенерированы грязные данные. -
[Обязательно] Регистрация запрещена для более чем трех столов. Типы данных полей, которые необходимо объединить, должны быть абсолютно согласованными; если с запросом связано несколько таблиц, убедитесь, что связанные поля должны иметь индексы.
Примечание. Обратите внимание на индексы таблиц и производительность SQL даже при объединении двойных таблиц. -
[Обязательно] При создании индекса для поля типа varchar необходимо указать длину индекса.Необязательно создавать индекс для всего поля.Длину индекса можно определить в соответствии с фактической дискриминацией текста.
Примечание: длина индекса и степень различения являются парой противоречий.Как правило, для данных строкового типа индекс с длиной 20 имеет степень различения более 90 %.Вы можете использовать count(distant left (имя столбца, длина индекса))/ Определяется дискриминация count(*). -
[Ссылка] Избегайте следующих крайних недоразумений при создании индексов:
1) Лучше не хватать. Думайте, что запрос должен построить индекс.
2) Скорее недостаток, чем злоупотребление. Считается, что индексы занимают место и сильно замедляют обновления и новые добавления.
3) Сопротивление уникальным индексам. Считается, что уникальность бизнеса нужно решать методом «сначала проверить, а потом вставить» на прикладном уровне.
Оператор SQL
-
[Обязательно] Не используйте count(имя столбца) или count(константа) вместо count(*), count(*) определяется SQL92 Стандартный синтаксис для подсчета строк не зависит от базы данных, NULL и не-NULL.
Описание: count(*) будет подсчитывать строки со значениями NULL, а count(имя столбца) не будет подсчитывать строки со значениями NULL в этом столбце. -
[Обязательный] count(различный столбец) вычисляет количество уникальных строк, кроме NULL в этом столбце. Обратите внимание, что count(di col1, col2) возвращает 0, если один из столбцов полностью равен NULL, даже если другой столбец имеет другие значения.
-
[Обязательный] Когда все значения столбца равны NULL, результат возврата count(col) равен 0, но результат возврата sum(col) равен NULL.
-
[Обязательно] Внешние ключи и каскады не должны использоваться, и все концепции внешних ключей должны разрешаться на прикладном уровне.
-
[Обязательно] Использование хранимых процедур запрещено.Хранимые процедуры трудно отлаживать и расширять, и они не переносимы.
-
[Рекомендация] Избегайте срабатывания, если его можно избежать.Если этого нельзя избежать, вам необходимо тщательно оценить количество элементов набора позади и контролировать его в пределах 1000.
-
[Справка] Если есть необходимость в глобализации, все символы хранятся и представляются в кодировке utf-8.Обратите внимание на разницу между символами.
Описание: SELECT LENGTH("Легкая работа"); Возвращается 12 SELECT CHARACTER_LENGTH("Легкая работа"); Возвращается 4 Если вам нужно хранить выражения, то выбирайте для хранения utfmb4, обратите внимание на разницу между ним и - 8 кодировка. -
[Обязательно] При обновлении записи таблицы данных значение поля update_time, соответствующее записи, должно обновляться одновременно с текущим временем.
-
[Ссылка] Не злоупотребляйте транзакциями @Transactional. Транзакции будут влиять на QPS базы данных.Кроме того, при использовании транзакций следует учитывать различные схемы отката, включая откат кэша, откат поисковой системы, компенсацию сообщений и статистическую коррекцию.