837.03K

Кодирование ПО. Лекция 10

1.

Кодирование ПО
Лекция 10
Тема 3: Кодирование ПО
1

2.

Кодирование ПО
Кодирование – процесс
написания программного кода с целью
реализации определённого алгоритма на
определённом языке программирования
Результат = файлы с исходными текстами
программ, написанными на языке
программирования
Далее эти файлы будут компилироваться
или интерпретироваться
3

3.

Структурное программирование
Структурное программирование –
методология разработки программного
обеспечения, в основе которой лежит
представление программы в виде
иерархической структуры блоков
В соответствии с данной методологией
любая программа строится без
использования оператора goto из трёх
базовых управляющих структур:
последовательность, ветвление, цикл,
кроме того, используются подпрограммы
5

4.

Структурное программирование
Цель структурного программирования –
повысить производительность труда
программистов при разработке ПО,
сократить число ошибок, упростить отладку,
модификацию и сопровождение ПО
7

5.

Теорема о СП
Программа – совокупность операторов с заданной
последовательностью выполнения
Любая программа, заданная в виде блок-схемы, имеющая
единственные операторы начала и конца, может быть
представлена в виде структурированной программы,
состоящей только из трех базисных управляющих
структур:
последовательность — обозначается: f THEN g,
ветвление — обозначается: IF p THEN f ELSE g,
цикл — обозначается: WHILE p DO f,
где f, g — блок-схемы с одним входом и одним выходом
(могут быть структурными программами),
р — условие,
THEN, IF, ELSE, WHILE, DO — ключевые слова
8

6.

Принципы СП (1/4)
1. Следует отказаться от использования оператора
безусловного перехода goto
2. Любая программа строится из трёх базовых
управляющих конструкций: последовательность,
ветвление, цикл
Последовательность – однократное выполнение
операций в том порядке, в котором они записаны в
тексте программы
Ветвление – однократное выполнение одной из двух
или более операций, в зависимости от выполнения
заданного условия
Цикл – многократное исполнение одной и той же
операции до тех пор, пока выполняется заданное
условие
9

7.

Принципы СП (2/4)
3. В программе базовые управляющие конструкции
могут быть вложены друг в друга произвольным
образом. Никаких других средств управления
последовательностью выполнения операций не
предусматривается
4. Повторяющиеся фрагменты программы можно
оформить в виде подпрограмм (процедур и функций).
Кроме того, логически целостные фрагменты
программы (даже если они не повторяются) можно
оформить в виде подпрограмм
10

8.

Принципы СП (3/4)
5. Каждую логически законченную группу инструкций
следует оформить как блок. Блоки являются основой
структурного программирования.
Блок – это логически сгруппированная часть
исходного кода – набор инструкций, записанных
подряд в исходном коде программы.
следует обращаться как к единой инструкции
служат для ограничения области видимости переменных и
функций
могут быть пустыми
могут быть вложенными один в другой
Границы строго определены begin-end, {} , <>
11

9.

Принципы СП (4/4)
6. Все перечисленные конструкции должны иметь один
вход и один выход
Получаем возможность построения произвольных
алгоритмов любой сложности с помощью простых и
надежных механизмов
7. Разработка программы ведётся пошагово, методом
«сверху вниз»
12

10.

Метод сверху-вниз
1.
Общая структура программы с
подпрограммами - «заглушками»
(удовлетворяют интерфейсу, неполный функционал)
2.
3.
4.
Проверка программы и постепенная
доработка «заглушек» (рекурсивно)
Реализованная часть программы работает
верно по отношению к более низкому
уровню (нет переработки кода)
Окончание, когда нет заглушек
13

11.

Метод сверху-вниз
Гарантия верности программы на всех
этапах разработки
Простота поиска места внесения
изменений
Изоляция изменений и ошибок
17

12.

Подпрограмма
Оптимизация кода программ по объему
занимаемой памяти – сокращение
повторений кода
Логическое выделение целостной
подзадачи, имеющей типовое решение
Структуризация кода программы с целью
удобства понимания и сопровождения
18

13.

Достоинства СП
Легкость понимания кода программ
Возможность разработки коллективом
разработчиков
Простота внесения изменений и сопровождения
Простота тестирования и отладки программ
Сокращение числа вариантов построения
программ по заданным внешним спецификациям
Легкость отображения алгоритма программы
Простота кодирования формальных вычислений
19

14.

Стиль программирования
Стиль программирования – набор приемов,
правил и соглашений, используемых при
написании исходного кода программ с целью
получения правильных, удобных для
сопровождения и использования программ
Общий стиль = легче понимание и поддержка
коллективом разработчиков
Единого стандарта для стиля программирования
не существует
20

15.

Стиль программирования
Правило: Если существует несколько способов
написания фрагмента кода, то в рамках единого
проекта или в рамках единого коллектива
разработчиков необходимо использовать один и тот
же способ
Стиль программирования в значительной степени
определяется используемыми инструментальными
средствами и методикой разработки программного
обеспечения в целом:
печатные работы по описанию языка программирования
подробные рекомендации авторов языка
используемая библиотека или API
стили отличаются в различных языках
принятые определенным сообществом стандарты
21

16.

Элементы качественного стиля
Составление комментариев
22

17.

Элементы качественного стиля
Составление комментариев
Выбор имен переменных и функций
arrayofinteger
ArrayOfInteger
array_of_integer
ArrOfInt
Snd=send
Rcv=recieve
25

18.

Элементы качественного стиля
Составление комментариев
Выбор имен переменных и функций
Оформление кода
28

19.

Элементы качественного стиля
Составление комментариев
Выбор имен переменных и функций
Оформление кода
Правила описания данных
различного типа
31

20.

Защитное программирование
Программный код:
На первый взгляд работает
Красивый код
Правильный код
Хороший код
33

21.

Защитное программирование
Код "для себя":
небольшие объемы программ, в которых можно
быстро разобраться
вы управляете всем окружением и условиями
написания кода
весь код ваш и он вам понятен
Код в организации:
обстановка непрерывно меняется
объем кода быстро растет
появляется непонятный старый код без авторов
36

22.

Готовьтесь к худшему
Нельзя предполагать, что некоторое событие никогда
не случится:
Функцию никогда не станут вызывать
неправильным способом. Ей всегда будут
передаваться только допустимые параметры
Этот фрагмент кода всегда будет работать, он
никогда не сгенерирует ошибку
Никто не станет пытаться обратиться к этой
переменной, если в документации написано, что
она предназначена только для внутреннего
употребления
Место на диске может закончится
Сетевое соединение может пропасть
37

23.

Защитное программирование
Закон Мерфи гласит: «Если какая-нибудь
неприятность может произойти, она обязательно
случится»
Допущения по использованию кода либо забудутся
вами, либо неизвестны другим
Защитное программирование – стиль написания
программного кода, призванный сделать его более
отказоустойчивым в случае возникновения
функциональных отклонений (некорректные входные
данные, повреждение данных, отказ аппаратного
обеспечения и т.п.)
Тестирование и отладка – диагностика и устранение
ошибок, защитное программирование –
профилактика ошибок
38

24.

Защитное программирование
1. Использования хорошего стиля программирования.
39

25.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
40

26.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
42

27.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
44

28.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
47

29.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
6. Не позволяйте никому лезть туда, где ему нечего
делать
49

30.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
6. Не позволяйте никому лезть туда, где ему нечего
делать
7. Максимальное использование средств компиляций
51

31.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
6. Не позволяйте никому лезть туда, где ему нечего
делать
7. Максимальное использование средств компиляций
8. Применение безопасных структур данных
53

32.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
6. Не позволяйте никому лезть туда, где ему нечего
делать
7. Максимальное использование средств компиляций
8. Применение безопасных структур данных
9. Проверка результата операции
55

33.

Защитное программирование
1. Использования хорошего стиля программирования.
2. Четкая понятная архитектура
3. Кодирование без спешки
4. Не доверяйте никому
5. Ясность лучше краткости
6. Не позволяйте никому лезть туда, где ему нечего
делать
7. Максимальное использование средств компиляций
8. Применение безопасных структур данных
9. Проверка результата операции
10. Аккуратное обращение с ресурсами
57

34.

Защитное программирование
11. Инициализация переменных
59

35.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
60

36.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
13. Использование стандартных средств языка
программирования
62

37.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
13. Использование стандартных средств языка
программирования
14. Диагностические сообщения
64

38.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
13. Использование стандартных средств языка
программирования
14. Диагностические сообщения
15. Приведение типов
66

39.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
13. Использование стандартных средств языка
программирования
14. Диагностические сообщения
15. Приведение типов
16. Построение кода
68

40.

Защитное программирование
11. Инициализация переменных
12. Объявление переменных
13. Использование стандартных средств языка
программирования
14. Диагностические сообщения
15. Приведение типов
16. Построение кода
17. Контроль ограничений
70

41.

Достоинства и недостатки
Сокращение стадий тестирования и отладки
Правильный, но медленный код предпочтительнее
кода с ошибками
Повышает безопасность обработки данных
Защита от преднамеренных действий
злоумышленников
Защита от ошибочных, непреднамеренных действий
пользователя
Снижение эффективности (быстродействия) кода –
любая дополнительная операция тратит
процессорное время
Дополнительное время программиста
74

42.

Рефакторинг кода
Рефакторинг – процесс изменения
внутренней структуры программы, не
затрагивающий её внешнего поведения, с
целью облегчения понимания работы
Рефакторинг – не оптимизация
производительности
Рефакторинг не спасет от неправильных
требований или архитектуры (ошибок)
75

43.

Признаки плохого кода и методы рефакторинга
1.
2.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
1.
Методы:
Выделение метода
76

44.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
1.
2.
Методы:
Выделение метода
Выделение класса
78

45.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
1.
2.
3.
4.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
79

46.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
5.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
Расходящиеся
модификации (2,4)
1.
2.
3.
4.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
81

47.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
5.
6.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
Расходящиеся
модификации (2,4)
Зависящие функций (1,4,5,6)
1.
2.
3.
4.
5.
6.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
82

48.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
5.
6.
7.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
Расходящиеся
модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
1.
2.
3.
4.
5.
6.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
83

49.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
5.
6.
7.
8.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
Расходящиеся
модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
Одержимость
элементарными типами (4)
1.
2.
3.
4.
5.
6.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
84

50.

Признаки плохого кода и методы рефакторинга
1.
2.
3.
4.
5.
6.
7.
8.
9.
Признаки:
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список
параметров функции (3,4)
Расходящиеся
модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
Одержимость
элементарными типами (4)
Параллельные иерархии и
наследования (5,6,7)
1.
2.
3.
4.
5.
6.
7.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
Встраивание класса
85

51.

Признаки плохого кода и методы рефакторинга
Признаки:
1.
2.
3.
4.
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список параметров функции
(3,4)
5.
6.
7.
8.
9.
10.
1.
2.
3.
Расходящиеся модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
4.
Одержимость элементарными
типами (4)
5.
Параллельные иерархии и
наследования (5,6,7)
6.
7.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
Встраивание класса
Ленивый класс и класспосредник (7)
86

52.

Признаки плохого кода и методы рефакторинга
Признаки:
1.
2.
3.
4.
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список параметров функции
(3,4)
5.
6.
7.
8.
9.
10.
11.
1.
2.
3.
Расходящиеся модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
4.
Одержимость элементарными
типами (4)
5.
Параллельные иерархии и
наследования (5,6,7)
6.
7.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
Встраивание класса
Ленивый класс и класспосредник (7)
Цепочка вызовов (1)
87

53.

Признаки плохого кода и методы рефакторинга
Признаки:
1.
2.
3.
4.
Дублирование кода (1)
Длинная процедура (1)
Большой класс (2)
Длинный список параметров функции
(3,4)
5.
6.
7.
8.
9.
10.
11.
12.
1.
2.
3.
Расходящиеся модификации (2,4)
Зависящие функций (1,4,5,6)
Группы данных (4)
4.
Одержимость элементарными
типами (4)
5.
Параллельные иерархии и
наследования (5,6,7)
Ленивый класс и класспосредник (7)
Цепочка вызовов (1)
Мертвый код (8)
6.
7.
8.
Методы:
Выделение метода
Выделение класса
Изменение параметров
функции (метода)
Объединение данных в
объект
Перемещение метода
Спуск/подъем метода
Встраивание класса
Удаление
неиспользуемого кода
88

54.

Профилирование кода
Профилирование – сбор характеристик
программы во время её выполнения
Характеристики:
время выполнения всей программы или участка кода
количество вызовов отдельных функций или строк
программы
число верно предсказанных условных переходов
Профилировщик – программа для сбора характеристик
89

55.

Профилирование кода
Результат:
Граф вызова функций
Анализ покрытия кода
Нахождение медленных участков кода
Оптимизация кода по результатам
анализа
90

56.

Проверка кода (Code Review)
Можно выделить как завершающий этап
стадии «кодирование» в ЖЦ
Проверка кода перед интеграцией в
проект
Использование механизмов СУП
(Merge Request, Issue)
Проверка более сильным разработчиком
(руководителем команды)
Элементы обучения
Реальное исправление кода без возможности
договориться
91

57.

Кодирование ПО
Лекция 10
Тема 3: Кодирование ПО
92

58.

Вопросы
1.
2.
3.
Кодирование ПО. Структурное
программирование. Принципы структурного
программирования. Теорема о структурном
программировании.
Кодирование ПО. Стиль программирования.
Элементы качественного стиля
программирования. Защитное
программирование.
Кодирование ПО. Рефакторинг и
профилирование кода.
93
English     Русский Правила