Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
406.pdf
Скачиваний:
61
Добавлен:
07.01.2021
Размер:
479.9 Кб
Скачать

Каждый класс должен иметь свою область ответственности и реализовать только операции из нее. Другие операции должны выноситься в отдельные классы.

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

Если метод слишком длинный, его стоит разделить на

несколько.

Избегать большой связности между классами. Чем больше зависимостей между классами, тем сложнее осознать поведение системы в целом и тем сложнее вносить изменения.

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

Добавлять комментарии, проясняющие реализацию алгоритма в сложных местах.

Все члены команды должны использовать единые правила оформления кода (форматирование, отступы, правила именования).

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

1.3.Рефакторинг кода

Вопросы для рассмотрения: Цели рефакторинга. Причины применения рефакторинга. Признаки плохого кода. Рефакторинг кода. Методы рефакторинга. Изменение сигнатуры метода. Инкапсуляция поля. Выделение: класса, интерфейса, локальной переменной, метода. Встраивание. Подъём метода. Спуск метода. Переименование и перемещение метода. Замена условного оператора полиморфизмом. Замена наследования делегированием. Замена кода типа подклассами. Проблемы, возникающие при проведении рефакторинга. Средства автоматизации рефакторинга.

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

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

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

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

Цель рефакторинга – сделать код программы более легким для понимания; без этого рефакторинг нельзя считать успешным.

Рефакторинг следует отличать от оптимизации производительности. Как и рефакторинг, оптимизация обычно не изменяет поведение программы, а только ускоряет её работу. Но оптимизация часто затрудняет понимание кода, что противоположно рефакторингу

Рефакторинг нужно применять постоянно при разработке кода. Основными стимулами его проведения являются следующие задачи:

необходимо добавить новую функцию, которая недостаточно укладывается в принятое архитектурное решение;

необходимо исправить ошибку, причины возникновения которой сразу не ясны;

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

Во многом при рефакторинге лучше полагаться на интуицию, основанную на опыте. Тем не менее имеются некоторые видимые проблемы в коде, требующие рефакторинга:

дублирование кода;

длинный метод;

большой класс;

длинный список параметров;

«жадные» функции — это метод, который чрезмерно обращается к данным другого объекта;

избыточные временные переменные;

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

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

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

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

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

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

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

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

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

задачи

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

Методы рефакторинга: Инкапсуляция поля (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 % результатов, согласно принципуПарето. Утечка ресурсов (памяти, дескрипторов и т. д.) также может привести к падению скорости выполнения программы. Для поиска таких утечек используются специальные отладочные инструменты, а для обнаружения узких мест применяются программы — профайлеры.

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

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

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

Циклы

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]