Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемЕвгения Савелова
1 Программная инженерия Андрей Дмитриев ©2009
2 Качество кода
3 План Читаемость Ясность Дизайн Производительность(?)
4 4 Как давать имена Code Conventions for the Java
5 5 Доступ к другому коду Классы: package Атрибуты: private Методы: private, package Методы: final Внутренние классы: static Излишние модификаторы в интерфейсах Y public interface Интерфейс { A public static final String КОРЕНЬ = "root"; Ţ... у }
6 6 Избегайте замещения переменных public class Named { public Named() { name = "Имя"; } public void showName() { String name = "Другое имя"; System.out.println("Name: " + name); // напечатает "Name: Другое имя" } private String name; // заменить на myName }
7 7 Import выражения Избегайте import javax.swing.*; Удаляйте неиспользованные импорты Убирайте ненужные импорты из одного пакета
8 8 Работа со строками: 1/2 Не используйте сложение String в циклах String numbers = new String(); for (int i=0; i < ; i++) { numbers += i; } // 2000 секунд гораздо быстрее StringBuffer buffer = new StringBuffer(); for (int i=0; i < ; i++) { buffer.append(i); } // 4 секунды String numbers = buffer.toString();
9 9 Работа со строками: 2/2 Два объекта вместо одного String s = new String("строка"); разумнее String s = "строка"; Используйте StringBuilder вместо StringBuffer быстрее на 37%
10 10 Использование общего ресурса Класс A Класс B Общий ресурс
11 11 Общий ресурс: первое решение public synchronized Ресурс дай Ресурс() { if (общий Ресурс == null) { общий Ресурс = new Ресурс(); } return общий Ресурс; } private static Ресурс общий Ресурс;
12 12 Общий ресурс: второе решение public Ресурс дай Ресурс() { return ОБЩИЙ_РЕСУРС; } private static final Ресурс ОБЩИЙ_РЕСУРС = new Ресурс();
13 13 Общий ресурс: оптим. решение public class Класс { public Ресурс дай Ресурс() { return Ресурс Хранилище.ОБЩИЙ_РЕСУРС; } private static class Ресурс Хранилище { static final Ресурс ОБЩИЙ_РЕСУРС = new Ресурс(); }
14 14 Обработка исключений Не ловите просто Exception } catch (Exception e) {... } Не игнорируйте исключения try {... } catch (IOException e) { /* пусто */ } Не кидайте просто Exception public void method(...) throws Exception {... }
15 15 Длина метода и размер класса Методы: не более 20 – 50 строк Классы: не более 300 – 500 строк
16 16 Аргументы, строки и прочее Длина строки не более 60 – 80 символов Количество аргументов не более 5 – 7 Выделяйте сложный код в отдельный метод Используйте несинхронизированные классы ArrayList вместо Vector StringBuilder вместо StringBuffer только если работаете в одном потоке !
17 17 Освобождайте ресурсы Пример: класс Stack public Object pop() { if (myLast < 0) throw new IllegalArgumentException(); return myElements[myLast--]; } public Object pop() { if (myLast < 0) throw new IllegalArgumentException(); Object value = myElements[myLast]; myElements[myLast--] = null; return value; } правильнее
18 18 Булевские значения в условиях if (isStudent()) { return true; }else { return false; } короче return isStudent();
19 19 Ссылки на объект Используйте интерфейсы вместо классов private ArrayList list = new ArrayList(); public void calculate(LinkedList list) {... } public Vector construct() {... } решение private List list = new ArrayList(); public void calculate(List list) {... } public List construct() {... }
20 20 Типизация в списках, множествах,... Вот такой код private List list = new ArrayList(); public int calculate(Map map) {... } public Set constructSet() {... } следует заменить на private List list = new ArrayList (); public int calculate(Map map) {... } public Set constructSet() {... }
21 21 while vs. for List студенты = деканат.список Студентов(); while (студенты.hasNext()) { Студент студент = студенты.next();... } for (Студент студент : деканат.список Студентов()) {... } нагляднее
22 22 Создание новых объектов вариант с конструктором Boolean b = new Boolean(false); Integer i = new Integer(10); Long l = new Long( l); замените на константы или статические вызовы Boolean b = Boolean.FALSE; Integer i = Integer.valueOf(10); Long l = Long.valueOf( L);
23 23 Утилиты и предупреждения Утилитные классы public final class Utility { private Utility() {} //перекрыть возможность создания класса... } Пишите чистый код deprecation warnings unchecked cast warnings
24 24 Константы в интерфейсах Данные должны жить в классах public interface Constants { String DISPLAY_NAME = "display-name"; String ROOT_FOLDER = "root-folder"; String TOOLTIP = "tooltip"; String ICON = "icon"; }
25 25 Стиль написания и логика Пишите на новой строке с фигурными скобками if (name == null) return false; удобнее if (name == null) { return false; } Умеренно расставляйте скобки return (ref != null) && (ref.get() != null); return (booleanValue) ?... return (item == variable); if ((name == null) || (name == null))...
26 26 Сложная логика if (messageReference != null) { Message message = messageReference.get(); if (message != null) { Collection parts = message.getParts(); if (parts != null && !parts.isEmpty()) {... }
27 27 Сложная логика: решение if (messageReference == null) { return null; } Message message = messageReference.get(); if (message == null) { return null; } Collection parts = message.getParts(); if (parts == null || parts.isEmpty()) { return null; }...
28 28 Неожиданный null Не возвращайте null, если ожидается list / map / array private List список Отличников() { if (файл == null) { return null; // рекомендуется вернуть } // java.util.Collections.EMPTY_LIST... }
29 29 if... else if... else if... fi Лишние ветви else if (должность == АССИСТЕНТ) { return new Ассистент(...); } else if (должность == СТ_ПРЕПОДАВАТЕЛЬ) { return new Ст Преподаватель(...); } else if (должность == ДОЦЕНТ) { return new Доцент(...); } else if (должность == ПРОФЕССОР) { return new Профессор(...); } else { return null; }
30 30 if... if... if... fi if (должность == АССИСТЕНТ) { return new Ассистент(...); } if (должность == СТ_ПРЕПОДАВАТЕЛЬ) { return new Ст Преподаватель(...); } if (должность == ДОЦЕНТ) { return new Доцент(...); } if (должность == ПРОФЕССОР) { return new Профессор(...); } return null;
31 31 Дублирование кода Добавьте новый метод (с параметром) Добавьте новый (абстрактный) класс
32 32 Замена switch полиморфизмом: 1/3 public enum ТИП { СТУДЕНТ, АСПИРАНТ, ПРЕПОДАВАТЕЛЬ } public class Сессия { public void напечатать Результаты(Персона персона) { System.out.println(Результаты текущей сессии) ТИП тип = персона.дай Тип(): switch (тип) { case СТУДЕНТ: // оценки за сданные экзамены и зачеты case АСПИРАНТ: // оценки за сданный кандидатский минимум case ПРЕПОДАВАТЕЛЬ: // оценки за принятые экзамены } System.out.println(Составлен: + получить ТекВремя()); }
33 33 Замена switch полиморфизмом: 2/3 abstract class Персона { public abstract void напечатать РезультатыСессии(); } class Студент extends Персона { public void напечатать РезультатыСессии() { // оценки за сданные экзамены и зачеты } class Аспирант extends Персона { public void напечатать РезультатыСессии() { // оценки за сданный кандидатский минимум }
34 34 Замена switch полиморфизмом: 3/3 class Преподаватель extends Персона { public void напечатать РезультатыСессии() { // оценки за принятые экзамены } public class Сессия { public void напечатать Результаты(Персона персона) { System.out.println(Результаты текущей сессии) персона.напечатать РезультатыСессии(); System.out.println(Составлен: + получить ТекВремя()); }
35 Q&A
36 Спасибо! Андрей Дмитриев ©2009
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.