КОД 1. Использование констант вместо вместо захардкоданых значений. Если константа используется по всему приложению, то ее определяют в отдельном классе (например: com.epam.resources.Constants). Если же данная строка используется только в данном классе то ее можно определить здесь же. Константы содержат только символы верхнего регистра. public static final String CONSTSTRING1 =“PARAMETER1”; 2. Структура пакетов должна быть согласно направления приложения и фирмы-разработчика. Первый пакет либо com либо код страны ru, by, es, fr, en … дальше пакет с названием фирмы разработчика epam, sun, carefirst … потом может идти разделение по бизнес направлению insuarance, auto, finance… пакет с названием приложения client, broker… и внутри уже приложение разбивается на пакеты database, resources, utils, model и т.д. Названия пакетов содержат только символы нижнего регистра. 3. Названия переменных, методов, классов, HTML страниц, JSP должны точно указывать на предназначение данной сущности что облегчит в будущем поддержку данного приложения. Избегать использования сокращений и аббревиатур типа aaa, bbb, getCr… 4. Любой повторяющийся код классов и JSP должен быть вынесен в отдельные вспомогательные методы, классы, страницы, для избежания эффекта copy & paste, после чего затруднена поддержка общей функциональности. 5. Стили и Javascript код должны быть вынесены в отдельные файлы css, js , которые кэшируются браузером, тем самым уменьшая объем передаваемой страницы и повышая возможность поддержки кода в дальнейшем. 6. Проверка на пустую строку должна осуществляться с помощью функции str.length() = = 0 а не str.equals(“”). Для избавления от лишней проверки на null в случаях if(str != null && str.equals(“test”)){ … } Переменную поменять местами с константой: if(“test”.equals(str)){ … } 7. Использовать конструкции if … else в случаях использования многократных проверок типа: if(VALUE.equals(name)){ … }else if(VALUE1.equals(name)){ … }else if(VALUE2(name)){ … } 8. Одиночные операнды также должны быть заключены в фигурные скобки if(n == 0){ a++; } 9. Код типа: String path1 = getServlet().getServletConfig().getServletContext().getRealPath(“ 1.txt”); String path2 = getServlet().getServletConfig().getServletContext().getRealPath(“ 2.txt”); int version = getServlet().getServletConfig().getServletContext().getMinorVersi on(); должен быть переработан в вид: ServletContext servletContext = getServlet() .getServletConfig().getServletContext(); String path1 = servletContext.getRealPath(“1.txt”); String path2 = servletContext.getRealPath(“2.txt”); int version = servletContext.getMinorVersion(); Причем значения которые не изменяются во время работы приложения такие как например realPath должны вычисляться один раз и вынесены в статические переменные. 10. Не использовать вызов многих методов в одной строке, что затрудняет нахождение проблемы. 11. При складывании строк в цикле использовать StringBuffer вместо String String s = ""; for (int i = 0; i < count; i++) { s += array[i]; } return s; Использовать StringBuffer sb = new StringBuffer(estimatedCount); for (int i = 0; i < count; i++) { sb.append(array[i]); } return sb.toString(); 12. При использовании JDBC Connections, Statements должны быть закрыты: Connection con = null; PreparedStatement preparedstatement = null; Resultset resultset = null; try { con = db.getConnection(true); preparedstatement = con.prepareStatement("SELECT xxx resultset = preparedstatement.executeQuery(); … } catch (Exception e) { // Do error handing here } finally { if (resultset != null) try { resultset.close(); } catch (SQLException e) {} if (preparedstatement != null) try { preparedstatement.close(); } catch (SQLException e) {} if (con != null){ db.releaseConnection(con); } } WHERE ID = ?"); 13. Все места в коде, которые требуют разъяснений, должны иметь комментарии. 14. Старый код должен быть удален. 15. Проверки значений web приложения, которые не требуют серверной обработки, должны осуществляться на клиентской стороне посредством JavaScript. Сообщения об ошибках должны точно указывать на проблему и формат вводимых данных на той же самой странице редактирования. Confirmation также должен содержать недвусмысленный текст так например вопрос Are you sure? не содержит основания вопроса. 16. Страницы редактирования данных должны содержать кнопки Cancel в то время как простой просмотр информации для возвращения на предыдущую страницу должен содержать кнопки Back. Back должен обрабатываться на серверной стороне избегая использование history.back. XML Названия элементов XML не должны содержать данные самого XML. Избегать ненужных вложенностей. <shop> <products> <product>…</product> … <product>…</product> </products> </shop> XSD Правила для элементов, атрибутов XML должны задаваться как можно точнее, избегая тем самым возможности на ошибку пользователя. Стараться описывать типы отдельно избегая большой вложенности XSD элементов. Парсеры Для SAX парсеров использовать общий подход через использование XMLReader. XSL Использовать класс Templates вместо Transformer для одноразовой загрузки XSL, тем самым увеличивая производительность приложения. Struts Вместо Action использовать DispatchAction и другие варианты класса Action. Избегать использование глобальных переменных в классах Action. Группировать функциональность для сущности в одном классе Action и ActioForm. Логирование Использовать не System.out.println а либо log4j либо commons библиотеку. Для вывода информации с использованием конкатенаций строк и вызовов методов использовать проверку на включенность уровня логирования. if (log.isDebugEnabled()) { log.debug("generating message for " + trap.getAlertMail()); }