Материал: 406

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

классы данных;

несгруппированные данные. Правила рефакторинга

Обнаружив, что в программу необходимо добавить новую функциональность, но код программы не структурирован удобным для добавления этой функциональности образом, сначала произведите рефакторинг программы, чтобы упростить внесение необходимых изменений, а только потом добавьте функцию.

Перед началом рефакторинга убедитесь, что располагаете надежным комплектом тестов. Эти тесты должны быть самопроверяющимися.

При применении рефакторинга программа модифицируется небольшими шагами. Ошибку нетрудно обнаружить.

Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям.

Проблемы рефакторинга:

Потребность вносить изменения в существующий код

Необходимость строго придерживаться поставленной

задачи

Покрывать код проверочными тестами

Методы рефакторинга: Инкапсуляция поля (Encapsulate Field); Выделение класса (Extract Class); Выделение интерфейса (Extract Interface); Выделение локальной переменной (Extract Local Variable);

Выделение метода (Extract Method); Генерализация типа (Generalize Type); Встраивание (Inline); Введение фабрики (Introduce Factory);

Введение параметра (Introduce Parameter); Подъём поля/метода (Pull Up); Спуск поля/метода (Push Down); Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism);

1.4. Оптимизация кода

Вопросы для рассмотрения: Оптимизация. Алгоритм.

Прототип. Принцип Парето. Основы оптимизации. Компромиссы. Узкие места. Простейшие приёмы оптимизации программ по затратам процессорного времени. Инициализация объектов данных. Программирование арифметических операций. Циклы. Инвариантные фрагменты кода. Отложенные вычисления. Мемоизация. Оптимизирующий компилятор. Основы параллельного выполнения кода на нескольких процессорах.

Рекомендуемая литература: 1, 2.

Перечень дополнительных ресурсов: 2, перечень ресурсов в сети Интернет.

Наименование вида самостоятельной работы: изучение ли-

тературы, выполнение тестовых заданий, подготовка к лабораторным работам; выполнение контрольной работы.

Оптимизация кода - различные методы преобразования кода ради улучшения его характеристик и повышения эффективности. Она может проводиться как и вручную, программистом, так и автоматизированно.

Среди целей оптимизации можно указать уменьшения объема кода, объема используемой программой оперативной памяти, ускорение работы программы, уменьшение количества операций ввода вывода. Главное из требований, которые обычно предъявляются к методу оптимизации - оптимизированная программа должна иметь тот же результат и побочные эффекты на том же наборе входных данных, что и неоптимизированная программа.

Для оптимизации требуется найти узкое место – критическую часть кода, которая является основным потребителем необходимого ресурса. Улучшение примерно 20 % кода иногда влечёт за собой изменение 80 % результатов, согласно принципуПарето. Утечка ресурсов (памяти, дескрипторов и т. д.) также может привести к падению скорости выполнения программы. Для поиска таких утечек используются специальные отладочные инструменты, а для обнаружения узких мест применяются программы — профайлеры.

Приемы оптимизации программного кода, актуальные в настоящее время:

Инициализация объектов данных

Программирование арифметических операций

Циклы

Инвариантные фрагменты кода

При проведении оптимизации кода необходимо учитывать его мемоизацию, то есть сохранение результатов выполнения функций для предотвращения повторных вычислений. Она может использоваться не только для увеличения скорости работы программы. Например, она используется при простом взаимно-рекурсивном нисходящем синтаксическом разборе в обобщённом алгоритме нисходящего синтаксического анализа

Перед вызовом функции проверяется, вызывалась ли функция

ранее:

если не вызывалась, функция вызывается и результат её выполнения сохраняется;

если вызывалась, используется сохранённый результат.

1.5.Дебаггинг

Вопросы для рассмотрения: Отладка. Назначение и способы. Место отладки в цикле разработки программы. Инструменты отладки. Профилировщики. API логгеры. Дизассемблеры. Снифферы. Снифферы аппаратных интерфейсов. Логи. Инструменты, снижающие потребность в отладке. Контрактное программирование. Статический анализ кода. Безопасность программного кода и отладка. SQL-инъекция и переполнение буфера. Выявление недокументированного поведения системы. Устранение небезопасного кода. Статический анализ кода. Фаззинг.

Рекомендуемая литература: 1, 2.

Перечень дополнительных ресурсов: 2, перечень ресурсов в сети Интернет.

Наименование вида самостоятельной работы: изучение ли-

тературы, выполнение тестовых заданий, подготовка к лабораторным работам.

Дебаггинг или отладка— этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится:

узнавать текущие значения переменных;

выяснять, по какому пути выполнялась программа.

Существуют две взаимодополняющие технологии отладки.

Использование отладчиков — программ, которые включают

всебя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.

Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода

— на экран, принтер, громкоговоритель или в файл. Вывод отладочных сведений в файл называется журналированием.

Отладчик представляет из себя программный инструмент, позволяющий программисту наблюдать за выполнением исследуемой программы, останавливать и перезапускать её, прогонять в замедленном темпе, изменять значения в памяти и даже, в некоторых случаях, возвращать назад по времени.

Также полезными инструментами в руках программиста могут оказаться:

Профилировщики. Они позволят определить, сколько времени выполняется тот или иной участок кода. Анализ покрытия позволяет выявить неисполняемые участки кода.

API логгеры позволяют отследить взаимодействие программы и Windows API при помощи записи сообщений Windows в лог.

Дизассемблеры позволяют посмотреть ассемблерный код исполняемого файла

Снифферы помогут отследить сетевой трафик, генерируемый программой

Снифферы аппаратных интерфейсов позволяют увидеть данные, которыми обмениваются система и устройство.

Логи системы.

Использование языков программирования высокого уровня обычно уп-

рощает отладку, если такие языки содержат, например, средства обработки исключений, сильно облегчающие поиск источника проблемы. В низкоуровневых языках ошибки могут приводить к незаметным проблемам — например, повреждениям памяти и утечкам памяти. Тогда бывает довольно трудно определить, что стало первоначальной причиной ошибки. В этих случаях могут потребоваться сложные приёмы и средства отладки.

Инструменты, снижающие потребность в отладке:

Контрактное программирование — чтобы программист подтверждал другим путём, что ему на выходе нужно именно такое поведение программы. В языках, в которых контрактного программирования нет, используется самопроверка программы в ключевых точках.

Модульное тестирование — проверка поведения программы по частям.

Статический анализ кода — проверка кода на стандартные ошибки «по недосмотру».

Высокая культура программирования, в частности,

паттерны проектирования, соглашения об именовании и прозрачное поведение отдельных блоков кода — чтобы объявить себе и другим, каким образом должна вести себя та или иная функция.

Широкое использование проверенных внешних библиотек.

2.ЛАБОРАТОРНЫЕ РАБОТЫ

2.1. Лабораторная работа № 1 «Модифицирование программного кода»

Рекомендуемая литература: 2.

Перечень дополнительных ресурсов: 2 ,3, перечень ресурсов в сети Интернет.

Цель: Изучить технологию модифицирования программного

кода

Задание:

Модифицируйте 2 программы, реализованные на C++:

1 программа

#include <iostream> #include <locale.h>

using namespace std;

int main()

{

int number; setlocale(LC_CTYPE,"Russian"); cout << "Введите число: "; cin >> number;

cin.ignore();

cout << "Вы ввели: "<< number <<"\n"; cin.get();

}

Описание: пользователю предлагаеться ввести цифру, но если он введет например: b6, то ему выдаст - "Вы ввели: 5 (Только номер). Необходимо добиться, чтобы программа различала отрицательные и положительные значения, цифры и буквы, а также автоматически выдавала значение введенного числа в квадрате.

2 программа

#include <stdio.h> /* Стандартный заголовочный файл ввода-вывода */ #include <iostream> /* Библиотека (стандарт) */

#include <locale.h> /* Русификатор */ #include <windows.h> /* Русификатор */ using namespace std;