Программная инженерия Андрей Дмитриев andrei-dmitriev@yandex.ru ©2009.

Презентация:



Advertisements
Похожие презентации
Изучение динамического определения типов. Класс Class. Динамическая загрузка и инстанцирование классов. В Java вся информация о классе хранится в специальном.
Advertisements

Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Типы данных Инна Исаева. Переменные Переменная - это как ящик, в котором можно хранить данные. Каждая переменная имеет своё имя, она служит для хранения.
Test 6 Вопрос 1. Как можно уничтожить объект в Java? a)присвоить null всем ссылкам на объект b)вызвать Runtime.getRuntime().gc() c)вызвать метод finalize()
Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Ассоциативные списки Поиск данных происходит не по индексу или положению объекта, а по его ассоциативной связи: public interface Map { // Доступ к объектам.
Программная инженерия Андрей Дмитриев ©
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Платформа J2EE Сервис: Java Naming Directory (JNDI) – универсальный сервис хранения объектов в иерархической структуре имен (аналогично файловой системе)
Java: интерфейсы, наследование, обработка исключительных ситуаций Вашенков Олег Евгеньевич.
Лекция 2 Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Встроенная документация Java Андрей Дмитриев Инженер-программист Sun Microsystems Февраль 2008.
Исключительные ситуации. Схема обработки исключений Try { //охраняемый блок trow (new MyException();) } catch(MyExeption e) { … } catch(Exeption e){ …
b5_java_s4
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Транксрипт:

Программная инженерия Андрей Дмитриев ©2009

Качество кода

План Читаемость Ясность Дизайн Производительность(?)

4 Как давать имена Code Conventions for the Java

5 Доступ к другому коду Классы: package Атрибуты: private Методы: private, package Методы: final Внутренние классы: static Излишние модификаторы в интерфейсах Y public interface Интерфейс { A public static final String КОРЕНЬ = "root"; Ţ... у }

6 Избегайте замещения переменных public class Named { public Named() { name = "Имя"; } public void showName() { String name = "Другое имя"; System.out.println("Name: " + name); // напечатает "Name: Другое имя" } private String name; // заменить на myName }

7 Import выражения Избегайте import javax.swing.*; Удаляйте неиспользованные импорты Убирайте ненужные импорты из одного пакета

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 Работа со строками: 2/2 Два объекта вместо одного String s = new String("строка"); разумнее String s = "строка"; Используйте StringBuilder вместо StringBuffer быстрее на 37%

10 Использование общего ресурса Класс A Класс B Общий ресурс

11 Общий ресурс: первое решение public synchronized Ресурс дай Ресурс() { if (общий Ресурс == null) { общий Ресурс = new Ресурс(); } return общий Ресурс; } private static Ресурс общий Ресурс;

12 Общий ресурс: второе решение public Ресурс дай Ресурс() { return ОБЩИЙ_РЕСУРС; } private static final Ресурс ОБЩИЙ_РЕСУРС = new Ресурс();

13 Общий ресурс: оптим. решение public class Класс { public Ресурс дай Ресурс() { return Ресурс Хранилище.ОБЩИЙ_РЕСУРС; } private static class Ресурс Хранилище { static final Ресурс ОБЩИЙ_РЕСУРС = new Ресурс(); }

14 Обработка исключений Не ловите просто Exception } catch (Exception e) {... } Не игнорируйте исключения try {... } catch (IOException e) { /* пусто */ } Не кидайте просто Exception public void method(...) throws Exception {... }

15 Длина метода и размер класса Методы: не более 20 – 50 строк Классы: не более 300 – 500 строк

16 Аргументы, строки и прочее Длина строки не более 60 – 80 символов Количество аргументов не более 5 – 7 Выделяйте сложный код в отдельный метод Используйте несинхронизированные классы ArrayList вместо Vector StringBuilder вместо StringBuffer только если работаете в одном потоке !

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 Булевские значения в условиях if (isStudent()) { return true; }else { return false; } короче return isStudent();

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 Типизация в списках, множествах,... Вот такой код 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 while vs. for List студенты = деканат.список Студентов(); while (студенты.hasNext()) { Студент студент = студенты.next();... } for (Студент студент : деканат.список Студентов()) {... } нагляднее

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 Утилиты и предупреждения Утилитные классы public final class Utility { private Utility() {} //перекрыть возможность создания класса... } Пишите чистый код deprecation warnings unchecked cast warnings

24 Константы в интерфейсах Данные должны жить в классах public interface Constants { String DISPLAY_NAME = "display-name"; String ROOT_FOLDER = "root-folder"; String TOOLTIP = "tooltip"; String ICON = "icon"; }

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 Сложная логика if (messageReference != null) { Message message = messageReference.get(); if (message != null) { Collection parts = message.getParts(); if (parts != null && !parts.isEmpty()) {... }

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 Неожиданный null Не возвращайте null, если ожидается list / map / array private List список Отличников() { if (файл == null) { return null; // рекомендуется вернуть } // java.util.Collections.EMPTY_LIST... }

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 if... if... if... fi if (должность == АССИСТЕНТ) { return new Ассистент(...); } if (должность == СТ_ПРЕПОДАВАТЕЛЬ) { return new Ст Преподаватель(...); } if (должность == ДОЦЕНТ) { return new Доцент(...); } if (должность == ПРОФЕССОР) { return new Профессор(...); } return null;

31 Дублирование кода Добавьте новый метод (с параметром) Добавьте новый (абстрактный) класс

32 Замена switch полиморфизмом: 1/3 public enum ТИП { СТУДЕНТ, АСПИРАНТ, ПРЕПОДАВАТЕЛЬ } public class Сессия { public void напечатать Результаты(Персона персона) { System.out.println(Результаты текущей сессии) ТИП тип = персона.дай Тип(): switch (тип) { case СТУДЕНТ: // оценки за сданные экзамены и зачеты case АСПИРАНТ: // оценки за сданный кандидатский минимум case ПРЕПОДАВАТЕЛЬ: // оценки за принятые экзамены } System.out.println(Составлен: + получить ТекВремя()); }

33 Замена switch полиморфизмом: 2/3 abstract class Персона { public abstract void напечатать РезультатыСессии(); } class Студент extends Персона { public void напечатать РезультатыСессии() { // оценки за сданные экзамены и зачеты } class Аспирант extends Персона { public void напечатать РезультатыСессии() { // оценки за сданный кандидатский минимум }

34 Замена switch полиморфизмом: 3/3 class Преподаватель extends Персона { public void напечатать РезультатыСессии() { // оценки за принятые экзамены } public class Сессия { public void напечатать Результаты(Персона персона) { System.out.println(Результаты текущей сессии) персона.напечатать РезультатыСессии(); System.out.println(Составлен: + получить ТекВремя()); }

Q&A

Спасибо! Андрей Дмитриев ©2009