Количество и типы нестандартных кодов во внутреннем проекте Java, которые должны быть открыты, подсчитываются Данные конфиденциальны и неудобны для раскрытия. Но о самых частых видах неровностей можно сказать.
Ранее я сам поделился спецификацией кода.Я пытался угадать, какие проблемы со спецификацией кода могут возникнуть, но не смог решить проблему путем угадывания.Я просканировал его внутренним плагином проекта, и посчитал все проблемы кода следующим образом .
Проблемы со спецификацией кода
название
Самая распространенная проблема, все проблемы с именами в спецификации кода были сделаны.
1 Имена пакетов должны быть строчными
[Обязательно] Все имена пакетов написаны строчными буквами, и между точками-разделителями есть только одно английское слово с естественной семантикой. Имя пакета использует форму единственного числа единообразно, но если имя класса имеет значение множественного числа, имя класса может использовать форму множественного числа. Положительный пример: имя пакета класса инструмента приложения — com.alibaba.ai.util, а имя класса — MessageUtils (это правило относится к структуре фреймворка Spring)
2 Имя не может начинаться с _ или $
Ни одно из имен в коде не может начинаться или заканчиваться символом подчеркивания или знаком доллара.
Пример счетчика: __name / $name
3 Имена классов используют стиль UpperCamelCase
[Обязательно] Используйте имя класса в стиле ExperturecamelCase, но следующие исключительные обстоятельства: DO / BO / DTO / VO / AO /
PO/UID и т.д.
Положительный пример: MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion.
Пример счетчика: macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion
4 Имя метода не использует стиль LowerCamelCase.
[Обязательно] Имена методов, имена параметров, переменные-члены и локальные переменные используют стиль lowerCamelCase, который должен следовать за верблюжьим регистром. Положительный пример: localValue/getHttpMessage()/inputUserId
5 Имена констант должны быть все в верхнем регистре и разделены символами подчеркивания.
[Обязательно] Все имена констант в верхнем регистре, слова разделены символом подчеркивания, смысловое выражение должно быть полным и ясным, а имена не должны быть слишком длинными.
Положительный пример: MAX_STOCK_COUNT Отрицательный пример: MAX_COUNT
6 Имена абстрактных классов должны начинаться с Abstract или Base
[Обязательно] Имя абстрактного класса начинается с Abstract или Base, имя класса исключения заканчивается на Exception, тестовый класс
Именование начинается с имени тестируемого класса и заканчивается Test.
7 Логическая переменная Pojo, не добавляйте префикс IS
[Принудительно] Булева переменная типа класса POJO, не добавляйте префикс, иначе устраните причину ошибки сериализации фреймворка. Анти Пример: определяется как базовые типы данных Boolean свойство isDeleted, что метод также isDeleted (), кадр RPC при обратном анализе, "ошибка" удаляется в соответствии с именами атрибутов, приобретение атрибута не вызывает, в свою очередь выбрасывается .
постоянное определение
1 мана
[Обязательно] Не позволяйте никаким магическим значениям (т. е. не предопределенным константам) появляться непосредственно в коде.
Пример счетчика:
String key = "Id#taobao_" + tradeId;
cache.put(key, value);
2 значения типа Long, оканчивающиеся на заглавную букву L
[Обязательно] При присвоении значения типу long или long используйте после значения прописную букву L, а не строчную l. Строчную букву легко спутать с цифрой 1, что приведет к недопониманию. Объяснение: Long a = 2l; Записывается ли 21 как число или 2 как Long?
3 Не храните все константы в одном классе
[Рекомендация] Не используйте один класс констант для поддержки всех констант, а классифицируйте их в соответствии с их функциями и обслуживайте отдельно. Описание: большой и всеобъемлющий класс констант неорганизован, и измененную константу можно найти только с помощью функции поиска, что не способствует пониманию и обслуживанию.
Положительный пример: константы, связанные с кэшем, помещаются в класс CacheConsts, константы, связанные с конфигурацией системы, помещаются в класс ConfigConsts.
4 Вы должны вызывать equals с константой или содержимым подтвержденного значения
[Обязательный] Метод equals объекта склонен генерировать исключения нулевого указателя.Вы должны использовать константы или объекты с определенными значениями для вызова equals.
Положительный пример: "test".equals(object);
Пример счетчика: object.equals("test");
Описание: рекомендуется использовать java.util.Objects#equals (класс инструментов, представленный JDK7).
формат кода
1 Строки кода слишком длинные
[Рекомендуется] Общее количество строк для одного метода не превышает 80 строк. Количество допустимых строк кода составляет около 40 строк.
инструкция:Включение подписей способа, концевые скобки, внутренний код, аннотация, пустая строка, возврат каретки и не более 80
Ряд.
Положительный пример: логика кода различает красные цветы и зеленые листья, индивидуальность и общность, а логика зеленого листа выделяется как дополнительный метод, чтобы сделать основной код более понятным; извлечение общей логики становится общим методом, который легко переиспользовать и поддерживать.
2 Кодировка файлов неоднородна
[Обязательно] Для кодировки текстового файла в среде IDE установлено значение UTF-8; символ новой строки файла в среде IDE использует формат Unix, а не формат Windows.
Обработка коллекции
1 При инициализации коллекций, таких как HashMap, попробуйте указать начальный размер значения
[Рекомендуется] При инициализации коллекции укажите начальный размер коллекции. Описание: HashMap инициализируется с помощью HashMap(int initialCapacity).
Положительный пример: initialCapacity=(количество сохраняемых элементов/коэффициент загрузки) + 1. Обратите внимание, что коэффициент загрузки (т.е. loaderfactor) по умолчанию равен 0,75.Если начальное значение временно не может быть определено, установите его на 16 (т.е. значение по умолчанию).
Встречный пример: HashMap нужно разместить 1024 элемента, так как начальный размер емкости не задан, по мере увеличения элементов емкость вынуждена расширяться в 7 раз, а при изменении размера необходимо перестроить хеш-таблицу, что серьезно влияет представление.
2 способа перемещения по карте
【рекомендовать】Используйте entrySet для обхода коллекции классов Map KV., вместо обхода метода keySet.
Описание: keySet фактически обходит два раза, один раз превращает Iterator в объекты, а один раз вынимает из него ключ, соответствующий значению hashMap. EntrySet, только что пересекший ключ и значение, помещается в запись с более высокой эффективностью. Если JDK8, используйте метод Map.foreach. Положительный пример: values () Возвращает значение V установлено, список представляет собой набор объектов; keySet () Возвращает значение K установлено, это
Объект Set; entrySet() возвращает набор комбинаций значений K-V.
оператор управления
1 Количество слоев управления не должно быть слишком большим
При выражении аномальных ветвей меньше используйте метод if-else, этот метод можно переписать
if (condition) {
...
вернуть объект;
}
Если вы не используете if () ... else if () ... else ... метод экспресс-логики, избегайте последующих трудностей обслуживания, не превышайте 3 этажа.
Логический код суждения более 3 слоев IF-ELSE может быть, например, Sagiter:
public void today() {
если (занято()) {
System.out.println («время изменения»);
вернуться;
}
если (бесплатно()) {
System.out.println(“отправиться в путешествие.”);
Возвращение;
}
System.out.println(“Оставайтесь дома, чтобы изучить рекомендации Alibaba по кодированию Java.”);
вернуться;
}
2 Не используйте сложные выражения в условиях
[Рекомендация] В дополнение к обычным методам (таким как getXxx/isXxx) не выполняйте другие сложные операторы в условной оценке и назначайте результат сложной логической оценки осмысленному логическому имени переменной для улучшения удобочитаемости. Объяснение: Логика многих операторов if довольно сложна. Читатель должен проанализировать окончательный результат условного выражения, чтобы определить, какое условие для выполнения какого типа оператора. Затем, что, если читатель неправильно анализирует логическое выражение? Положительный пример:
// Псевдокод выглядит следующим образом
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
Пример счетчика:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
...
}
3 если в операторе отсутствуют фигурные скобки
[Обязательно] Фигурные скобки должны использоваться в операторах if/else/for/while/do. Даже если имеется только одна строка кода, избегайте однострочного кодирования: операторы if (условие);
Спецификация аннотации
1 Используйте комментарии в конце строки
[Обязательно] Однострочный комментарий внутри метода, начинайте новую строку над закомментированным оператором и используйте // комментарий. Многострочные комментарии внутри методов Используйте /* */ комментарии, обратите внимание на выравнивание с кодом.
2 Отсутствует информация об авторе
[Обязательно] Все классы должны указывать создателя и дату создания.
@author
@date
3 Использование комментариев Javadoc
[Обязательно] Комментарии к классам, атрибутам классов и методам классов должны использовать спецификацию Javadoc, используйте /*содержание/, метод // xxx не должен использоваться.
Примечание: В окне редактирования IDE метод Javadoc предложит соответствующие комментарии, и сгенерированный Javadoc может правильно выводить соответствующие комментарии; в IDE, когда проект вызывает метод, значение метода, параметров и возвращаемого значения может быть изменено. быть приостановлено без входа в метод, повышая эффективность чтения.
8 Своевременно очищайте сегменты кода или информацию о конфигурации, которые больше не используются.
[Рекомендуется] Своевременно очищайте сегменты кода или конфигурации, которые больше не используются.
Примечание. В случае ненужного кода или устаревшей конфигурации решительно очистите их, чтобы избежать чрезмерно раздутых программ и избыточного кода.
Положительный пример: для фрагментов кода, которые временно закомментированы и могут быть использованы позже, над закомментированным кодом единообразно указываются три косые черты (///), описывающие причину закомментированного кода.
4 В параметре метода отсутствуют комментарии javadoc
[Обязательно] Все абстрактные методы (включая методы в интерфейсах) должны быть аннотированы с помощью Javadoc.Помимо возвращаемых значений, параметров и описаний исключений, они также должны указывать, что делает метод и какие функции он реализует.
Описание: Требования к реализации подклассов или меры предосторожности при вызове объясните вместе.
5 В полях перечисления отсутствуют аннотации
[Обязательно] Все поля типа перечисления должны иметь комментарии, описывающие назначение каждого элемента данных.
разное
1 Для соединения строк в теле цикла используется метод StringBuilder.
[Рекомендуется] В теле цикла используйте метод append StringBuilder, чтобы расширить метод соединения строк. Примечание. В следующем примере декомпилированный файл байт-кода показывает, что каждый цикл создает новый объект StringBuilder, затем выполняет операцию добавления и, наконец, возвращает объект String с помощью метода toString, что приводит к пустой трате ресурсов памяти.
Пример счетчика:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
2 показать создание пула потоков
[Обязательные] Ресурсы потока должны быть предоставлены пулом потока, не позволяйте себе явно создавать потоки в приложении.
Описание: Преимущество использования пула потоков заключается в сокращении затрат времени на создание и уничтожение потоков и накладных расходов системных ресурсов, а также решении проблемы нехватки ресурсов. Если пул потоков не используется, это может привести к тому, что система создаст большое количество потоков одного типа, что может привести к потреблению памяти или "чрезмерному переключению".
3 Длина списка параметров слишком велика
[Обязательно] Один и тот же тип параметра и одно и то же значение для бизнеса могут использовать только переменные параметры Java и избегать использования объекта. Описание: Переменные параметры должны быть помещены в конец списка параметров. (Студентам рекомендуется как можно меньше использовать программирование с переменными параметрами) Положительный пример: public List listUsers(String type, Long... ids) {...}
4 Несколько параметров для переноса
Если для нескольких параметров в вызове метода требуется разрыв строки, сделайте это после запятой.
5 Проблемы с переадресацией
[Ссылка] Используйте вперед для внутреннего перенаправления сервера; используйте класс инструмента сборки URL-адреса для генерации внешнего адреса перенаправления, в противном случае он приведет к непоследовательному обслуживанию URL и потенциальные риски безопасности.
Наконец
Выше приведены наиболее распространенные проблемы при написании кода и решения, предлагаемые в спецификации кода.